C++ C++;封头夹杂物

C++ C++;封头夹杂物,c++,header,C++,Header,您好,我是C++新手,请耐心听我说,我正在为类制作一个标题,我只想知道我是否计划在这个标题中从另一个类制作一个对象?比如说 class myClass1{ public: "constructor and methods here" private: OtherClass oc; "other variables here" }; 我知道这是一个非常简单的问题,但我似乎在任何地方都找不到答案。任何帮助都将不胜感激 是的。如果oc是指针或引用,则只需一个转发声明(显示在

您好,我是
C++
新手,请耐心听我说,我正在为
类制作一个
标题
,我只想知道我是否计划在这个标题中从另一个类制作一个
对象
?比如说

class myClass1{

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

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

是的。如果oc是指针或引用,则只需一个转发声明(显示在class语句上方)即可:


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

Yes include using
#include“OtherClass.h”
。如果你使用的是系统标题,或者是来自STL的东西,你会使用:<代码>包含“< /代码>

< p>”,因为你说C++是新的,这对你的即时需求来说可能有点过火。请记住,我想教你的不是如何马上解决这个问题,而是良好的编码技能,这些技能将转移到未来的项目和实际工作中

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

在头文件中,#不包含任何内容,或尽可能不包含任何内容 可能

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

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

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

与此处发布的其他答案相反,否,您不需要在此头文件中包含
其他类
的头文件。这一论断产生了两个问题:

  • 如何不包括标题
  • 为什么不包括标题,即使可能不包括
  • 为了:

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

    其他类别h: MyClass.h: main.cpp: 因为它减少了两个对象之间的相互依赖性


    这显然不是一个问题,现在,或在这样的玩具程序。当您尝试更改底层类时,在大型复杂的代码库中,这将成为一个问题。在那些时候,打破这些相互依赖变得非常困难,而且可能是不可能的,这取决于您对设计的预先考虑程度。这是一个非常困难的教训。

    对不起,我不能——如果我和她以外的任何人发生性关系,我妻子会很生气的。但是,是的,在代码可以定义另一个类的实例之前,您需要包含该类的定义(是的,这通常是通过包含它的头来完成的)。是的,您应该包括OtherClass的头。@AbhishekBansal:我强烈反对。@johndilling此头文件如何识别OtherClass?头不需要。只有翻译单位会这样做。我不打算投反对票,因为你没有声明它是必需的,但我不同意OP甚至应该包含标题。我不会投反对票,因为你没有声明
    \include
    是必需的,但是我不同意这个建议。这使得你的类的用户有责任知道#includes的正确顺序。如果所有类都是这样编码的,而不是处理它们自己的依赖关系,那就真的很讨厌了。@MarkkuK.:我认为这是核心包含文件的责任,或者可能是预编译头的责任。我还认为程序员应该理解他们正在使用的工具,但这可能是个人偏见。同意,他们应该理解他们正在使用的工具,但他们不需要知道,也不应该编写依赖于他们使用的类的内部工作的代码。如果“MyClass”决定对私有成员使用“AlternateClass”而不是“OtherClass”,那么您必须更改所有使用“MyClass”的代码。但如果您愿意解释的话,这可能是由您的“核心包含文件”概念处理的。@MarkkuK.:当然可以。我所从事的每一个大型项目都有一个主包含文件,由所有cpp文件共享。它的工作是为所有公共对象引入所有从属名称。这通常也扩展到其他较小的类型,如这里的
    MyClass
    ,它们可能只在系统的一小部分中需要。为此,我将创建一个头文件,比如“MyNeatoThing.h”,它以正确的顺序包含使用MyClass所需的所有内容。客户机代码只需包含这一个文件。那么,您创建了一个额外的.h文件,只是为了处理MyClass的原始.h文件可能处理的内容?
    class OtherClass;
    
    class myClass1 {
    ...
    
    #ifndef OTHERCLASS_H
    #define OTHERCLASS_H
    
    class OtherClass
    {
    };
    
    #endif
    
    #ifndef MYCLASS_H
    #define MYCLASS_H
    
    class MyClass
    {
    public:
      OtherClass mOC;
    };
    
    #endif
    
    #include <cstdlib>
    #include "OtherClass.h"
    #include "MyClass.h"
    
    int main()
    {
      MyClass mc;
    }
    
    #include "OtherClass.h"