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