在源文件中包含类而不是标题

时间:2013-01-17 21:15:41

标签: c++

我有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;

1 个答案:

答案 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中即可。但最好在需要的地方包含您需要的内容,而不是依赖于间接包含。