我以前设法在变量中存储了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 ...处给我一个访问冲突,这是一个相当显眼的地址。查看调用堆栈,关于赋值运算符的一些事情导致问题,但我看不出问题是什么。在分配给外部类中的变量时,检查相同的赋值代码是否有效是很容易的。我想知道是否有关于*这的内容,这意味着你只能在一个层面上做到这一点。
答案 0 :(得分:1)
void OuterClass::AttachListener( const boost::function<void()> &rcb )
{
cb = rcb;
ic->AttachListener(rcb); //<------the problem is here
}
ic
是一个指针,我没有看到你为它分配内存的任何地方。这就是您在运行时遇到访问冲突错误的原因。
嗯,这并不意味着你去为它分配内存。我会建议你声明ic
,如下所示:
InnerClass ic; //it is a non-pointer member now
是非指针成员,并将其用作:
void OuterClass::AttachListener( const boost::function<void()> &rcb )
{
cb = rcb;
ic.AttachListener(rcb);
}
那好多了。