C++ 在源文件而不是头文件中包含类
我有三门课: A.h级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:
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“全局类对象”是一个正交概念。对于特定类型的数据成员(如您所拥有的),包含类的每个实例都有其自己的包含类型实例。如果希望最小化编译时依赖关系,可以让类持有指向其他类型的(智能)指针,并在头中向前声明这些类型,而不是包括它们的头。然后在源文件中包含头文件。我将添加一个小示例。