2016-02-26 75 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)回调;

相关问题