2.2.10 C++(www.cppentry.com)类的设计习惯及头文件重复包含问题的解决(1)
在设计一个类的时候,通常是将类的定义及类成员函数的声明放到头文件(即.h文件)中,将类中成员函数的实现放到源文件(即.cpp)中。对于animal类需要animal.h和animal.cpp两个文件,同样,对于fish类需要fish.h和fish.cpp。对于main()函数,我们把它单独放到EX10.cpp文件中。
往一个现有工程添加头文件(.h文件)或源文件(.cpp文件)有两种方式:一种是在打开的工程中,单击【File】→【New】,在左边的Files标签页下,选择C++(www.cppentry.com) Header File或C++(www.cppentry.com) Source File,然后在右边的File文本框中,输入头文件或源文件的文件名,如animal.h或animal.cpp,单击【OK】按钮。如图2.16所示。
|
| (点击查看大图)图2.16 新建头文件或源文件 |
另一种方式是在EX10的工程目录下,单击鼠标右键,选择【新建】→【文本文档】,然后将"新建文本文档.txt"改名为"animal.h"(因.h和.cpp文件都是文本格式的文件),依同样的方法,建立animal.cpp、fish.h、fish.cpp三个文件,然后在打开的工程中,选择【Project】→【Add To Project】→【Files】,选择animal.h、animal.cpp、fish.h、fish.cpp这四个文件,单击【OK】按钮,如图2.17所示。
|
| 图2.17 添加头文件和源文件到工程中 |
代码如例2-24所示。
例2-24
- //在头文件中包含类的定义及类成员函数的声明
- class animal
- {
- public:
- animal();
- ~animal();
- void eat();
- void sleep();
- virtual void breathe();
- };
-
- animal.cpp
- //在源文件中包含类中成员函数的实现
-
- #include "animal.h" //因为在编译animal.cpp时,编译器不知道animal到底
- 是什么,所以要包含animal.h,这样,编译器就知道animal
- 是一种类的类型
- #include <iostream.h> //在包含头文件时,<>和""有什么区别?<>和""表示编译器
- 在搜索头文件时的顺序不同,<>表示从系统目录下开始搜索,
- 然后再搜索PATH环境变量所列出的目录,不搜索当前目录;
- ""是表示先从当前目录搜索,然后是系统目录和PATH环境变
- 量所列出的目录。所以如果我们知道头文件在系统目录下,
- 就可以直接用<>,这样可以加快搜索速度
- animal::animal() //::叫做作用域标识符,用于指明一个函数属于哪个类或一
- 个数据成员属于哪个类。::前面如果不跟类名,表示是全局
- { 函数(即非成员函数)或全局数据
- }
-
- animal::~animal()
- {
- }
-
- void animal::eat() //注意:虽然我们在函数体中什么也没写,但仍然是实现了
- 这个函数
- {
- }
-
- void animal::sleep()
- {
- }
-
- void animal::breathe() //注意,在头文件(.h文件)中加了virtual后,在源文
- 件(.cpp文件)中就不必再加virtual了
- {
-
- cout<<"animal breathe"<<endl;
- }
-
- fish.h
- #include "animal.h" //因fish类从animal类继承而来,要让编译器知道
- animal是一种类的类型,就要包含animal.h头文件
- class fish:public animal
- {
- public:
- void breathe();
- };
-
- fish.cpp
- #include "fish.h"
- #include <iostream.h>
- void fish::breathe()
- {
- cout<<"fish bubble"<<endl;
- }
-
- EX10.cpp
- #include "animal.h"
- #include "fish.h"
- void fn(animal *pAn)
- {
- pAn->breathe();
- }
- void main()
- {
- animal *pAn;
- fish fh;
- pAn=&fh;
- fn(pAn);
- }