2016-02-26 106 views
1

我想在C++中做一個簡單的回調,但我遇到了問題,因爲我想。C++將成員函數傳遞給另一個類

基本上我想是這樣的:

class A{ 
    void A::AddCallback(void (*callBackFunction)(string)){ 
     /*Code goes here*/ 
    } 
} 

和B類

#include "A.h" 
class B{ 
    B::B(){ 
     A childObject; 
     childObject(MyCallBackFunction); 
    } 
    B::MyCallBackFunction(string arg){ 
     /*Code goes here*/ 
    } 
} 

我知道,通常你會想要的東西,如B::callBackFunction定義AddCallback的頭,但我確實需要導入AB所以我很難讓兩個類互相導入。我知道我已經看到了這一點,但我不能得到正確的語法

+0

最後一部分表明你想知道如何解決循環依賴問題;如果是這樣,請參閱這些答案的結尾:http://stackoverflow.com/a/628079/5386374&http://stackoverflow.com/a/4757718/5386374 [具體來說:如果Ah不需要知道B的內部詳細信息,在'Ah'中向前聲明'B',在'A.cpp'中''包括'Bh'',在'Bh'中''包括'Ah''。如果B.h不需要知道A,則在'B.h'中向前聲明'A',在'B.cpp'中''包括'A.h「',在'A.h'中向'#include」B.h「'聲明。或者兩者:在'B.h'中向前聲明'A',在'A.h'向前聲明'B',並在''.cpp'文件中放入'#include's。] –

回答

3

下面是一個使用靜態成員函數一個選項:

#include <string> 

struct A 
{ 
    void AddCallback(void (*cb)(std::string)); 
}; 

struct B 
{ 
    A a; 

    B() { a.AddCallback(&B::MyFun); } 

    static void MyFun(std::string); 
}; 

如果你想有一個非靜態成員函數,那麼你首先需要以決定您想要調用成員函數的哪個實例B。例如,要調用它,其構造的對象註冊回調:

#include <functional> 
#include <string> 

struct A 
{ 
    void AddCallback(std::function<void(std::string)>); 
}; 

struct B 
{ 
    A a; 

    B() { a.AddCallback(std::bind(&B::MyFun, this, std::placeholders::_1)); } 

    void MyFun(std::string); 
}; 
+0

像魅力一樣工作。泰 – Axel

-1

必須調用一個無效的addCallback ::並通過強似論點childObject(MyCallBackFunction)回調;

相關問題