怎么写好一个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程序内容太长,用这样方法扩展程序(有这个说法人,你应该重新设计程序划分程序模块了),或者说提高编译效率(扯蛋啊,能不能提高编译效率另说,反正现在的计算机不差这点编译时间,难道用的是七八十年代的机器吗)。

猜你喜欢

转载自www.cnblogs.com/qiuquanguan/p/11563820.html