zoukankan      html  css  js  c++  java
  • C++中回调(CallBack)的使用方法(其实就是类方法指针,我觉得你的方法易用性不好,虽然原理正确)

    回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。 一般情况下, 我们使用的回调函数基本都是采用C语言风格. 这里介绍一种C++风格的回调对象方法. 采用template实现.

    [cpp] view plain copy
     
    1. template < class Class, typename ReturnType, typename Parameter >  
    2. class SingularCallBack  
    3. {  
    4.   
    5.    public:  
    6.   
    7.     typedef ReturnType (Class::*Method)(Parameter);  
    8.   
    9.     SingularCallBack(Class* _class_instance, Method _method)  
    10.     {  
    11.        //取得对象实例地址,及调用方法地址  
    12.        class_instance = _class_instance;  
    13.        method        = _method;  
    14.     };  
    15.   
    16.     ReturnType operator()(Parameter parameter)  
    17.     {  
    18.        // 调用对象方法  
    19.        return (class_instance->*method)(parameter);  
    20.     };  
    21.   
    22.     ReturnType execute(Parameter parameter)  
    23.     {  
    24.        // 调用对象方法  
    25.        return operator()(parameter);  
    26.     };  
    27.   
    28.   
    29.    private:  
    30.   
    31.     Class*  class_instance;  
    32.     Method  method;  
    33.   
    34. };  

    示例:

    以下是两个类实现.

    [cpp] view plain copy
     
    1. class A  
    2. {  
    3.   
    4.    public:  
    5.   
    6.     void output()  
    7.     {  
    8.        std::cout << "I am class A :D" << std::endl;  
    9.     };  
    10.   
    11. };  
    12.   
    13. class B  
    14. {  
    15.   
    16.    public:  
    17.   
    18.     bool methodB(A a)  
    19.     {  
    20.        a.output();  
    21.        return true;  
    22.     }  
    23.   
    24. };  

    SingularCallBack的各种调用示例:

    [cpp] view plain copy
     
    1. A a;  
    2. B b;  
    3.   
    4. SingularCallBack< B,bool,A >* cb;  
    5. cb = new SingularCallBack< B,bool,A >(&b,&B::methodB);  
    6.   
    7. if((*cb)(a))  
    8. {  
    9.    std::cout << "CallBack Fired Successfully!" << std::endl;  
    10. }  
    11. else  
    12. {  
    13.    std::cout << "CallBack Fired Unsuccessfully!" << std::endl;  
    14. }  
    [cpp] view plain copy
     
    1. A a;  
    2. B b;  
    3.   
    4. SingularCallBack< B,bool,A >* cb;  
    5. cb = new SingularCallBack< B,bool,A >(&b,&B::methodB);  
    6.   
    7. if(cb->execute(a))  
    8. {  
    9.    std::cout << "CallBack Fired Successfully!" << std::endl;  
    10. }  
    11. else  
    12. {  
    13.    std::cout << "CallBack Fired Unsuccessfully!" << std::endl;  
    14. }  
    [cpp] view plain copy
     
    1. A a;  
    2. B b;  
    3. SingularCallBack< B,bool,A >cb(&b,&B::methodB);  
    4.   
    5. if(cb(a))  
    6. {  
    7.    std::cout << "CallBack Fired Successfully!" << std::endl;  
    8. }  
    9. else  
    10. {  
    11.    std::cout << "CallBack Fired Unsuccessfully!" << std::endl;  
    12. }  
    [cpp] view plain copy
     
    1. class AClass  
    2. {  
    3.    public:  
    4.   
    5.      AClass(unsigned int _id): id(_id){};  
    6.     ~AClass(){};  
    7.   
    8.      bool AMethod(std::string str)  
    9.      {  
    10.         std::cout << "AClass[" << id << "]: " << str << std::endl;  
    11.         return true;  
    12.      };  
    13.   
    14.    private:  
    15.   
    16.     unsigned int id;  
    17.   
    18. };  
    19.   
    20.   
    21. typedef SingularCallBack < AClass, bool, std::string > ACallBack;  
    22.   
    23.   
    24. int main()  
    25. {  
    26.   
    27.    std::vector < ACallBack > callback_list;  
    28.   
    29.    AClass a1(1);  
    30.    AClass a2(2);  
    31.    AClass a3(3);  
    32.   
    33.    callback_list.push_back(ACallBack(&a1, &AClass::AMethod));  
    34.    callback_list.push_back(ACallBack(&a2, &AClass::AMethod));  
    35.    callback_list.push_back(ACallBack(&a3, &AClass::AMethod));  
    36.   
    37.    for (unsigned int i = 0; i < callback_list.size(); i++)  
    38.    {  
    39.       callback_list[i]("abc");  
    40.    }  
    41.   
    42.    for (unsigned int i = 0; i < callback_list.size(); i++)  
    43.    {  
    44.       callback_list[i].execute("abc");  
    45.    }  
    46.   
    47.    return true;  
    48.   
    49. }  

    引用:

    C++ Callback Solution 

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/force_eagle/article/details/4347329
     
    如:在事件处理线程类中调用未知的类对象的方法,线程对象只负责运行处理方法时就非常有用了。你可以下载KYLib: http://download.csdn.net/source/1538376,在KYLib类库中用到非常多的事件方法指针,可以参考学习。
     
    其实就是类方法指针,我觉得你的方法易用性不好,虽然原理正确。
    可以看一下我的&lt;如何使用类的成员方法指针?&gt;: http://blog.csdn.net/kyee/archive/2009/03/20/4009735.aspx
     
     
  • 相关阅读:
    Python记录12:迭代器+生成器+生成式
    Python记录11:叠加多个装饰器+有参装饰器
    Python记录10:模块
    Day7
    Day7
    Day7
    Day7
    Day7
    Day7
    Day7
  • 原文地址:https://www.cnblogs.com/findumars/p/8734517.html
Copyright © 2011-2022 走看看