2

我在 C++ 类(我们称之为 classA)中有一个公共方法,它定义为:

void someFunction(someOtherCppClassB* arg);

此“someFunction”方法执行以下操作:

theConnection = registerFunction(aPtrToAnInstanceOfCStruct1, boost::bind(&classA::callbackFunction, this, _1));

其中 'theConnection' 是 ClassA 中的私有成员变量,它的类型为 boost::signals2::connection

其中'callbackFunction'是classA中的私有方法,定义为:

int callbackFunction(cStruct2** doublePtr);

其中 'aPtrToAnInstanceOfCStruct1' 是指向此 C 结构实例的指针:

typedef struct cStruct1T
{
       boost::signals2::signal<int (cStruct2**)> signalVariable;
} cStruct1

cStruct2 定义为:

typedef struct cStruct2T
{
   /* Variables in this struct */
       char someDummyVariable;
} cStruct2

'registerFunction' 定义为:

boost::signals2::connection registerFunction(cStruct1* aPtrToAnInstanceOfCStruct1, boost::function<int (cStruct2**)> someCallbackFunction)
{
        /* THIS FAILS FOR SOME REASON */
        return aPtrToAnInstanceOfCStruct1->signalVariable.connect(someCallbackFunction);

}

出于某种原因,.connect() 在 Android 4.3 上生成以下内容:

F/libc(8556):致命信号 11(SIGSEGV)在 0x0000000c(代码=1),线程 8556

我无法弄清楚导致错误的原因。所以我希望有一位 Boost 专家可以查看上面的代码并告诉我我做错了什么。

谢谢你。

4

1 回答 1

1

我很抱歉,但我发现你的例子很难遵循。但由于它编译,我怀疑你可能有一个空指针,从错误代码来看。

我建议将信号代码封装在包含信号的类中,并提供一个函数来连接您的slot例如:

typedef struct cStruct1T
{
   typedef boost::signals2::signal<int (cStruct2**)> SignalTypeName;
   SignalTypeName signalVariable;

   void connectSlot(const SignalTypeName::slot_type& slot)
   { signalVariable.connect(slot); }

} cStruct1;

然后,您可以someFunction像这样在您的插槽中注册您的插槽:

aPtrToAnInstanceOfCStruct1->connectSlot(boost::bind(&classA::callbackFunction, this, _1));
于 2013-11-15T07:58:33.883 回答