首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

种的定义头文件和成员函数的定义CPP文件的包含关系

2012-08-01 
类的定义头文件和成员函数的定义CPP文件的包含关系类在头文件定义叫做(Sales.h),类的成员函数在另一个cpp

类的定义头文件和成员函数的定义CPP文件的包含关系
类在头文件定义叫做(Sales.h),类的成员函数在另一个cpp文件(Sales.cpp)中定义。
Sales.cpp代码如下:

C/C++ code
void Sales::input_units(){    cin>> isbn >> units_sold >> price;    revenue = units_sold * price;}void Sales::output_units(){    cout<< isbn << "\t" << units_sold << "\t" << revenue << "\t" << price;}


测试这个类时,
main函数所在源文件包含Sales.h和Sales.cpp时,提示大概是成员函数重复定义。
删去#include"Sales.cpp"时,程序能正常运行。
<1>这个为什么光凭借头文件中类的定义就能调用Sales.cpp的函数?
我在Sales.cpp上加上了条件编译后(<2>不知道能不能在这里加?),
将#include"Sales.cpp"恢复,编译错误还是函数重复定义,<3>难道这个条件编译不起作用?



[解决办法]
一般情况下是不需要保护.cpp文件的。这个和编译原理有点关系的。头文件里有函数的申明的话,你包含头文件后就可以访问到函数了。
[解决办法]
首先,你要懂得程序编译链接的过程

代码变成可执行文件需要两步,编译和链接
编译以cpp文件为单位,每个cpp文件编译成一个模块
链接就是把这些模块组合起来,成为一个可执行的程序

至于“#include”预编译命令,它的作用就是单纯的复制,把所要包含的文件的代码全部复制到当前文件中
所以这些命令叫做预编译命令,它发生在编译之前

然后,你使用的应该是VC之类的集成环境,而不是单纯的编译器
纯粹的编译器,编译和链接这两步是分开的,一目了然
集成环境只需要按一个按钮就可以完成这两步,的确是很方便,但初学者根本无法了解其原理,因此就有了各种各样的错误

以VC为例,它在编译这一步,编译的cpp文件就是当前工程/解决方案中包含的cpp文件
哪怕某个cpp文件和这个工程/解决方案一点关系都没有,只要你“添加到工程/解决方案”了,编译器就会把它编译成模块
然后在链接这一步,把所有编译过的模块链接为一个可执行文件

<1>这个为什么光凭借头文件中类的定义就能调用Sales.cpp的函数?
——你用的集成环境肯定有文件列表,你把文件列表中的sales.cpp文件删掉(不用删文件本身,只要把列表中的这个文件移除),你看看编译结果是怎么样,肯定是报链接错误
——当sales.cpp已经被编译成一个模块,而且源代码和头文件是一致的,那么包含这个头文件就可以在其他模块中使用sales.cpp中的函数,链接时会自动将这些地方与sales模块中的相应函数一一对应

<2>不知道能不能在这里加?
——条件编译可以加在任何地方,只要你知道它是什么意思
——如果你不知道该不该加,那就不要加,编程最忌讳的就是想当然,语法是标准规定的,预编译命令是编译器提供商规定的,都不是你能够想当然的
——就本楼这个例子来说,加条件编译肯定没用

热点排行