C++标头包含
C++ header inclusions
你好,我是C++
新手,所以请耐心等待,我正在为class
制作header
,我只是想知道我是否打算从这个类中的另一个类中制作object
,我应该将其包含在标题中吗?
class myClass1{
public:
"constructor and methods here"
private:
OtherClass oc;
"other variables here"
};
我知道这是一个非常简单的问题,但我似乎在任何地方都找不到答案。任何帮助将不胜感激!
既然你说你是C++的新手,这对你的即时需求来说似乎有点矫枉过正。 请记住,我现在想教你的不是如何破解这个东西,而是良好的编码技能,这些技能将转移到未来的项目和实际工作中。
我推荐的一个延伸目标和一般经验法则是:
在头文件中,不 #include 任何内容,或者几乎不执行任何内容 可能。
为什么? 至少有两个原因。
首先,它保持快速编译。 这很好,但不是真正的原因。 真正的原因是:
其次,它减少了模块和硬耦合之间的相互依赖性。 模块之间的相互依赖关系很容易创建,当它成为问题时,很难打破。
与此处发布的其他答案相反,不,您不需要在此头文件中#include
OtherClass
的头文件。 这种断言产生了两个问题:
- 怎么可能不包含标题?
- 为什么不包括标题,即使有可能不这样做?
挨次:
头文件不需要知道任何关于OtherClass
定义的信息。 只有翻译单元这样做。 TU 需要知道OtherClass
的定义,然后才能定义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
主.cpp:
#include <cstdlib>
#include "OtherClass.h"
#include "MyClass.h"
int main()
{
MyClass mc;
}
这里的翻译部门是main.cpp
和它 #includes 的一切。 整个包装。 由于您不直接编译头文件(例如自己(,因此头文件不是翻译单元。
建议我上面提出的建议比添加更好:
#include "OtherClass.h"
到 MyClass.h,因为它减少了两个对象之间的相互依赖性。
这显然不是现在的问题,也不是像这样的玩具程序。 以后,当您尝试对底层类进行更改时,在大型和复杂的代码库中,它就会成为一个问题。 在那些时候,打破这些相互依存关系变得非常困难,也许是不可能的,这取决于你对你的设计进行了多少深思熟虑。 这成为很难吸取的教训。
是的。如果 oc 是指针或引用,那么您只需使用前向声明(显示在类语句上方(:
class OtherClass;
class myClass1 {
...
include 语句是必需的,因为编译器需要知道OtherClass
的详细信息才能定义myClass1
。
包括使用 #include "OtherClass.h"
. 如果您使用的是系统标头或STL中的内容,则可以使用:#include <SomeSystemHeader>
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 编译包含字符串的代码时遇到问题
- c++库的公共头文件中应该包含什么
- 将包含C样式数组的对象初始化为成员变量(C++)
- 是否需要删除包含对象的"pair"?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 使用mongocxx驱动程序时包含头文件问题
- 如何在h文件中包含.o对象文件
- 在混合代码库中将C转换为C++时出现许多包含错误
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中
- 为什么您需要C++头文件的包含保护
- 无法在UE4中包含BP类到CPP类
- g++ 说函数不存在,即使包含正确的标头
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- Visual C++GC接口如何启用它以及要包含哪个库
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)