2013-11-15 43 views
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); 

} 

For:某種原因.connect()生成在Android 4.3以下:

F/libc的(8556):致命信號11(SIGSEGV)在0x0000000c(代碼= 1),螺紋8556

我不瞭解導致錯誤的原因。所以我希望有一個Boost專家可以看看上面的代碼並告訴我我做錯了什麼。

謝謝。

回答

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)); 
+0

工作。怎樣才能在結構中聲明'connectSlot'? – user1884325

+0

我很高興聽到它爲你工作。你不需要*在結構中聲明'connectSlot'。因爲'signalVariable'是公共的,所以你可以在任何地方調用'signalVariable.connect(..)'。但是,我通常會將我的信號聲明爲私有信號,因此我必須提供一種將插槽連接到信號的方法。另外,它將信號代碼放在一起,這樣可以使維護更容易,例如,boost :: signals2就像'boost :: signals'一樣被棄用。 – kenba