циклический включает в себя, как я могу решить эту проблему без изменения иерархии классов - PullRequest
3 голосов
/ 29 июля 2011
            Animal
               |
           Mammal
               / \
      TwoLegged - FourLegged
         /           \
        Human      Lion

У меня есть эта иерархия классов, каждый класс определен в своем собственном заголовке.Теперь, когда я включаю и Human.h и Lion.h в одном месте, я получаю ошибку переопределения Mammal.

 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 ]

4 голосов
/ 29 июля 2011
#pragma once

Добавьте это в самый верх всех ваших заголовочных файлов.

Однако имейте в виду, что, хотя он очень хорошо поддерживается компиляторами, это не стандарт.

3 голосов
/ 29 июля 2011

Вы должны использовать включить охранников.Типичная форма:

#ifndef NAME_OF_HEADER_H
#define NAME_OF_HEADER_H

// Rest of header code here.

#endif

Поскольку #include в C ++ просто выполняет копирование-вставку текста в текущем файле, если один и тот же заголовок будет включен дважды, этот текст приведет к дублированию определений классов.Что делает защита включения - это предотвращает многократное включение одного и того же заголовка.

РЕДАКТИРОВАТЬ: Проблема в том, что вы проверяете определение MAMMAL_H, а затем определяете MAMNAL_H (обратите внимание на N в определенномверсия).Я всегда копирую-вставляю, чтобы сгенерировать мои включенные охранники именно по этой причине.

0 голосов
/ 29 июля 2011
#ifndef MAMMAL_H
#define MAMMAL_H



... definition of mammal


#endif
0 голосов
/ 29 июля 2011

Полагаю, вы забыли включить охрану.Используйте #ifndef / # ifdef / #endif, как предложил Джон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...