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

void someFunction(someOtherCppClassB* arg);

此“someFunction”方法执行以下操作:
theConnection = registerFunction(aPtrToAnInstanceOfCStruct1, boost::bind(&classA::callbackFunction, this, _1));

其中“theConnection”是ClassA中的私有(private)成员变量,其类型为boost::signals2::connection

其中“callbackFunction”是classA中的私有(private)方法,定义为:
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专家,他们可以看一下上面的代码,并告诉我我做错了什么。

谢谢。

最佳答案

抱歉,您的榜样很难理解。但是由于它可以编译,因此我可能会根据错误代码判断您是否有一个空指针。

我建议将信号代码封装在包含信号的类中,并提供连接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));

07-28 01:04
查看更多