【发布时间】:2013-09-10 17:42:27
【问题描述】:
我有一个回调类,在整个应用程序的某些地方使用。它是这样构造的:
struct A {
void f();
}
A * callee = new A;
Callback_0 callback = CCallback_0(callee, &A::f);
callback 现在可以存储并在以后调用。这样做的问题是,如果 callee 在回调创建和回调调用之间被破坏,程序就会崩溃(或更糟)。
目前我能想到的唯一解决方案:任何想要成为被调用者的类都必须从基类Callee 继承:
class Callee {
public:
void registerCallback(const Callback& c) {
_callbacks.push_back(c);
}
~Callee() {
std::for_each(_callbacks.begin(), _callbacks.end(), [](Callback& c){c.disable();});
}
private:
std::vector<Callback> _callbacks;
}
这种设计的缺点是我必须继承每个可能需要调用的类。有没有更好的办法? 我更喜欢 C++03 解决方案,我只有有限的 C++11 支持(受 MSVC2010 和 Mac 上的 clang 限制)。
【问题讨论】:
-
您可以要求被调用者由
shared_ptr所有权方案管理。 -
传递一个非 const 引用并将其留给用户以确保对象的生命周期怎么样?
-
@DieterLücking:我是用户。在某些情况下,我无法避免我所描述的崩溃。