C++:在头文件中包含一个类定义
C++: including a class definition in a header file
许多帖子都非常坚决地认为源代码不应该放在头中,头文件应该保持在最低限度。我一直用自己的代码来坚持这一点,但我想使用其他人的代码来实现特定的目标(这里记录了代码http://ftp.arl.mil/random/)。
我注意到,这基本上是一个定义类的巨大头文件。可以将其保留在头文件中吗?我是否应该将其全部复制到.cpp文件中,并创建一个只声明函数、结构等的新.h?
如果我按照我的建议将其拆分为.cpp和.h,它会起作用吗?或者类需要在头中才能被所有源代码访问吗?
需要在多个cpp文件中看到的声明(声明存在某种东西)应该放在头文件中。单个cpp文件的本地声明应该在cpp文件本身中。
定义(提供函数体或分配/初始化变量)通常应该放在cpp文件中,但并不总是这样。
您需要理解的问题是,如果编译器看到的是头文件而不是相应的cpp文件,那么它是否有足够的信息来完成它的工作。
例如:如果编译器已经看到声明(方法原型),则可以调用方法——除非该方法是泛型的(模板化方法或模板化类的成员)或内联的,在这种情况下,编译器也需要看到定义(方法体)。
因此,普通方法在cpp文件中;模板化方法位于头文件中;内联方法位于头文件中(依此类推)。
在其他情况下,定义属于头文件,包括静态成员常量。这一切都回到了一方面为编译器提供所需的信息,另一方面最小化独立可编译单元之间的耦合。同样,这里没有硬性规定,只有指导原则以及编写代码的开发人员的知识和经验。
.h文件通常在多个.cpp文件之间共享。全局变量和函数代码不应该在头文件中,因为它会在链接过程中产生重复。
常量、定义、函数头和类声明在头文件中都很好。您不必多次声明同一个东西,并且可以在.cpp文件之间共享定义。
源代码不应该放在头中,并且头文件应该保持在最低限度。
这是一个流行的断言,虽然它通常不是糟糕的建议,但你不应该从中得出绝对的结论。有时标题应该是最小的,不包括定义。有时情况恰恰相反。你为什么会这样或那样做是有原因的,但"人们说"不是其中之一。
考虑一下C++标准库。更好的是,考虑Boost。一些著名的C++专家说Boost是历史上设计最完善的C++库。但如果你看看这些库,你会发现它们在很大程度上只是巨大的头文件。这与"他们"所说的如何协调?
重点是:你必须了解某些文件设计成这样的原因,并对每种情况下的对错做出自己的决定。
我是否应该将其全部复制到.cpp文件并创建一个新的.h声明函数、结构等?
我想说可能不会。对我来说,这听起来像是一个维护噩梦的配方。按照图书馆作者的意愿使用第三方图书馆是我的第一本能。这样,你就不会脱离支持网格,也不会引入一系列新的复杂情况,你将完全依靠自己来解决。除非你有一个具体的、可证明的理由来改变库的架构,否则不要。"他们说"对我来说不是一个足够好的理由。
- (Wix 安装程序)如何包含自定义操作依赖项
- 在Visual Studio代码中包含自定义c++库的问题
- 如何在 RANSAC 平面估算器中包含自定义约束/排名?
- 搜索字符串是否至少包含一次从 0 到 9 的所有数字的最有效方法
- 如何在包含自定义对象的容器中使用分区函数C++
- 至少包含一次字符 X 的 S 的不同子字符串的数量
- C 发布的矢量包含自定义类的内存
- C++包含一组对象的类
- 如何比较/排序包含自定义 typedef 的列表容器的元素
- 将包含自定义项的部分添加到类文档中
- C++中包含函数定义的内容
- C++预处理器包含并定义多个文件的故障
- C++:如何在包含用户定义结构的两个向量上使用set_intersection
- 是否同时(i--) s+= a[i];在 C 和 C++ 中包含未定义的行为
- c++类包含未定义的引用
- C++ 不能在包含自定义结构的列表中使用push_back
- 如何在 Linux 的C++文件中包含自定义头文件
- 我想在C++项目中包含一种脚本语言.Lua vs Bison/Yacc
- 为什么我可以在多个包含const int的cpp文件中包含一个头文件,而不会出现编译器错误
- boost sharedmemory deque容器包含自定义类