这个问题无意重复" Why should I not include cpp files and instead use a header?"而且更多的是实践问题。
为了最好地解决这个问题,让我解释一下。在编写课程时,如果不是更多,它可以快速增长到几百行。出于可读性目的,我想基于每个方法将一个类分成单个文件。为了清楚起见,我并不是建议将整个项目变成一组包含,因为上面列出的帖子中提到的原因,而是将一个类分解为他们自己的文件中包含的组件。
以下代码片段说明了我的意思
#include <iostream>
#include "helloClass.h"
using namespace std;
int main()
{
hello a;
cout<<a.out();
cin.get();//just to pause execution
}
#ifndef HELLOCLASS_H
#define HELLOCLASS_H
#include <string>
class hello
{
std::string message;
public:
std::string out();
hello();
};
#endif
#include "helloClass.h"
using namespace std;
hello::hello()
{
message = "Hello World!";
};
#include "helloClassOut.cpp"
string hello::out()
{
return message;
}
这将编译正常并按预期执行。当发生错误时我发现了一个额外的好处,因为编译器不仅会告诉你什么行,还会告诉你错误所在的文件。例如我用未声明的变量编译它
$ c++ main.cpp helloClassMain.cpp -o hello
In file included from helloClassMain.cpp:8:0:
helloClassOut.cpp: In member function ‘std::string hello::out()’:
helloClassOut.cpp:3:1: error: ‘fail’ was not declared in this scope
fail="test";
我发现这至少可以说是有用的,它允许我将文件helloClassMain.cpp视为hello类及其所有方法和属性的入口点。
据我所知,由于编译器的工作原理,这与在同一个文件中写出的类完全相同。这只是一个能够更容易阅读,排除故障等问题。
最后问题。
答案 0 :(得分:4)
- 这是不好的做法吗?
醇>
通常,是的。我唯一能想到可能需要的地方是,如果你有一些方法在不同的系统(即Windows和Linux)上实现不同。如果有特定于系统的方法,您可能会做这样的事情。但除此之外,它不赞成。
- 对于那些与我合作进行项目的人来说,这会不会下地狱?
醇>
是的,因为:
#include
他们需要的定义。#include
d而非编译的.cpp文件。那是误导性的。#include
.cpp文件到另一个.cpp文件是获取命名空间冲突的好方法。也许一个.cpp文件有一个全局的静态帮助函数,它与另一个.cpp的全局静态帮助器冲突。也许你在一个文件中using namespace std;
弄乱了另一个文件。#include
,那么您可以利用并行编译。使用#include
会慢很多,因为如果你稍微更改一个方法,那么所有方法都必须进行重新处理和编译。相反,如果您分别编译每个.cpp(这是正常的事情),那么更改一个.cpp文件意味着只需要重新处理和重新编译该文件。
- 我在这里缺少一个核心概念吗?我确信我不是第一个考虑这个解决方案的人。
醇>
如果没有更具体的例子,您可能会错过single responsibility principle。你的课可能太大而且做得太多了。
此外,类表示具有状态的对象;在多个文件中传播该状态使得从概念上理解整个状态变得更加困难(如果它在同一个文件中,它可以帮助我查看和理解整个对象的状态)。我敢打赌,你会有更多的错误,因为对象的状态并不像你想象的那样一致。
- 我是否更多地询问了偏好而不是最佳做法?
醇>
这两者都有。不过,现在我们正在获取meta。
- 最后是否有一个我所描述的名字而不是坏的名字?
醇>
也许有一个技术名称,但我倾向于poisoned chalice。
答案 1 :(得分:1)
您实际上并不需要#include
一个.cpp文件。
例如,您可以在不同的.cpp文件中实现每个方法,然后单独编译它们。您将获得几个.o文件,每个文件都导出它实现的方法。链接器将完成将它们绑在一起的工作。
所以:
如果做得好,拆分实施并不是坏习惯。但不要#include
他们。
如果您记录得很好,那就不行了。例如,在.h中将方法组合在一起,并添加注释,指明他们在哪个文件中实施。
链接过程,只要符号由一个目标文件导出,就不关心符号的来源。
我不这么认为,即使它可以更接近问题(如何我拆分实现?)。
不是我知道的。