2016-02-26 3 views
1

Я пытаюсь сделать простой обратный вызов в C++, но у меня возникают проблемы с этим, как я хочу.C++ Передайте функцию-член другому классу

По существу я хочу что-то вроде этого:

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

А класс В

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

Я знаю, что обычно вы хотите, чтобы определить заголовок AddCallback с чем-то вроде B::callBackFunction но мне нужно import A в B, так что мне было бы неудобно иметь оба класса, импортирующих друг друга. Я знаю, что я видел это раньше, но я не могу получить синтаксис право

+0

Последняя часть предполагает, что вы хотите знать, как решать проблемы круговой зависимости; если это так, см. концы этих ответов: http://stackoverflow.com/a/628079/5386374 и http://stackoverflow.com/a/4757718/5386374 [В частности: Если Ах не нужно знать внутреннюю подробности, вперед объявить 'B' в' Ah', '#include" Bh "' в 'A.cpp', &' #include "Ah" 'в' Bh'. Если B.h не нужно знать A, переадресуйте 'A' в' B.h', '#include" A.h "' в 'B.cpp', &' #include "B.h" 'в' A.h'. Или оба: forward объявить 'A' в' B.h', переслать объявить 'B' в' A.h' и поставить '# include' в файлы '.cpp'.] –

ответ

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

Работает как очарование. Ty – Axel

-1

вы должны назвать аннулированию A :: AddCallback и передать функцию обратного вызова вместо передачи аргумента в childObject (MyCallBackFunction);

Смежные вопросы