2015-01-20 40 views
1

設置一個成員函數作爲回調我有上有我想設置爲回調成員函數的類存儲功能的回調,而另一個,就像這樣:如何使用std ::綁定

using namespace std::placeholders; 

class A { 
    typedef std::function<void(int)> Callback; 
    Callback callback; 
    A() {} 
    A(Callback f) : callback(f); 
    do_something(int x) { callback(x); } 
} 

class B { 
    A a; 
    void function(int x) { printf("%d", x); } 
    B() 
    { 
     a = A(std::bind(&B::function, this, _1)); 
    } 

當我這樣做並嘗試調用回調函數時,MSVC上出現無效的函數調用錯誤。我在這裏做錯了什麼?

EDIT 2014年1月21日

正如axalo指出的那樣,有在該代碼(除了一些錯字)沒有錯誤。它編譯。但我做了一些測試,我發現了一個奇怪的現象:當我使用「捆綁」上的構造器的this指針,即

B() { a = A(std::bind(&B::function, this, _1)); } 

的this指針是不同的實際指針類的實例,而如果我這樣做:

void helper() = { a = A(std::bind(&B::function, this, _1)); } 
B() { } 

和呼叫幫手()的一個實例,我得到了正確的「這個」指針。這種行爲是否正確?我不應該相信構造函數中'this'指針的值?

謝謝。

回答

5

你的代碼,因爲它在你的問題不編譯。 但修正了一些語法錯誤後,你的代碼實際上編譯。

using namespace std::placeholders; 

class A 
{ 
public: 
    typedef std::function<void(int)> Callback; 
    Callback callback; 

    A() {} 

    A(Callback f) : callback(f) {} 

    void do_something(int x) 
    { 
     callback(x); 
    } 
}; 

class B 
{ 
    A a; 

    void function(int x) 
    { 
     printf("%d", x); 
    } 

    B() 
    { 
     a = A(std::bind(&B::function, this, _1)); 
    } 
}; 

將它與您的代碼進行比較以找出錯誤來自哪裏。

+0

你是對的......其實這些都是錯別字......我簡化了,因爲原來的代碼太複雜了。我只編譯了上面的代碼。猜猜我必須繼續尋找原始代碼,我必須忽略一些東西。非常感謝。 – 2015-01-20 21:27:53

相關問題