我有3个类,它们之间有怪异的相互依赖关系,但是这些类中有2个在单个头文件中,所以我想将它们分开。
该代码有效,但是仅当在类B的头中声明了类C时。
我在A.hpp中拥有A类,在A.cpp中具有实现
//A.hpp
#pragma once
#include <vector>
#include "b.hpp"
#include "c.hpp" //empty at the moment
class B;
class C;
class A {
std::vector<B> b;
std::vector<C> c;
}
这是B.hpp,其中包含B类和C类(B的实现在B.cpp中)
///B.hpp
#pragma once
#include "a.hpp"
class A;
class B {
A& a; //reference declared to an incomplete type, OK
}
class C {
B b; //b can be declared of type B because it was defined in this header
}
这是问题所在: 我试图将C类分离为C.hpp,并向B进行向前声明
//C.hpp
#pragma once
#include "B.hpp"
class B;
class C {
B b; //error: incomplete type
}
但是编译器不允许我声明B类型的b,因为它不完整。 如果我不使用前向声明而将其保留:
//C.hpp
#pragma once
#include "B.hpp"
class C {
B b; //error: B does not name a type
}
由于不包含B.hpp,因此无法定义B,我不明白。
是否可以将类C分为自己的标头? 还是使用指针是我唯一的选择?
//C.hpp
#pragma once
#include "B.hpp"
class B;
class C {
B* b; //pointer to class with incomplete type, OK
}