C ++为什么我不能在声明它的类之外使用全局声明的枚举?

时间:2010-05-22 03:10:23

标签: c++ enums scope declaration

现在,我的项目有两个类和一个主。由于这两个类彼此继承,因此它们都使用前向声明。在第一个对象中,在#include语句的正下方,我在类定义之前初始化了两个枚举。我可以在这个类中使用这两个枚举。但是,如果我尝试在继承自第一个类的其他类中使用这些枚举,则会收到一条错误,指出枚举尚未声明。如果我尝试重新定义第二类中的枚举,我会得到重定义错误。

我甚至尝试过使用我刚才读到的技巧,并将每个枚举放在自己的命名空间中;这并没有改变什么。

以下是一个例子:

#ifndef CLASSONE_H
#define CLASSONE_H

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

#endif

然后在第二个类中,我尝试使用前面声明的枚举:

void AddPlayer(Player::Enum playerNumber);

而是收到一条错误,说“玩家”尚未宣布。

1 个答案:

答案 0 :(得分:4)

我不确定在没有看到您的代码的情况下您遇到了什么问题,但这会编译:

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. 当从其定义的类以外的任何地方引用它时,使用类名来限定枚举的名称和值。
  3. 编辑:

    好的,问题与枚举无关,而是包含顺序,当你有基类和派生类时,只有派生类需要知道基类:

    基类标题:

    #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