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"