将boost :: bind函数传递给内部类时出错

时间:2013-01-05 23:09:13

标签: c++ boost

我以前设法在变量中存储了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 ...处给我一个访问冲突,这是一个相当显眼的地址。查看调用堆栈,关于赋值运算符的一些事情导致问题,但我看不出问题是什么。在分配给外部类中的变量时,检查相同的赋值代码是否有效是很容易的。我想知道是否有关于*这的内容,这意味着你只能在一个层面上做到这一点。

1 个答案:

答案 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);
}

那好多了。