你好我是C++
的新手,所以请耐心等待我,我header
为class
,我只是想知道我是否计划制作object
1}}来自这个中的另一个类我应该在标题中包含它吗?例如
class myClass1{
public:
"constructor and methods here"
private:
OtherClass oc;
"other variables here"
};
我知道这是一个非常简单的问题,但我似乎无法在任何地方找到答案。任何帮助,将不胜感激!
答案 0 :(得分:1)
既然你说你是C ++的新手,那对你的眼前需求来说似乎有些过分。请记住,我正在努力教你的不是现在如何破解这个东西,而是将良好的编码技能转移到未来的项目和实际工作中。
伸展目标,以及我建议的一般经验法则是:
在头文件中,#include nothing,或者尽可能接近空 可能的。
为什么呢?至少有两个原因。
首先,它会保持快速编译。这很好,但不是真正的原因。真正的原因是:
其次,它减少了模块和硬耦合之间的相互依赖性。模块之间的相互依赖是一件容易创建的事情,当它成为问题时很难打破。
与此处发布的其他答案相反,不,您不需要在此标头文件中使用#include
OtherClass
的头文件。这个断言产生了两个问题:
按顺序:
标头文件无需了解OtherClass
的定义。只有翻译单位才有。在确定OtherClass
之前,TU需要知道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;
}
这里的翻译单元是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>