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
注意:这不是家庭作业,否则我会将其标记为。
答案 0 :(得分:4)
#pragma once
在所有头文件的最顶部添加它。
但是,请记住,即使它得到编译器的很好支持,它也不是标准。
答案 1 :(得分:3)
您需要使用包含警戒。典型的形式是:
#ifndef NAME_OF_HEADER_H
#define NAME_OF_HEADER_H
// Rest of header code here.
#endif
由于C ++中的#include
只是对当前文件中的文本进行了复制粘贴,如果相同的标头被包含两次,那么该文本将导致重复的类定义。包含守卫的作用是防止多个包含相同的标题。
编辑:问题是您检查MAMMAL_H
的定义,然后定义MAMNAL_H
(请注意定义版本中的N
)。我始终复制粘贴以生成我的包含警卫。正是出于这个原因。
答案 2 :(得分:0)
我想你忘了包括警卫。使用#ifndef /#ifdef / #endif作为John的建议。
答案 3 :(得分:0)
#ifndef MAMMAL_H
#define MAMMAL_H
... definition of mammal
#endif