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。

我的问题是我现在希望处理程序在内部成员对象中注册函数。换句话说,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 是否意味着您只能在一个级别中执行此操作。

4

1 回答 1

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

那好多了。

于 2013-01-05T23:13:11.187 回答