c++ 中类重复定义的分析与解决办法
来源:互联网 发布:c语言表白小程序代码 编辑:程序博客网 时间:2024/06/08 10:29
在C++中将类以及类中的成员函数的声明放在.h的头文件中,而将类中成员函数的定义(即实现代码)放在.cpp的源文件中,这样我们的程序设计起来更加的模块化,但是,这样的设计也会带来一些问题,我们分析以下的代码,从中找的问题,并给出问题的解决方法。首先我们在VC下新建一个工程(工程名自己随便命名),然后在此工程下新建两个.h的头文件(文件名分别为Animal.h和 Fish.h),继续新建三个.cpp的源文件(文件名分别是Animal.cpp、Fish.cpp、Main.cpp),完成后分别将以下的代码copy到相应的文件下。
如下图所示:
Animal.h
- class Animal
- {
- public :
- Animal(int height, int weight) ;
- void eat() ;
- void sleep() ;
- virtual void breathe() ;
- } ;
Fish.h
- #include"Animal.h"
- class Fish :public Animal
- {
- public :
- Fish() ;
- void breathe() ;
- } ;
Animal.cpp
- #include<iostream.h>
- #include"Animal.h"
- Animal::Animal(intheight, int weight)
- {
- }
- voidAnimal::eat()
- {
- cout << "Animal eat"<< endl ;
- }
- voidAnimal::sleep()
- {
- cout << "Animal sleep"<< endl ;
- }
- void Animal::breathe()
- {
- cout << "Animal breathe"<< endl ;
- }
Fish.cpp
- #include<iostream.h>
- #include"Fish.h"
- Fish::Fish() :Animal(300, 400)
- {}
- voidFish::breathe()
- {
- cout << "fish breathe"<< endl ;
- }
Main.cpp
- #include<iostream.h>
- #include"Animal.h"
- #include"Fish.h"
- void fun(Animal*pAn)
- {
- pAn->breathe() ;
- }
- void main()
- {
- Fish fh ;
- Animal *pAn ;
- pAn = &fh ;
- fun(pAn) ;
- }
完成后,点击编译后,会发现VC编译器报错,具体如下:
大概意思就是Animal类重复定义。
我们来分析一下源代码。
首先是执行Main.cpp源文件中的代码,发现#include "Animal.h"此句代码,编译器回去查找Animal.h头文件,发现Animal这个类已经定义,继续执行,执行到#include "Fish.h"这句代码时,编译器便会去查找Fish.h头文件,在Fish.h头文件中,编译器执行到#include "Animal.h"时,便又去查找Animal.h头文件中的代码,再次发现类Animal的定义,这样,编译器感觉类Animal重复定义了两次,于是,编译器便会报错。
那么,我们该怎样去解决这种问题呢?
方法一:
既然我们已经分析了出现这种问题的原因,那么,我们可以发现在Main.cpp文件中,我们引用了#include "Animal.h"头文件,而当我们再次去引用#include "Fish.h"头文件时,发现在Fish.h文件中也引用了#include "Animal.h"头文件,既然这样,我们何不在Main.cpp文件中将#include "Animal.h"注释掉,这样就避免了重复定义的问题了,其实这样做也是可以的,但是,我们想想,如果我们在写一个大型的程序时,往往有几十个甚至成百上千个的类,其中的继承关系又是那么的复杂的时候,我们便会很难分析到那块可以不写(注释掉),所以,这种方法不适合大型程序的设计。于是,我们又想出了下面的方法:
方法二:
看如下的代码(保持.cpp文件不变,我们在.h头文件上解决该问题)
Animal.h
- #ifndefANIMAL_H_H
- #defineANIMAL_H_H
- class Animal
- {
- public :
- Animal(int height, int weight) ;
- 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 :
- Fish() ;
- void breathe() ;
- } ;
- #endif
观察改写后的代码,发现我们在类的定义前后分别加上了#ifndef…#define…#endif语句,哪么这条语句有什么作用呢?还是刚才的分析过程,当编译器去执行Main.cpp源文件中的代码,发现#include "Animal.h"此句代码,编译器回去查找Animal.h头文件,执行到#ifndef ANIMAL_H_H时,编译器会做出如下的判断,若ANIMAL_H_H没有被定义,便定义它(#defineANIMAL_H_H被执行)继续执行,执行到#include "Fish.h"这句代码时,编译器便会去查找Fish.h头文件,在Fish.h头文件中,编译器执行到#include "Animal.h"时,便又去查找Animal.h头文件中的代码,与上面的一样,编译器会判断ANIMAL_H_H定义了没有,若没有,便进行定义,反之,将跳过#ifndef…#endif间的代码,继续向后执行,知道程序执行完毕。
现在再次编译一下更改后的代码,发现程序并没有报错,执行后输出如下:
上面的使用#ifdef…#endif解决重复定义的问题在MFC编程中会经常的看到,所以,希望学习MFC编程的编程爱好者能够好好的阅读和分析一下,亲自做做实验,有利于个人理解。
- c++ 中类重复定义的分析与解决办法
- C/C++由于头文件重复引入引起的成员或类重复定义的解决办法
- C++中关于类重复定义的分析和解决方法
- C/C++中重复定义的问题
- C语言中重复定义的问题
- C语言中全局变量的定义及重复包含问题
- C/C++中结构体定义的效率与内存浪费问题 的 理解与分析
- C中防止重复定义时要加下划线
- 深入分析C语言中结构体指针的定义与引用详解
- C中变量的声明与定义
- C++:成员函数实现在类定义中与在类定义外的区别
- 关于C++/C中防止头文件的重复包含的解决办法
- 关于C++/C中防止头文件的重复包含的解决办法 (转)
- C++/C中防止头文件的重复包含的解决办法及区别
- C++/C中防止头文件的重复包含的解决办法及区别
- C++/C 中防止头文件重复包含的解决办法深入
- C++/C宏定义中##与#的含义
- C++/C中定义与声明的区别
- Go--基础知识学习三
- 解决easyui combobox 下拉高度大于实际值
- SuperSlide 最简demo
- 创新工厂分鱼问题
- Linux 标准 输入 输出 重定向. printf 不输出到屏幕的解决办法
- c++ 中类重复定义的分析与解决办法
- Linux ./configure --prefix 命令是什么意思?
- shared_ptr理解
- aspx后台传递Json到前台的两种接收方法
- Java过滤器,SpringMVC拦截器之间的一顺序点关系
- iOS 之倒计时 NSTimer 短信验证码 60秒 60分钟
- 浅谈对C#-lock()的理解
- Shell实现多线程
- 工业物联网或系统集成中应用消息队列(ActiveMQ,C#的demo)的场景全面分析