源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2021-12-30 18:05 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C++调试追踪class成员变量的方法
比如:int (*foo)(int arg),记住要和另一个指针函数区分开来,类似这样:int *foo(int arg). 比如我们可以这样声明一个变量和函数:
[u]复制代码[/u] 代码如下:
int (*pfun)(int arg)=0; int fun(int arg);    //这个函数实现随便啦,我就不写了。
如果我们想利用函数指针操作函数,就和指针变量使用一样:
[u]复制代码[/u] 代码如下:
pfun=fun; int result=(*pfun)(123);
对,很鸡肋也没必要。这是当然,因为我们没用在对的地方。下面我要讲的是利用一个类去call back另一个无关类的成员。 代码:
[u]复制代码[/u] 代码如下:
#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的函数指针 (不处理也行,但是函数指针很绕人,不直观),像这样:
[u]复制代码[/u] 代码如下:
#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++确实复杂,但是我们如果利用好,复杂就是强大。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部