如何处理C++头文件重复定义问题
来源:优易学  2011-12-15 17:51:06   【优易学:中国教育考试门户网】   资料下载   IT书店

  在设计一个类的时候,通常是将类的定义及类成员函数的声明放到头文件(即.h文件)中,将类中成员函数的实现放到源文件(即.cpp)中。对于 animal类需要animal.h和animal.cpp两个文件,同样,对于fish类需要fish.h和fish.cpp。对于main()函数,我们把它单独放到EX10.cpp文件中。

  往一个现有工程添加头文件(.h文件)或源文件(.cpp文件)有两种方式:一种是在打开的工程中,单击【File】→【New】,在左边的Files标签页下,选择C++ Header File或C++ Source File,然后在右边的File文本框中,输入头文件或源文件的文件名,如animal.h或animal.cpp,单击【OK】按钮。

  另一种方式是在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-24所示。

  例2-24

  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这个类就重复定义了。

[1] [2] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训