0

我有 3 节课:

类A.h

ClassA
{
    public:
        ClassA();
};

B类.h

#include "ClassA.h"

classB
{
    public:
        ClassB();

    private:
        ClassA m_classA;
};

类C.h

#include "ClassB.h"

ClassC
{
    public:
        ClassC();

    private:
        ClassB m_classB;
};

ClassC 需要 ClassB,ClassB 需要 ClassA。ClassC 不需要 ClassA,所以我应该将 ClassB 标头中的 #include "ClassA.h" 放在源文件中并创建一个全局对象还是有更好的方法?

B类.cpp

#include "ClassB.h"
#include "ClassA.h"

ClassA g_classA;
4

1 回答 1

3

ClassB有一个ClassA对象,所以它的类声明需要完整的声明ClassA。所以你需要在*ClassA.h中包含标题,不管.ClassB.hClassC

如果您想避免包含标题,您可以做的是存储一个(智能)指针classA并转发声明它。那么你只需要包含classA.hclassB.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. 但最好在需要的地方包含您需要的内容,而不是依赖于间接包含。

于 2013-01-17T21:18:41.270 回答