C++调试追踪class成员变量的方法
C++调试追踪class成员变量的方法
发布时间:2016-12-28 来源:查字典编辑
摘要:比如:int(*foo)(intarg),记住要和另一个指针函数区分开来,类似这样:int*foo(intarg).比如我们可以这样声明一个...

比如: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++确实复杂,但是我们如果利用好,复杂就是强大。

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新C语言学习
热门C语言学习
编程开发子分类