如何实现一系列使用非静态类字段的类成员回调
How to implement series of class-member callbacks, that use non-static class fields?
我有一系列回调,对输入数据做一些工作,然后调用该系列中的下一个回调。看看这个简单的例子(每个回调以串联递增并打印值):
#include <stdio.h>
//#include <boost/bind.hpp>
//#include <boost/function.hpp>
//typedef boost::function<void (int i)> DataCallback;
typedef void (*DataCallback)(int i);
class A
{
public:
DataCallback dataCallback;
void RegisterCallback(DataCallback callback);
void Callback(int i);
};
void A::RegisterCallback(DataCallback callback)
{
dataCallback = callback;
}
void A::Callback(int i)
{
dataCallback(++i);
printf("Callback. i = %i", i);
}
int main (void)
{
A a1, a2, a3;
//a1.RegisterCallback(boost::bind(&A::Callback, &a2));
//a2.RegisterCallback(boost::bind(&A::Callback, &a3));
a1.RegisterCallback(a2.Callback);
a2.RegisterCallback(a3.Callback);
a3.Callback(1);
return 0;
}
但我有一个问题。在C++中,不能将类成员函数用作回调。据我所知,这个问题的解决方案是使回调函数成为静态的。但在这种情况下,我不能使用类内字段。为了解决这个问题,我可以提供指向类(this)的回调指针并在回调中使用它。但是,就我而言,这意味着我应该提供最低回调(a3。回调)指向 a2 和 a1 的指针。
在我的实际项目中,我有大约 6 个回调,并向第 6 个回调提供指向其他 5 个回调的指针 - 我认为这是一个坏主意。
所以,我的问题是 - 如何实现这一系列回调?
正如您在代码中看到的,我尝试使用 boost::function 和 boost::bind,但MSVS2005编译时崩溃(优化编译器已停止工作...),并在 mem_fn.hpp@318 处发出警告 C4180。这里有什么问题,这是解决我问题的最佳方法吗?
是的,我现在使用 Callback() 方法注册 ICallbackable 类,而不是回调。谢谢你的帮助。
#include <stdio.h>
class ICallbackable
{
public:
virtual void Callback(int i) = 0;
};
class A : public ICallbackable
{
public:
ICallbackable* dataCallback;
void RegisterCallback(ICallbackable* callback);
void Callback(int i);
};
void A::RegisterCallback(ICallbackable* callback)
{
dataCallback = callback;
}
void A::Callback(int i)
{
printf("Callback. i = %in", i);
if (dataCallback)
{
dataCallback->Callback(++i);
}
}
int main (void)
{
A a1, a2, a3;
a1.RegisterCallback(NULL);
a2.RegisterCallback(&a1);
a3.RegisterCallback(&a2);
a3.Callback(1);
return 0;
}
相关文章:
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 如何避免在数据结构中包含存储为字段的类?
- 如何正确实例化静态字段 tat 是另一个类对象
- 将字段(在类中)定义为引用的缺点是什么?
- C++ 每个派生类的分隔静态字段
- uninit_member:非静态类成员字段 m_cJobState.bstatus 未在此构造函数中初始化,也不在其调
- 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅地
- 如何从具有多个对象/字段的类中调用方法函数
- 使用静态方法初始化 const 类字段的做法是好是坏
- 为什么在具有引用字段的类中隐式删除复制运算符
- 使用静态类成员而不是私有字段之间的速度差异是什么?
- 类内非静态字段初始化 + 对象池 - >降低可维护性/可读性
- 从测试程序访问共享库中具有静态私有字段的类
- Const 引用字段作为类中的只读属性C++
- 构造以shared_ptr作为成员字段的类的正确语法是什么
- 如何实现一系列使用非静态类字段的类成员回调
- 如何设计具有"annotated"字段的类?
- 在Visual c++ 2010中不能使用default_random_engine字段创建类
- 这个>字段和类::字段之间的区别?
- 如何在 c++ 中将字段从类传递到函数