1

以前は変数に 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 についての何かがあるのだろうか。

4

1 に答える 1