0

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

class myClass1{

public:
    "constructor and methods here"
private:
    OtherClass oc;
    "other variables here"
};

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

4

3 回答 3

1

由于您说您是 C++ 新手,因此对于您的即时需求来说,这似乎有点过分。请记住,我要教给您的不是现在如何破解这个东西,而是将转移到未来项目和实际工作中的良好编码技能。

我建议的延伸目标和一般经验法则是:

在头文件中,#include 什么都没有,或者尽可能接近没有。

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

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

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

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

  1. 怎么可能不包含标题?
  2. 为什么不包含标题,即使可以不包含?

为了:

文件不需要知道任何关于OtherClass. 只有翻译单元可以。TU 需要知道 的定义OtherClass才能定义MyClass1,但这很简单。考虑:

其他类.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和它#include 的所有内容。整个包裹。由于您不直接编译头文件(例如自己编译),因此头文件不是翻译单元。

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

#include "OtherClass.h"

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

这显然不是现在的问题,或者在这样的玩具程序中。当您尝试对底层类进行更改时,它会成为一个问题,在大型和复杂的代码库中。在那些时候,打破这些相互依赖变得非常困难,甚至可能是不可能的,这取决于你对设计的深思熟虑。这成为一个非常困难的教训。

于 2013-10-03T18:53:31.443 回答
0

是的。如果 oc 是指针或引用,那么您只需一个前向声明(出现在 class 语句上方)就可以了:

class OtherClass;

class myClass1 {
...

需要 include 语句,因为编译器需要知道OtherClass要定义的细节myClass1

于 2013-10-03T18:38:19.620 回答
0

是的,包括使用#include "OtherClass.h". 如果您使用的是系统头文件或来自 STL 的东西,您将使用:#include <SomeSystemHeader>

于 2013-10-03T18:42:51.063 回答