C++调试追踪class成员变量的方法

时间:2021-05-20

比如:int (*foo)(int arg),记住要和另一个指针函数区分开来,类似这样:int *foo(int arg).
比如我们可以这样声明一个变量和函数:

复制代码 代码如下:
int (*pfun)(int arg)=0;
int fun(int arg); //这个函数实现随便啦,我就不写了。

如果我们想利用函数指针操作函数,就和指针变量使用一样:
复制代码 代码如下:
pfun=fun;
int result=(*pfun)(123);

对,很鸡肋也没必要。这是当然,因为我们没用在对的地方。下面我要讲的是利用一个类去call back另一个无关类的成员。

代码:

复制代码 代码如下:
#include <iostream>
using namespace std;
template<typename T,typename N>
class Functor{
public:
Functor(T *otherp,N (T::*otherfun)(N arg))
{
mp=otherp;
mfun=otherfun;
}
virtual N operator()(N arg)
{
return (*mp.*mfun)(arg);
}
private:
N (T::*mfun)(N arg);
T *mp;
};
class A{
public:
A(int a0):a(a0){}
int traced(int b)
{
cout<<"Trace a="<<a<<",b="<<b<<endl;
return 0;
}
private:
int a;
};
int main()
{
A a(10);
Functor<A,int> trace(&a,&A::traced);
trace(5);
return 0;
}

第33行把class A的成员函数地址传给了Functor的函数指针,从而能够通过Functor的成员处理A中的成员。
这里用到了对operator()的重载,可以换成别的函数处理Functor的函数指针
(不处理也行,但是函数指针很绕人,不直观),像这样:

复制代码 代码如下:
#include <iostream>
using namespace std;
template<typename T,typename N>
class Functor{
public:
Functor(T *otherp,N (T::*otherfun)(N arg))
{
mp=otherp;
mfun=otherfun;
}
virtual N out(N arg) //改动
{
return (*mp.*mfun)(arg);
}
private:
N (T::*mfun)(N arg);
T *mp;
};
class A{
public:
A(int a0):a(a0){}
int traced(int b)
{
cout<<"Trace a="<<a<<",b="<<b<<endl;
return 0;
}
private:
int a;
};
int main()
{
A a(10);
Functor<A,int> trace(&a,&A::traced);
trace.out(5); //改动
return 0;
}

C++确实复杂,但是我们如果利用好,复杂就是强大。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章