C++标头包含

C++ header inclusions

本文关键字:包含 C++      更新时间:2023-10-16

你好,我是C++新手,所以请耐心等待,我正在为class制作header,我只是想知道我是否打算从这个类中的另一个类中制作object,我应该将其包含在标题中吗?

例如
class myClass1{
public:
    "constructor and methods here"
private:
    OtherClass oc;
    "other variables here"
};

我知道这是一个非常简单的问题,但我似乎在任何地方都找不到答案。任何帮助将不胜感激!

既然你说你是C++的新手,这对你的即时需求来说似乎有点矫枉过正。 请记住,我现在想教你的不是如何破解这个东西,而是良好的编码技能,这些技能将转移到未来的项目和实际工作中。

我推荐的一个延伸目标和一般经验法则是:

在头文件中,不 #include 任何内容,或者几乎不执行任何内容 可能。

为什么? 至少有两个原因。

首先,它保持快速编译。 这很好,但不是真正的原因。 真正的原因是:

其次,它减少了模块和硬耦合之间的相互依赖性。 模块之间的相互依赖关系很容易创建,当它成为问题时,很难打破。

与此处发布的其他答案相反,不,您不需要在此头文件中#include OtherClass 的头文件。 这种断言产生了两个问题:

  1. 怎么可能不包含标题?
  2. 为什么不包括标题,即使有可能不这样做?

挨次:

文件不需要知道任何关于OtherClass定义的信息。 只有翻译单元这样做。 TU 需要知道OtherClass的定义,然后才能定义MyClass1,但这很简单。 考虑:

OtherClass.h:

#ifndef OTHERCLASS_H
#define OTHERCLASS_H
class OtherClass
{
};
#endif

MyClass.h:

#ifndef MYCLASS_H
#define MYCLASS_H
class MyClass
{
public:
  OtherClass mOC;
};
#endif

主.cpp:

#include <cstdlib>
#include "OtherClass.h"
#include "MyClass.h"
int main()
{
  MyClass mc;
}

这里的翻译部门是main.cpp和它 #includes 的一切。 整个包装。 由于您不直接编译头文件(例如自己(,因此头文件不是翻译单元。

建议我上面提出的建议比添加更好:

#include "OtherClass.h"

到 MyClass.h,因为它减少了两个对象之间的相互依赖性。

这显然不是现在的问题,也不是像这样的玩具程序。 以后,当您尝试对底层类进行更改时,在大型和复杂的代码库中,它就会成为一个问题。 在那些时候,打破这些相互依存关系变得非常困难,也许是不可能的,这取决于你对你的设计进行了多少深思熟虑。 这成为很难吸取的教训。

是的。如果 oc 是指针或引用,那么您只需使用前向声明(显示在类语句上方(:

class OtherClass;
class myClass1 {
...

include 语句是必需的,因为编译器需要知道OtherClass的详细信息才能定义myClass1

是的,

包括使用 #include "OtherClass.h" . 如果您使用的是系统标头或STL中的内容,则可以使用:#include <SomeSystemHeader>