怎么写好一个C++的类不建议直接include包含cpp文件

Posted qiuquanguan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么写好一个C++的类不建议直接include包含cpp文件相关的知识,希望对你有一定的参考价值。

  在很多书上都教了#include包含头文件,但是没有教为什么不能包含源文件。。。所以有一些同学试过直接包含源文件(好吧,我承认,我在大学时候也这样做过,而且很幸运没有出问题)。

  那到底应不应该包含源文件呢?

  我想用一个反证法,如果直接包含.cpp文件,那cpp文件中的static变量和接口不是全暴露给外部的.cpp文件了吗,那样要static和接口的在本文件生命周期有效这一个限定有毛用?不直接包含源文件,就可以把程序按照文件进行模块划分。(可能很多同学说,总是说模块化,就知道吹这些名词,都不感觉到它有什么用,呃,还是那句话,是你写的程序太少了)当然这个模块化的好处诱惑不到你的话,那不给你编译,这下你没话说了吧。看下面例子,这样直接包含.cpp文件的做法会很容易造成重复定义的错误。

  还是原来的那个程序作为例子吧。

  person.h文件

 1 #ifndef _Person_H
 2  #define _Person_H
 3     
 4 class Person  
 5     
 6 public:       
 7      Person(); 
 8      
 9     ~Person();
10                                                                              
11  private:      
12  ;  
13      
14  #endif

  person.cpp文件

 1 #include <iostream>                  
 2 #include "person.h"                  
 3            
 4 using std::cout;
 5 using std::endl;                                                            
 6            
 7 Person::Person()
 8           
 9     cout << "create a person" << endl;
10           
11            
12 Person::~Person()                    
13           
14     cout << "release a person" << endl;
15 

   main.cpp文件

1 #include <iostream>
2 #include "person.h"
3 using namespace std;
4 
5 int main()        
6                  
7     Person person;                                                          
8     return 0;     
9 

  OK!这样是“正常人”的写法,哈哈,是不会出问题的。不过,还是看一下运行结果吧。

技术图片

 

   但是如果直接#include包含".cpp"文件呢,会出现什么结果。看下面例子。

  main.cpp文件直接包含person.cpp文件:

 1 #include <iostream>
 2 #include "person.cpp"
 3                                                                                 
 4 using namespace std;
 5  
 6 int main()
 7 
 8     Person person;
 9     return 0;
10 

  编译运行:

技术图片

 

   出现了多重定义导致不能编译。

  综上,不建议直接包含.cpp文件,即使有多不得已的理由,都不应该这样写,比如有人说一个.cpp程序内容太长,用这样方法扩展程序(有这个说法人,你应该重新设计程序划分程序模块了),或者说提高编译效率(扯蛋啊,能不能提高编译效率另说,反正现在的计算机不差这点编译时间,难道用的是七八十年代的机器吗)。

以上是关于怎么写好一个C++的类不建议直接include包含cpp文件的主要内容,如果未能解决你的问题,请参考以下文章

初学QT,想在QT中调用之前已经用c++写好的一个程序,应该怎么做?

c++如何用cout将自己的类直接输出为字符串

链接列表中的类不起作用

C++英文缩写单词,写好了,OJ上过不了,求帮助

(EffectiveJava3rd条目一).静态工厂的第5个优点是,在编写包含该方法的类时,返回的对象的类不需要存在。

复制训练示例以处理 pandas 数据框中的类不平衡