我可以在枚举中使用枚举吗?

时间:2013-10-29 06:30:39

标签: c++ enums namespaces

示例代码:

#ifndef SPELL_ENUMS_H
#define SPELL_ENUMS_H

namespace spellEnums {
        // Cantrips
    enum LEVEL_ZERO 
    {
        enum EVOCATION 
        {
            _DANCING_LIGHTS
        };
        enum CONJURATION 
        {
            _ACID_SPLASH
        };
    };

};

所以我可以做像LEVEL_ZERO :: EVOCATION :: _ DANCING_LIGHTS这样的东西?

虽然另外一个建议是将所有300+ 3.5e Dungeons和Dragon的类型定义为一个非常易读且易于阅读且方便访问的类型,但非常赞赏。 :d

或者我必须做跛脚命名空间,如:

namespace LEVEL_ZERO {
        // Cantrips
        enum EVOCATION 
        {
            _DANCING_LIGHTS
        };
        enum CONJURATION 
        {
            _ACID_SPLASH
        };

};

namespace LEVEL_ONE {
        // Level one spells
        enum EVOCATION 
        {
            _FLAMING_HANDS
        };
        enum CONJURATION 
        {
            _MAGE_ARMOUR //BECAUSE JE SUIS CANADIEN le poutine eh?! 
        };

};

或者这会导致奇怪的问题吗?

2 个答案:

答案 0 :(得分:1)

我不认为嵌套枚举是一种很好的方法我会使用这样的东西:

enum _spell_enum 
    {
    _spell_evocation_beg=0x00000000,
    _spell_dancing_lights0,
    _spell_dancing_lights1,
    _spell_dancing_lights2,
    _spell_dark_shroud0,
    _spell_dark_shroud1,
    _spell_dark_shroud2,
    _spell_...,
    _spell_evocation_end,

    _spell_conjuration_beg=0x01000000,
    _spell_acid_splash0,
    _spell_acid_splash1,
    _spell_acid_splash2,
    _spell_acid_beam0,
    _spell_acid_beam1,
    _spell_acid_beam2,
    _spell_...,
    _spell_conjuration_end,

    _spell_teleport_beg=0x02000000,
    _spell_teleport_home,
    _spell_teleport_town_a,
    _spell_teleport_town_b,
    _spell_teleport_town_c,
    _spell_teleport_town_d,
    _spell_...,
    _spell_teleport_end,
    };

PS。如果您需要其他信息(如级别),那么您可以使用包含所需信息的其他表或使用const int而不是enum并将信息直接编码为代码(例如level can是高或低n位)或你可以按级别分组枚举而不是拼写类型...

你的第二个解决方案也不好,因为我认为你需要法术的唯一ID,并且单独的枚举是重叠的(除非你提供起始值)

答案 1 :(得分:0)

如果你真的想这样做,我相信你必须使用namespace而不是enum。请注意,enum名称不被视为范围,因此在以下情况下:

namespace LEVEL_ONE {
    // Level one spells
    enum EVOCATION 
    {
        FLAMING_HANDS
    };
    enum CONJURATION 
    {
        MAGE_ARMOUR //BECAUSE JE SUIS CANADIEN le poutine eh?! 
    };
};

值将以LEVEL_ONE::FLAMING_HANDS的形式引用,而不是LEVEL_ONE::EVOCATION::FLAMING_HANDS。您可以通过以下方式获得所需的效果:

namespace LEVEL_ONE {
    // Level one spells
    namespace EVOCATION 
    {
        const int FLAMING_HANDS = 0;
        const int MAGIC_MISSILE = 1;
    };
};

我认为你不希望这些值成为不同的类型,这就是你建议的方式使用enum。你似乎想要传递Spell(或类似)类型的对象,这些对象可以引用任何法术,而不是来自所有不同学校和关卡的法术单独类型。我可能会倾向于:

class Spell
{
public:
    enum Magic_Type
    {
        ARCANE,
        DIVINE
    };

    enum School
    {
        EVOCATION,
        CONJURATION,
        DIVINATION,
        ...
    };

    int get_level();
    Magic_Type get_type();
    School get_school();
    void cast_on(Target &t, Board &b);  // Needs the Board to affect secondary targets.
    ...
};