本文转自:http://blog.csdn.net/forevertali/article/details/4370602

 

animal.h

//在头文件中包含类的定义及类成员函数的声明

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);

}

现在我们就可以按下键盘上的F7功能键编译整个工程了,编译结果如下:

为什么会出现类重复定义的错误呢?请读者仔细查看EX10.cpp文件,在这个文件中包含了animal.h和fish.h这两个头文件。当编译器编译EX10.cpp文件时,因为在文件中包含了animal.h头文件,编译器展开这个头文件,知道animal这个类定义了,接着展开fish.h头文件,而在fish.h头文件中也包含了animal.h,再次展开animal.h,于是animal这个类就重复定义了。

读者可以测试一下,如果我们多次包含iostream.h这个头文件,也不会出现上面的错误。要解决头文件重复包含的问题,可以使用条件预处理指令。修改后的头文件如下:

animal.h

#ifndef ANIMAL_H_H      //我们一般用#define定义一个宏,是为了在程序中使用,使程

                            序更加简洁,维护更加方便,然而在此处,我们只是为了判断

#define ANIMAL_H_H      ANIMAL_H_H是否定义,以此来避免类重复定义,因此我们没有为

                        其定义某个具体的值。在选择宏名时,要选用一些不常用的名字,

class animal            因为我们的程序经常会跟别人写的程序集成,如果选用一个很常用

的名字(例如:X),有可能会造成一些不必要的错误

{

public:

animal();

~animal();

void eat();

void sleep();

virtual void breathe();

};

#endif

fish.h

#include "animal.h"

#ifndef FISH_H_H

#define FISH_H_H

class fish:public animal

{

public:

void breathe();

};

#endif

我们再看EX10.cpp的编译过程。当编译器展开animal.h头文件时,条件预处理指令判断ANIMAL_H_H没有定义,于是就定义它,然后继续执行,定义了animal这个类;接着展开fish.h头文件,而在fish.h头文件中也包含了animal.h,再次展开animal.h,这个时候条件预处理指令发现ANIMAL_H_H已经定义,于是跳转到#endif,执行结束。

通过分析,我们发现在这次的编译过程中,animal这个类只定义了一次。

[转]VC++的类头文件的更多相关文章

  1. 实现C++模板类头文件和实现文件分离的方法

    如何实现C++模板类头文件和实现文件分离,这个问题和编译器有关. 引用<<C++primer(第四版)>>里的观点:1)标准C++为编译模板代码定义了两种模型:“包含”模型和“ ...

  2. C++模板类头文件和实现文件分离

    http://www.cnblogs.com/lvdongjie/p/4288373.html 如何实现C++模板类头文件和实现文件分离,这个问题和编译器有关. 引用<<C++primer ...

  3. 1.svn 彻底clear时,注意代码备份 2.借助vc助手加头文件

    1.svn 彻底clear时,注意代码备份 2.不小心彻底clear可以在回收站找到 3.借助vc助手加头文件

  4. vc使用jsoncpp头文件冲突问题

    编译时出现 1>d:\program files (x86)\microsoft visual studio 9.0\vc\include\xdebug(32) : warning C4229: ...

  5. VC++中的头文件包含问题

    在一些大的工程中,可能会包含几十个基础类,免不了之间会互相引用(不满足继承关系,而是组合关系).也就是需要互相声明.好了,这时候会带来一些混乱.如果处理得不好,会搞得一团糟,根据我的经验,简单谈谈自已 ...

  6. 【QT相关】类头文件解读、QT编辑模式、读取text文本

    Wizard产生的头文件类包含了必须的#include文件.构造函数.析构函数和UI对象: #include <QMainWindow> namespace Ui {class Notep ...

  7. Qt - 错误总结 - 在自定义类头文件中添加Q_OBJECT 编译时报错(undefined reference to ‘vtable for xxThread)

    错误提示:在添加的QThread子类头文件添加Q_OBJECT时,编译程序,出现"undefined reference to 'vtable for xxThread'"错误提示 ...

  8. VC中添加头文件以及库

    原文:http://blog.csdn.net/lwb102063/article/details/52068389   附加头文件包含 VC6.0中: VC6.0默认include包含路径:Tool ...

  9. vc++中 .H 头文件引用的顺序与符号关系

    在使用 #include "math.h"  和 #include <math.h>时,引号 与尖括号的区别如下 此时math.h_1 在工程文件中 math.h_2 ...

随机推荐

  1. Vue.js新手入门指南

    最近在逛各大网站,论坛,以及像SegmentFault等编程问答社区,发现Vue.js异常火爆,重复性的提问和内容也很多,楼主自己也趁着这个大前端的热潮,着手学习了一段时间的Vue.js,目前用它正在 ...

  2. Servlet session的理解

    servlet参见http://blog.csdn.net/bryanliu1982/article/details/5214899 session参见http://lavasoft.blog.51c ...

  3. 通过powershell操作eventlog

    relevant command list ~\Desktop> (Get-Command Write-EventLog).Parameters Key Value --- ----- Warn ...

  4. 类、对象(java基础知识六)

    1.Java约定俗成 java约定俗成 1,类名接口名 一个单词首字母大写,多个单词每个单词首字母都大写 2,方法名和变量名 一个单词全部小写,多个单词从第二个单词首字母大写 建议:如果能用英语尽量用 ...

  5. java24点算法

    输入任意的四个数,求出所有能得到二十四点的算式,不过我是菜鸟,可能性能方面不好,希望各位多多指教​1. [代码][Java]代码     import java.util.ArrayList;impo ...

  6. 基于C#实现Windows服务状态启动和停止服务的方法

    网址:http://www.jb51.net/article/89230.htm

  7. codeforces 665E E. Beautiful Subarrays(trie树)

    题目链接: E. Beautiful Subarrays time limit per test 3 seconds memory limit per test 512 megabytes input ...

  8. PostgreSQL新手教程

    自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选. 本文介绍PostgreSQL的安装和基本用法,供初次使用者上手.以下内容基于Debian操作系统,其他操作系 ...

  9. 148D

    概率dp+记忆化搜索 dp[i][j][0]表示当前公主走公主赢的概率,dp[i][j][1]表示当前龙走公主赢的概率,然后剩下的就是一些细节的讨论,记忆化搜索很方便 #include<bits ...

  10. C#文件读写参考

    string s = ""; string[] files = Directory.GetFiles(@"E:\u3d_warcraft\logic\logic\Batt ...