C++ 在源文件而不是头文件中包含类

C++ 在源文件而不是头文件中包含类,c++,C++,我有三门课: 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:

我有三门课:

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,所以我应该将#include“ClassA.h”放在源文件的ClassB头中,并生成一个全局对象,还是有更好的方法

类别b.cpp

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

ClassA g_classA;

ClassB
有一个
ClassA
对象,所以它的类声明需要
ClassA
的完整声明。因此,您需要在
ClassB.h
*中包含
ClassA.h
标题,而不管
ClassC
发生了什么

如果要避免包含标题,您可以存储一个指向
classA
的(智能)指针,并向前声明它。然后您只需要在
classB.cpp
中包含
classA.h
。下面是一个简单的例子:

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
};

*严格来说,
ClassA.h
可以包含在其他文件中,只要它间接包含在
ClassB.h
中。但是最好在需要的地方包含您需要的内容,而不是依赖于间接包含。

ClassB
有一个
ClassA
对象,因此它的类声明需要
ClassA
的完整声明。因此,您需要在
ClassB.h
*中包含
ClassA.h
标题,而不管
ClassC
发生了什么

如果要避免包含标题,您可以存储一个指向
classA
的(智能)指针,并向前声明它。然后您只需要在
classB.cpp
中包含
classA.h
。下面是一个简单的例子:

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
};

*严格来说,
ClassA.h
可以包含在其他文件中,只要它间接包含在
ClassB.h
中。但最好在需要的地方包含所需内容,而不要依赖间接包含。

@Rapptz正向声明不声明完整类型,他没有使用指针。@Nick I似乎误解了问题。@Rapptz正向声明不声明完整类型,他没有使用指针。@Nick我似乎误读了这个问题。对于编写的代码来说绝对正确,但是。。。您可以使用pimpl来打破依赖关系。在
ClassB.h
之前包含
ClassA.h
与将其包含在
ClassB.h
中一样有效。这可能是一个很好的建议,但这不是唯一的方法。@MarkRansom True,我在上面添加了一个脚注。如果您正在处理一个大型项目,并且ClassB开始变大,并且包含了多个类,那么您还会在ClassB的头中包含所有这些头并在那里创建对象吗。或者将头包含在ClassB的源文件中,生成全局类对象并跳过头声明?@JamesMoore“全局类对象”是一个正交概念。对于特定类型的数据成员(如您所拥有的),包含类的每个实例都有其自己的包含类型实例。如果希望最小化编译时依赖关系,可以让类持有指向其他类型的(智能)指针,并在头中向前声明这些类型,而不是包括它们的头。然后在源文件中包含头文件。我将添加一个小示例。对于编写的代码来说绝对正确,但是。。。您可以使用pimpl来打破依赖关系。在
ClassB.h
之前包含
ClassA.h
与将其包含在
ClassB.h
中一样有效。这可能是一个很好的建议,但这不是唯一的方法。@MarkRansom True,我在上面添加了一个脚注。如果您正在处理一个大型项目,并且ClassB开始变大,并且包含了多个类,那么您还会在ClassB的头中包含所有这些头并在那里创建对象吗。或者将头包含在ClassB的源文件中,生成全局类对象并跳过头声明?@JamesMoore“全局类对象”是一个正交概念。对于特定类型的数据成员(如您所拥有的),包含类的每个实例都有其自己的包含类型实例。如果希望最小化编译时依赖关系,可以让类持有指向其他类型的(智能)指针,并在头中向前声明这些类型,而不是包括它们的头。然后在源文件中包含头文件。我将添加一个小示例。