我以前设法将 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。
我的问题是我现在希望处理程序在内部成员对象中注册函数。换句话说,socket 将不再调用回调,但内部类将被告知回调,它会调用它。您可能认为您可以简单地将 &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 分配一个函数时,它在 0xfffff 处给了我一个访问冲突...,这是一个相当显眼的地址。查看调用堆栈,关于赋值运算符的某些问题导致了问题,但我看不出问题出在哪里。当分配给外部类中的变量时,很容易检查相同的分配代码是否有效。我想知道 *this 是否意味着您只能在一个级别中执行此操作。