国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++調試追蹤class成員變量的方法

2020-01-26 15:42:30
字體:
來源:轉載
供稿:網友

比如: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++確實復雜,但是我們如果利用好,復雜就是強大。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宝山区| 桐城市| 潮安县| 瓦房店市| 霍山县| 乳源| 宁波市| 镇远县| 汶上县| 泰安市| 平顶山市| 高密市| 南陵县| 如皋市| 沁阳市| 册亨县| 石棉县| 信丰县| 顺义区| 泉州市| 台江县| 家居| 双鸭山市| 大庆市| 太保市| 海宁市| 汪清县| 铜陵市| 曲阜市| 汉寿县| 雷州市| 宁乡县| 黑水县| 枣庄市| 容城县| 南安市| 莒南县| 松潘县| 阳山县| 桂东县| 石河子市|