アプリケーション全体のいくつかの場所で使用されるコールバック クラスがあります。次のように構成されています。
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 によって制限されています)。