[CPP]C++学习之路——构造函数、多个文件包含与连接
心路历程
今天在课上听老师讲到可以将类的定义放入头文件,将类的函数成员的定义放入一个cpp文件,再在一个main.cpp文件中将它们包含进来。
室友和我回宿舍后尝试对课上的示例代码进行复现,然后遇到了一些问题,在一番百度之后算是解决了,还遇到了几个书上和课上没讲到的知识点,所以想到写一篇博客来记录下来。
室友遇到的问题
//clock.h
class Clock {
private:
int hour, minute, second;
public:
void settime(int h, int m, int s);
void showtime();
Clock(int H, int M, int S);//构造函数
Clock();//默认构造函数
Clock(Clock &cc);//复制构造函数
};
clock.h中存放的是对类的定义和类的函数成员的声明。
//clock.cpp
#include <iostream>
#include "clock.h"
using namespace std;
void Clock::settime(int h, int m, int s) {
hour = h;
minute = m;
second = s;
}
void Clock::showtime() {
cout << hour << ":" << minute << ":" << second << endl;
}
Clock::Clock(int H, int M, int S) {
hour = H;
minute = M;
second = S;
cout << "构造函数被调用..." << endl;
}
Clock::Clock() {
hour = 0;
minute = 0;
second = 0;
cout << "默认构造函数被调用..." << endl;
//调用时无须提供参数的构造函数称为默认构造函数
}
Clock::Clock(Clock &cc) {//利用了对象的引用
hour = cc.hour;
minute = cc.minute;
second = cc.second;
cout << "复制构造函数被调用..." << endl;
}
clock.cpp中存放的是对类的函数成员的定义。
//main.cpp
#include "clock.h"
int main() {
Clock c1;
Clock c2(12, 12, 12);//调用构造函数对c2进行初始化
c1.showtime();
c2.showtime();
Clock c3(c2);
c3.showtime();
return 0;
}
老师操作时使用的是命令行的link命令将三个文件的obj连接到一起,而室友使用Dev-C++对单个文件进行编译时报出错误信息:未定义的引用;找不到头文件等等。
一番百度后,找到的解决办法如下。
解决办法:
点击左上角文件-新建-项目来新建一个项目,然后对项目右键,点击添加,将这三个文件添加到同一个项目中。
按住CTRL+左键选中这三个文件,按F9编译,编译通过,按F10运行,运行成功,得到结果如下。
我遇到的问题
看到室友解决了问题,我也心血来潮,决定自己敲一遍。
我的代码绝大部分与上述代码相同,但在main.cpp中多了一行#include “clock.cpp”
//我的main.cpp
#include "clock.h"
#include "clock.cpp"
int main() {
Clock c1;
Clock c2(12, 12, 12);//调用构造函数对c2进行初始化
c1.showtime();
c2.showtime();
Clock c3(c2);
c3.showtime();
return 0;
}
按上述方法编译时出现
[错误] 重复定义: 'class Clock'
这让我百思不得其解。
一番百度后,在优快云的两篇博客上看到了报错的原因。
注意头文件规则,避免链接错误:重复定义(multiple defination)
看来是在编译预处理时重复引用造成了二义性。
我将#include "clock.cpp"这条语句注释掉,再次编译,通过,然后运行,这次成功了。