C ++ Почему я не могу использовать enum, объявленный глобально вне класса, в котором он был объявлен? - PullRequest
2 голосов
/ 22 мая 2010

Прямо сейчас мой проект состоит из двух классов и основного.Поскольку эти два класса наследуются друг от друга, они оба используют предварительные объявления.В первом объекте, прямо под оператором #include, я инициализирую два перечисления перед определением класса.Я могу использовать оба перечисления просто отлично в этом классе.Однако, если я пытаюсь использовать эти перечисления в другом классе, который наследуется от первого, я получаю сообщение об ошибке, говорящее, что перечисление не было объявлено.Если я пытаюсь переопределить перечисление во втором классе, я получаю ошибку переопределения.

Я даже пытался использовать трюк, о котором я только что читал, и помещать каждое перечисление в свое собственное пространство имен;это ничего не изменило.

Вот пример:

#ifndef CLASSONE_H
#define CLASSONE_H

namespace Player
{
    enum Enum
    {
        One,
        Two,
    };
}

#endif

Затем во втором классе я пытаюсь использовать объявленное ранее перечисление:

void AddPlayer(Player::Enum playerNumber);

и вместо этого получаю сообщение об ошибке 'Игрок "не был объявлен.

1 Ответ

4 голосов
/ 22 мая 2010

Я не уверен, какая у вас проблема, не видя ваш код, но это компилируется:

enum OutsideEnum
{
    OE_1,
    OE_2,
};

namespace ns
{
    enum NSEnum
    {
       NE_1,
       NE_2,
    };
}

class Base
{
public:
    enum BaseEnum
    {
        BE_1,
        BE_2,
    };

    void BaseFunc();
};

class Derived
{
public:
    enum DerivedEnum
    {
        DE_1,
        DE_2,
    };

    void DerivedFunc();
};

void Base::BaseFunc()
{
    BaseEnum be = BE_1;
    Derived::DerivedEnum de = Derived::DE_1;
    OutsideEnum oe = OE_1;
    ns::NEEnum ne = ns::NE_1;
}

void Derived::DerivedFunc()
{
    Base::BaseEnum be = Base::BE_1;
    DerivedEnum de = DE_1;
    OutsideEnum oe = OE_1;
    ns::NEEnum ne = ns::NE_1;
}

int main()
{
    Base::BaseEnum be = Base::BE_1;
    Derived::DerivedEnum de = Derived::DE_1;
    OutsideEnum oe = OE_1;
    ns::NEEnum ne = ns::NE_1;
}

Две вещи, на которые нужно обратить внимание с перечислениями, определенными внутри определения класса:

  1. Убедитесь, что он объявлен общедоступным, если вы хотите, чтобы он был общедоступным.
  2. При обращении к нему из любого места, кроме класса, в котором он определен, используйте имя класса для определения имени перечисления и значений.

EDIT:

Хорошо, проблема не имеет ничего общего с перечислениями, а скорее с порядком включения, когда у вас есть базовый класс и производный класс, только базовый класс должен знать о базовом классе:

Заголовок базового класса:

#ifndef BASE_H
#define BASE_H

enum BaseEnum
{
};

class Base
{
};
#endif

Производный заголовок класса:

#ifndef DERIVED_H
#define DERIVED_H

#include "Base.h"

class Derived
{

   void Func(BaseEnum be);
};
#endif
...