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

 更新时间:2013年11月15日 15:00:47   作者:  
本文所讲的是不通过修改一个class的成员,就能够追踪其成员。方法就是类似C语言中的函数指针

比如: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++中stack、queue、vector的用法详解

    C++中stack、queue、vector的用法详解

    本文通过实例代码给大家介绍了C++中stack、queue、vector的用法,需要的朋友参考下吧
    2017-08-08
  • C/C++实现经典象棋游戏的示例代码

    C/C++实现经典象棋游戏的示例代码

    中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史。本文将利用C++实现这一经典游戏,快跟随小编一起学习一下吧
    2022-06-06
  • C语言实现简单电子通讯录

    C语言实现简单电子通讯录

    这篇文章主要为大家详细介绍了C语言实现简单电子通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • C++定时器实现和时间轮介绍

    C++定时器实现和时间轮介绍

    这篇文章主要介绍了C++定时器实现和时间轮介绍,定时器可以由很多种数据结构实现,比如最小堆、红黑树、跳表、甚至数组都可以,其本质都是拿到最小时间的任务,然后取出该任务并执行,更多相关内容介绍,需要的小伙伴可以参考一下
    2022-09-09
  • C++ LeetCode1769移动所有球到每个盒子最小操作数示例

    C++ LeetCode1769移动所有球到每个盒子最小操作数示例

    这篇文章主要为大家介绍了C++ LeetCode1769移动所有球到每个盒子所需最小操作数示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • C程序读取键盘码的方法

    C程序读取键盘码的方法

    这篇文章主要介绍了C程序读取键盘码的方法,运行时可通过键盘按键获取其对应的键盘码,文章最后附带了键盘码与按键的对照表,需要的朋友可以参考下
    2014-09-09
  • Qt的qDebug使用小结

    Qt的qDebug使用小结

    使用qDebug()函数它可以把调试信息直接输出到控制台上,本文就来介绍一下qDebug的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-06-06
  • 一篇文章带你了解C语言操作符

    一篇文章带你了解C语言操作符

    指令系统的每一条指令都有一个操作符,它表示该指令应进行什么样性质的操作,不同的指令用操作符这个字段的不同编码来表示,每个编码代表一种指令,这篇文章主要给大家介绍了关于C语言中操作符的相关资料,需要的朋友可以参考下
    2021-08-08
  • C语言构建动态数组完整实例

    C语言构建动态数组完整实例

    这篇文章主要介绍了C语言构建动态数组完整实例,帮助读者加深对C语言数组及指针的理解,需要的朋友可以参考下
    2014-07-07
  • C语言实现2048游戏(ege图形库版)

    C语言实现2048游戏(ege图形库版)

    这篇文章主要为大家详细介绍了C语言实现2048游戏,ege图形库版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12

最新评论