如何使用C/C++创建回调函数
How to create a Callback function by Using C/C++
C:\C++是否支持回调函数机制?以及如何创建它?我写了几段代码,用C++创建回调函数,但失败了。。
#include<iostream>
using namespace std;
void callee()
{
printf("calleen");
printf("calleeeeeeeeeen");
}
void callback(void* func)
{
printf("callbackn");
}
int main()
{
void (*call)(void*);
void (*call2)(void);
call2 = &callee;
call = &callback;
call((void*)call2);
getchar();
return 0;
}
我不懂C++,我写了一些C代码,希望它能帮助
#include <stdio.h>
void call( int, void ( *f )( int ) );
void called( int );
int main( int argc, char const *argv[] ){
printf( "startn" );
call( 1, called );
printf( "endn" );
getchar();
return 0;
}
void call( int a, void ( *f )( int ) ){
printf( "doing stuffn" );
printf( "a: %dn", a );
printf( "going to call backn" );
f( a * 2 );
}
void called( int b ){
printf( "b: %dn", b );
printf( "b*2: %dn", b*2 );
printf( "call back function being calledn" );
}
调用函数中的回调函数只不过是拥有一个函数指针,并在完成计划工作时调用该函数。
我修改了代码,使其更加清晰,以显示如何使用回调
如果你编译并运行它,这就是你将看到的结果:
start
doing stuff
a: 1
going to call back
b: 2
b*2: 4
call back function being called
end
好吧,要么是作者编辑了这个问题,要么是有人为他编辑了它,不再有C标签了。如果您不想看到纯C代码,请忽略此答案。我只想把它留在这里,以防有人感兴趣
好吧,您从未调用过"callee"-您用"call(void*)call2);"执行了"callback",但为了执行您的"被调用者"函数,您需要在"callback"函数。在这里,这个工作:
#include <iostream>
#include <stdio.h>
using namespace std;
void callee()
{
printf("calleen");
printf("calleeeeeeeeeen");
}
void callback(void* func)
{
void (*mCallbackFunc)(void);
printf("callbackn");
mCallbackFunc = (void(*)())func;
mCallbackFunc();
}
int main()
{
void (*call)(void*);
void (*call2)(void);
call2 = &callee;
call = &callback;
call((void*)call2);
return 0;
}
输出:
callback
callee
calleeeeeeeeee
下面是一个使用接口回调的示例。
//listener observer design pattern
class MonitoringElements{
public:
//information to monitor
};
class ICondition{
public:
virtual ~ICondition(){}
virtual bool didTrigger(const MonitoringElements& current) = 0;
virtual void risingEdge() = 0;
};
class MonitorManager final{
public:
void addCondition(ICondition* condition){
m_conditions.push_back(condition);
}
//constantly monitoring every x seconds
void monitorOnce(){
update();
for(int i = 0; i < m_conditions.size(); ++i)
if(m_conditions.at(i)->didTrigger(m_monitorElements)){
m_conditions.at(i)->risingEdge();
}
}
private:
void update(){
//read sensor values here
//update m_monitorElements;
}
MonitoringElements m_monitorElements;
std::vector<ICondition*> m_conditions;
};
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 如何创建 IOUSBHostPipe::CompleteAsyncIO 回调?
- 如何为Python Swigged C++对象创建和分配回调函数
- C :创建正确类型的回调函数
- 用STD ::函数作为集体成员创建回调
- 如何使用iOS上的JavaScriptCore创建从JavaScript调用的C 回调
- 尝试创建回调时出错
- 在MSVC Windows表单中使用DLL中创建回调
- hiredis Redis 库是否为异步回调创建了自己的线程
- 删除 new 在回调函数中创建的指针
- 创建一个注册回调的抽象基类的正确方法
- 如何从c# /创建回调.. NET通过COM转换为c++
- 创建一个回调结构传递给LuaJIT FFI
- 在c++库中创建回调函数
- 如何使用C/C++创建回调函数
- C++,Qt,QtWebKit:如何创建一个html呈现窗口,以便您的应用程序从JS调用中获得回调
- C++,win32api:如何创建一个html呈现窗口,以便您的应用程序从JS调用中获得回调