【发布时间】:2011-10-16 02:12:41
【问题描述】:
Animal
|
Mammal
/ \
TwoLegged - FourLegged
/ \
Human Lion
我有这个类层次结构,每个类都在它自己的标题中定义。现在,当我同时包含两者时 Human.h 和 Lion.h 在同一个地方,我得到一个哺乳动物重新定义错误。
error C2011: 'Mammal' : 'class' type redefinition
这是因为 Mammal.h 包含在 TwoLegged 和 OneLegged 类中。
我不确定如何解决头文件中的这种循环依赖,因为我无法更改类层次结构。
有人愿意帮忙吗?
编辑:
哺乳动物头
#ifndef MAMMAL_H
#define MAMNAL_H
#include "stdafx.h"
#include "Animal.h"
class Mammal : public Animal
{
public:
Mammal::Mammal();
virtual Mammal::~Mammal();
std::string mammal_name();
int mammal_age();
int mammal_expectedlifedays();
bool mammal_hunter();
int mammal_power();
int mammal_birthrate();
bool mammal_alive();
protected:
Mammal::Mammal(const std::string& mname, int mexpectedlifedays, int mage, bool mhunter, int mpower, int mbirthrate, bool malive) : Animal(mname, mexpectedlifedays, mage,mhunter, mpower, mbirthrate, malive)
{}
private:
};
#endif
编译器给出的错误:
error C2011: 'Mammal' : 'class' type redefinition
see declaration of 'Mammal'
error C2504: 'Mammal' : base class undefined
error C2614: 'TwoLegged' : illegal member initialization: 'Mammal' is not a base or member
注意:这不是家庭作业,否则我会这样标记它。
【问题讨论】:
-
你的头文件有编译保护吗? #ifndef /#def/ #endif
-
你在使用包含防护吗?
-
@John:是的,我有那些编译守卫。
-
@Tony:
Mammal.h中的包含保护一定有问题,或者您实际上在某处重新定义了class Mammal!按照您描述问题的方式,没有循环包含(例如,如果Mammal.h包含Lion.h,就会出现这种情况)。 -
@Tony:只要你有包含警卫,这不是问题(这正是它们的用途)。而且它与循环无关,因为
Mammal独立于Lion和Human。