以前は変数に boost::bind 関数を格納して、後で必要に応じて関数を呼び出すことができました。それは非常に簡単です。次のようにするだけです。
//Caller, note the Accepthandler function is specified here
mysocket->RegisterAcceptHandler(boost::bind(&AcceptHandler,_1,_2));
//Registration function, a member of the socket class. cnctCallBack is a typedef to a boost:function
void mynamespace::socket::RegisterAcceptHandler( const cnctCallBack &cb )
{
connectCallBack = cb;
}
適切な引数を使用して、好きなように connectCallBack を呼び出します。
私の問題は、ハンドラーが関数を内部メンバーオブジェクトに登録するようにしたいということです。つまり、ソケットはコールバックを呼び出さなくなりますが、内部クラスはコールバックについて通知され、それを呼び出します。内部クラスの関数に &cb を割り当てるだけでよいと思われるかもしれませんが、実際にはそうではありません。
typedef boost::function<void()> recCB;
class InnerClass{
public:
void AttachListener(const recCB &rcb);
void RunListener();
private:
boost::function<void()> callback;
};
void InnerClass::AttachListener( const boost::function<void()> &rcb )
{
callback = rcb;
}
void InnerClass::RunListener()
{
callback();
}
class OuterClass{
public:
void AttachListener(const boost::function<void()> &rcb);
void RunListener();
private:
InnerClass * ic;
boost::function<void()> cb;
};
void OuterClass::AttachListener( const boost::function<void()> &rcb )
{
cb = rcb;
ic->AttachListener(rcb);
}
void OuterClass::RunListener()
{
cb();
ic->RunListener();
}
外部クラスを実行し、OuterClass.AttachListener を使用して関数を割り当てようとすると、0xffffff... でアクセス違反が発生します。これはかなり目立つアドレスです。コール スタックを見ると、代入演算子に関する何かが問題を引き起こしていますが、何が問題なのかわかりません。外部クラスの変数に割り当てるときに同じ割り当てコードが機能することを確認するのは簡単です。これは 1 つのレベルでしか実行できないことを意味する *this についての何かがあるのだろうか。