我试图做一个类A的准系统示例,它通过向自身传递引用为依赖类B提供回调方法。我生产的最好的是:
#ifndef A_H
#define A_H
#include "b.h"
namespace b {
class ClassB;
}
namespace a {
class ClassA {
public:
ClassA();
b::ClassB* m_b;
void callback(const std::string& msg);
};
}
#endif
#include "a.h"
a::ClassA::ClassA() {
m_b = new b::ClassB(this);
}
void a::ClassA::callback(const std::string& msg) {
std::cout << msg << '\n';
}
int main(void)
{
a::ClassA* doit = new a::ClassA();
delete doit;
return 0;
}
#ifndef B_H
#define B_H
#include <iostream>
#include <string>
namespace a {
class ClassA;
}
namespace b {
class ClassB{
public:
ClassB(a::ClassA* a_inst);
};
}
#endif
#include "b.h"
namespace b {
ClassB::ClassB(a::ClassA* a_inst) {
a_inst->callback("Call me maybe");
}
}
这是我可以接近编辑的最接近的,但我还是留下了以下错误:
b.cc: In constructor 'b::ClassB::ClassB(a::ClassA*)':
b.cc:6:9: error: invalid use of incomplete type 'struct a::ClassA'
b.h:8:8: error: forward declaration of 'struct a::ClassA'
我该如何解决这个问题?是否有更好的方法来建立这种关系?
答案 0 :(得分:1)
在您的文件b.cc
中,您必须包含a.h
。
在.h文件中,由于包含多个,但由于不包含.cc
文件,因此它们可以包含他们想要的任何内容。
注意:
您不应在a.h
文件中转发声明b,因为它已在b.h
中声明并且您已将其包含在内。
如@chris所述,您也可以删除#include "b.h"
中的a.h
并将其放入a.cc
。