C ++头部包含

时间:2013-10-03 18:32:15

标签: c++ header

你好我是C++的新手,所以请耐心等待我,我headerclass,我只是想知道我是否计划制作object 1}}来自这个中的另一个类我应该在标题中包含它吗?例如

class myClass1{

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

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

3 个答案:

答案 0 :(得分:1)

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

伸展目标,以及我建议的一般经验法则是:

  

在头文件中,#include nothing,或者尽可能接近空   可能的。

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

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

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

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

  1. 如何不包含标题?
  2. 为什么不包括标题,即使有可能不包括?
  3. 按顺序:

    标头文件无需了解OtherClass的定义。只有翻译单位才有。在确定OtherClass之前,TU需要知道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
    

    main.cpp中:

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

    这里的翻译单元是main.cpp以及#includes的所有内容。整个包裹。由于您不直接编译头文件(例如,自己编译),因此标题不是翻译单元。

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

    #include "OtherClass.h"
    

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

    这显然不是现在的问题,也不是像这样的玩具程序。它后来成为一个大问题。当您尝试对基础类进行更改时,复杂的代码库。在那些时候,打破这些相互依赖变得非常困难,也许根本不可能取决于你给你的设计多少预见。这成为了一个很难学到的教训。

答案 1 :(得分:0)

是。如果oc是一个指针或一个引用,那么你只需要一个前向声明(它出现在类声明之上):

class OtherClass;

class myClass1 {
...

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

答案 2 :(得分:0)

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