欢迎使用CSDN-markdown编辑器

来源:互联网 发布:登陆淘宝账户 编辑:程序博客网 时间:2024/05/19 03:22

C++类成员函数作为回调函数

已有甚多开发者为之大做文章。大为“你使用静态函数就行了”“WOC想用类成员回调就TM别用C++”罢了。

首先,使用静态函数之方法需传递this指针,故此非真实之回调。回调者必先知this对象。

其次,强制转换( 例如void (*fp)() (a.Destory); )亦不可。因为类成员函数暗藏一this指针。

C++11 者新加入一”bind”函数,可根据指定调用方式生成新可调用物件。使用方法如下。

auto f=bind(可调用物件,参数1,2,3,...);

不知各位可有C++ primer一书。书中有云——成员函数之this指针于bind中即可为第一参数

故可以此:

#include <iostream>#include <memory>#include <functional>using namespace std;using namespace std::placeholders;class GameObject{public:    function<void()> OC_CB=nullptr;    void Destory(){        cout<<"Destory"<<endl;    }    void Create(){        cout<<"Creating..."<<endl;        if(OC_CB!=nullptr){            OC_CB();        }    }};int main(){    GameObject a;    GameObject b;    auto f=bind(&GameObject::Destory,_1);    f(&a);}

即获得有一参数之函数。其参数,即为this。
再优化main:

int main(){    cout << "Hello world!" << endl;    GameObject a;    GameObject b;    b.OC_CB=bind(&GameObject::Destory,a);    a.Create();    b.Create();    return 0;}

输出结果:

Hello world!
Creating…
Creating…
Destory


此 C++中类成员函数回调之实现也。

原创粉丝点击