Unix/C/C++--回调

1 介绍

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
理解:将顶层的函数注册给底层的函数,当底层函数被调用时,能回调到顶层函数。

2 理解

老师让学生改试卷。

  • 改试卷
  • 学生改试卷 : 改试卷对象
  • 老师改试卷 : public 改试卷
#include <iostream>
#include <string.h>

class ReviewCallBack 
{
public:
    virtual void Review() = 0;
};

class Student
{
public:
    void ToReview()
    {
        m_pcallBack->Review();
    }
    void SetCallBack(ReviewCallBack *pcallBack)
    {
        m_pcallBack = pcallBack;
    }

    ReviewCallBack *m_pcallBack;
};

class Teacher : public ReviewCallBack
{
public:
    Teacher()
    {
        student.SetCallBack(this);
    }
    void Review()
    {
        std::cout << "teacher review" << std::endl;
    }
    void ToReview()
    {
         student.ToReview();
    }
    
    Student student;
};

int main()
{
     Teacher teacher;
     teacher.ToReview();
}

3 示例

3.1 借助接口类实现回调

#include <iostream>
#include <string>
#include <sigc++/sigc++.h>

class Printer :public sigc::trackable
{
public:
   void Work(){slot.emit("work\n");}    
   typedef sigc::signal<void, const std::string&> Slot;
   Slot slot;             
   void Print(const std::string& str){std::cout<<str;}   
}; 
  
int main()
{
   Printer printer; 
   Printer::Slot::iterator iter = printer.slot.connect(sigc::mem_fun(&printer,&Printer::Print));
   printer.Work();
   iter->disconnect();
   printer.Work();
   
   system("pause");
   return 0;
}

3.2 类之间调用

C++ 类之间的互相调用

  • 两个无关类
#include <iostream>
#include <string.h>

class UIcallBack
{
public:
    virtual void onAppActivated() = 0;
    virtual void onShowMore() = 0;
};

class UIManager
{
public:
    UIManager() {}
    ~UIManager() {}

    void setCallBack(UIcallBack *pcallBack)
    {
        m_pcallBack = pcallBack;
    }

    UIcallBack *m_pcallBack;
};

class AppManager : public UIcallBack
{
public:
    AppManager() {}
    ~AppManager() {}
    void onAppActivated();
    void onShowMore();
    UIManager uiManager;
};

void AppManager::onAppActivated()
{
   ; 
}

void AppManager::onShowMore()
{
    std::cout << "show\n" << std::endl;
}

int main()
{
    AppManager app;
    UIManager ui;
    ui.setCallBack(&app);
    ui.m_pcallBack->onShowMore();
}
  • 相关类,其中一个类包含另一个类的对象
#include <iostream>
#include <string.h>

class DataCallBack 
{
public:
    virtual void UpdatePoseData() = 0;
};

class DataManage
{
public:
    void Test()
    {
        m_pcallBack->UpdatePoseData();
    }
    void SetCallBack(DataCallBack *pcallBack)
    {
        m_pcallBack = pcallBack;
    }

    DataCallBack *m_pcallBack;
};

class QmlUI : public DataCallBack
{
public:
    QmlUI()
    {
        dataManage.SetCallBack(this);
    }
    void UpdatePoseData()
    {
        std::cout << "666" << std::endl;
    }
    void Test()
    {
         dataManage.Test();
    }
    
    DataManage dataManage;
};

int main()
{
     QmlUI qmlUI;
     qmlUI.Test();
}

3.3 C接口回调C++

Trans-callback-demo.tar.gz

参考

1、C++ 类之间的互相调用
2、回调函数实现类似QT中信号机制
3、c++两个类相互调用需要注意的问题
4、Unix/C+±-libsigc++深入理解
5、C++ 回调函数理解–good
6、回调函数–百科
7、Trans-callback-demo.tar.gz

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读