C++ 循环包含,如何在不更改类层次结构的情况下解决此问题
我有这个类层次结构,每个类都在它自己的头中定义。现在当我把两者都包括进去 在同一个地方,我得到了一个哺乳动物的重新定义错误C++ 循环包含,如何在不更改类层次结构的情况下解决此问题,c++,class,include,C++,Class,Include,我有这个类层次结构,每个类都在它自己的头中定义。现在当我把两者都包括进去 在同一个地方,我得到了一个哺乳动物的重新定义错误 Animal | Mammal / \ TwoLegged - FourLegged / \ Human Lion 这是因为哺乳动物.h同时包含在两足类和单足类中 但是,我不确定如何解决标头中
Animal
|
Mammal
/ \
TwoLegged - FourLegged
/ \
Human Lion
这是因为哺乳动物.h同时包含在两足类和单足类中
但是,我不确定如何解决标头中的这种循环依赖关系,因为我无法更改类层次结构
有人愿意帮忙吗
编辑:
哺乳动物头
error C2011: 'Mammal' : 'class' type redefinition
编译器给出的错误:
#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
将其添加到所有头文件的顶部
但是,请记住,即使编译器非常支持它,它也不是一个标准。我猜您忘记了包含防护。按照John的建议使用#ifndef/#ifdef/#endif。您需要使用include-guard。典型的形式是:
#pragma once
<> >由于编辑:问题是您检查
哺乳动物的定义,然后定义MAMNAL\u H
(请注意定义版本中的N
)。正是出于这个原因,我总是复制粘贴来生成我的include-guard。头文件中是否有编译保护#ifndef/#def/#endif你在使用include-guards吗?@John:是的,我有那些编译保护。@Tony:你在哺乳动物.h
中的include-guards肯定有问题,或者你实际上在某处重新定义了哺乳动物类
!按照您描述问题的方式,不存在循环包含(例如,如果哺乳动物.h
包含狮子.h
),则会出现这种情况。@Tony:只要您有包含守卫,这就不是问题(这正是它们的用途)。它与周期无关,因为哺乳动物独立于狮子和人类!支持率不高。GCC是已知的没有它的。当然,你必须检查你正在使用的编译器。但如果您的编译器支持它,那么它比include-guards更干净,更不容易出错。@rodrigo自gcc 3.4以来就一直支持它。伙计们,这个讨论是离题的。很可能OP忘记/键入错误包括警卫(无论是哪种类型),这个答案只是部分帮助。@老虎托尼:你确定或者你能重新检查他们是否对所有文件都到位,当然是正确的@Tony The Tiger在这种情况下,我认为我们需要看到一个最小的例子,向您展示问题。-1用于猜测,然后参考其他人的答案。这个答案对已经给出的答案没有任何补充。这是公平的!不是有意的。对不起,伙计们。
#ifndef NAME_OF_HEADER_H
#define NAME_OF_HEADER_H
// Rest of header code here.
#endif
#ifndef MAMMAL_H
#define MAMMAL_H
... definition of mammal
#endif