循环包含,如何在不改变类层次结构的情况下解决此问题

时间:2011-07-29 15:59:04

标签: c++ class include

            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

注意:这不是家庭作业,否则我会将其标记为。

4 个答案:

答案 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