怎么写好一个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++写好的一个程序,应该怎么做?