簡體   English   中英

升壓信號:連接失敗

[英]Boost signals : Connect fails

我在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專家,他們可以看一下上面的代碼,並告訴我我做錯了什么。

謝謝。

抱歉,您的榜樣很難理解。 但是由於它可以編譯,因此我可能會根據錯誤代碼判斷您是否有一個空指針。

我建議將信號代碼封裝在包含信號的類中,並提供連接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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM