我如何克服这个前向声明错误?
How do I get over this forward declaration error?
我正在尝试做一个 class A 的准系统示例,它通过传递对自身的引用向依赖的 class B 提供回调方法。我制作的最好的是:
a.h
#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
a.cc
#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;
}
b.h
#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
b.cc
#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'
我该如何解决这个问题?有没有更好的方法来构建这种关系?
在您的文件 b.cc
中,您必须包含 a.h
。
在 .h 文件中你不能因为多重包含但是因为 .cc
文件没有被包含,它们可以包含他们想要的任何东西。
注:
您不应在 a.h
文件中转发 declare b,因为它已在 b.h
中声明并且您包含了它。
如@chris 所述,您也可以删除 a.h
中的 #include "b.h"
并将其放入 a.cc
.
我正在尝试做一个 class A 的准系统示例,它通过传递对自身的引用向依赖的 class B 提供回调方法。我制作的最好的是:
a.h
#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
a.cc
#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;
}
b.h
#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
b.cc
#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'
我该如何解决这个问题?有没有更好的方法来构建这种关系?
在您的文件 b.cc
中,您必须包含 a.h
。
在 .h 文件中你不能因为多重包含但是因为 .cc
文件没有被包含,它们可以包含他们想要的任何东西。
注:
您不应在 a.h
文件中转发 declare b,因为它已在 b.h
中声明并且您包含了它。
如@chris 所述,您也可以删除 a.h
中的 #include "b.h"
并将其放入 a.cc
.