本文转自: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. BZOJ3260: 跳

    BZOJ3260: 跳 Description 邪教喜欢在各种各样空间内跳.现在,邪教来到了一个二维平面. 在这个平面内,如果邪教当前跳到了(x,y),那么他下一步可以选择跳到以下4个点: (x-1, ...

  2. CSS中的那点事儿(一)--- CSS中的单位2

    在上篇博客提到了%.px.em三个单位,其中最复杂的是em,因为要计算当前元素内的font-size,必须知道其父元素的font-size,层层累积,容易出错.现在CSS3中引入了新的单位rem,改变 ...

  3. Linux内核中工作队列的使用work_struct,delayed_work【转】

    本文转载自:http://blog.csdn.net/zahuopuboss/article/details/43268983 初始化工作队列 调度工作队列 取消工作队列 #include <l ...

  4. linux初级学习笔记四:Linux文件管理类命令详解!(视频序号:03_1)

    本节学习的命令:cat(tac),more,less,head,tail,cut,sort,uniq,wc,tr 本节学习的技能:目录管理 文件管理 日期时间 查看文本 分屏显示 文本处理 文件管理命 ...

  5. oracle:os认证用户登录测试

        90%的情况下,我们使用的都是数据库认证用户登录oracle,但还存在使用OS认证用户登录oracle的情况: 下面就实验一下OS用户要登录oracle相关操作: 测试环境:oracle10. ...

  6. DataUtils

    package com.cc.hkjc.util; import java.text.ParseException;import java.text.SimpleDateFormat;import j ...

  7. 用HTTP操作和文件操作把网页下载到sd卡

    这里先把代码贴到这里做一个存档,写到SD卡的是一个txt文件,改成HTML格式之后会出现百度主页,但是中文是乱码,这一点先暂时不去研究了. 代码: package com.larry.gotcha; ...

  8. Linux的终端类型

    终端是一个很重要的外设,用过终端设备的人都知道如果设备类型不对就会有乱字符,也可用仿真终端软件如netterm试验一下,Linux的终端信息放在 /usr/share/terminfo下,在这个目录的 ...

  9. 看鸟哥的Linux私房菜的一些命令自我总结(一)

    -显示目前所支持的语言  echo &LANG -修改语言成为英文系统  LANG=en_US -显示日历的命令 cal [[month] year] -惯用关机命令 shutdown 参数: ...

  10. E20180427-hm

    创建: 2018/04/27 dissolve vi. 溶解; 融化,液化; 解散,散去; 分裂,分解;    vt. 使溶解; 使(固态物)溶解为液体,使液化; 使消失,使消逝,消除; 使终止; c ...