我有3个班级:
ClassA.h
ClassA
{
public:
ClassA();
};
ClassB.h
#include "ClassA.h"
classB
{
public:
ClassB();
private:
ClassA m_classA;
};
ClassC.h
#include "ClassB.h"
ClassC
{
public:
ClassC();
private:
ClassB m_classB;
};
ClassC需要ClassB和ClassB需要ClassA。 ClassC不需要ClassA所以我应该把#Blude“ClassA.h”放在源文件中的ClassB头内并创建一个全局对象还是有更好的方法?
ClassB.cpp
#include "ClassB.h"
#include "ClassA.h"
ClassA g_classA;
答案 0 :(得分:3)
ClassB
有一个ClassA
对象,因此它的类声明需要ClassA
的完整声明。因此,无论ClassA.h
发生什么情况,您都需要在ClassB.h
* 中加入ClassC
标头。
如果你想避免包含标题你可以做的是存储一个(智能)指针classA
并转发声明它。然后,您只需在classA.h
中加入classB.cpp
即可。这是一个简单的例子:
A.h
中的
class A {};
B.h
中的
#include <unique_ptr>
class A; // forward declaration of A
class B {
public:
B();
private:
std::unique_ptr<A> a_; // C++11 smart pointer expressing unique ownership
};
B.cpp
中的
#include "B.h"
#include "A.h" // we need the full declaration here.
B::B() : a_(new A()) {}
*严格来说,ClassA.h
可以包含在其他文件中,只要它间接包含在ClassB.h
中即可。但最好在需要的地方包含您需要的内容,而不是依赖于间接包含。