为什么不使用cpp文件包含类?

时间:2015-02-21 18:04:20

标签: c++

这个问题无意重复" Why should I not include cpp files and instead use a header?"而且更多的是实践问题。

为了最好地解决这个问题,让我解释一下。在编写课程时,如果不是更多,它可以快速增长到几百行。出于可读性目的,我想基于每个方法将一个类分成单个文件。为了清楚起见,我并不是建议将整个项目变成一组包含,因为上面列出的帖子中提到的原因,而是将一个类分解为他们自己的文件中包含的组件。

以下代码片段说明了我的意思

的main.cpp

#include <iostream>
#include "helloClass.h"
using namespace std;

int main()
 {
         hello a;
         cout<<a.out();
         cin.get();//just to pause execution
 }

helloClass.h

#ifndef HELLOCLASS_H
#define HELLOCLASS_H
#include <string>
class hello
{
std::string  message;

public:
std::string out();
hello();
};

#endif

helloClassMain.cpp

#include "helloClass.h"     
using namespace std;        
hello::hello()              
{                           
   message = "Hello World!";   
};                          

#include "helloClassOut.cpp"

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类及其所有方法和属性的入口点。

据我所知,由于编译器的工作原理,这与在同一个文件中写出的类完全相同。这只是一个能够更容易阅读,排除故障等问题。

最后问题。

  1. 这是不好的做法吗?
  2. 对于那些与我合作进行项目的人来说,这会不会下地狱?
  3. 我在这里缺少一个核心概念吗?我确信我不是第一个考虑这个解决方案的人。
  4. 我是否更多地询问了偏好而不是最佳做法?
  5. 最后是否有一个我所描述的名字而不是坏的名字?

2 个答案:

答案 0 :(得分:4)

  
      
  1. 这是不好的做法吗?
  2.   

通常,是的。我唯一能想到可能需要的地方是,如果你有一些方法在不同的系统(即Windows和Linux)上实现不同。如果有特定于系统的方法,您可能会做这样的事情。但除此之外,它不赞成。

  
      
  1. 对于那些与我合作进行项目的人来说,这会不会下地狱?
  2.   

是的,因为:

  • Intellisense不会处理您的流氓文件(因为他们不会#include他们需要的定义。
  • 您正在创建#include d而非编译的.cpp文件。那是误导性的。
  • #include .cpp文件到另一个.cpp文件是获取命名空间冲突的好方法。也许一个.cpp文件有一个全局的静态帮助函数,它与另一个.cpp的全局静态帮助器冲突。也许你在一个文件中using namespace std;弄乱了另一个文件。
  • 如果您要编译.cpp文件而不是#include,那么您可以利用并行编译。使用#include会慢很多,因为如果你稍微更改一个方法,那么所有方法都必须进行重新处理和编译。相反,如果您分别编译每个.cpp(这是正常的事情),那么更改一个.cpp文件意味着只需要重新处理和重新编译该文件。
  
      
  1. 我在这里缺少一个核心概念吗?我确信我不是第一个考虑这个解决方案的人。
  2.   

如果没有更具体的例子,您可能会错过single responsibility principle。你的课可能太大而且做得太多了。

此外,类表示具有状态的对象;在多个文件中传播该状态使得从概念上理解整个状态变得更加困难(如果它在同一个文件中,它可以帮助我查看和理解整个对象的状态)。我敢打赌,你会有更多的错误,因为对象的状态并不像你想象的那样一致。

  
      
  1. 我是否更多地询问了偏好而不是最佳做法?
  2.   

这两者都有。不过,现在我们正在获取meta。

  
      
  1. 最后是否有一个我所描述的名字而不是坏的名字?
  2.   

也许有一个技术名称,但我倾向于poisoned chalice

答案 1 :(得分:1)

您实际上并不需要#include一个.cpp文件。

例如,您可以在不同的.cpp文件中实现每个方法,然后单独编译它们。您将获得几个.o文件,每个文件都导出它实现的方法。链接器将完成将它们绑在一起的工作。

所以:

  1. 如果做得好,拆分实施并不是坏习惯。但不要#include他们。

  2. 如果您记录得很好,那就不行了。例如,在.h中将方法组合在一起,并添加注释,指明他们在哪个文件中实施。

  3. 链接过程,只要符号由一个目标文件导出,就不关心符号的来源。

  4. 我不这么认为,即使它可以更接近问题(如何我拆分实现?)。

  5. 不是我知道的。

相关问题