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
<> >由于 >包含C++中的,只需在当前文件中复制文本粘贴,如果相同的头包含两次,则文本将导致重复的类定义。include guard所做的是防止多个包含同一标头


编辑:问题是您检查
哺乳动物的定义,然后定义
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