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

Can I use an enum within an enum?

本文关键字:枚举 我可以      更新时间:2023-10-16

示例代码:

#ifndef SPELL_ENUMS_H
#define SPELL_ENUMS_H
namespace spellEnums {
        // Cantrips
    enum LEVEL_ZERO 
    {
        enum EVOCATION 
        {
            _DANCING_LIGHTS
        };
        enum CONJURATION 
        {
            _ACID_SPLASH
        };
    };
};

所以我可以做像LEVEL_ZERO::唤起::_DANCING_LIGHTS ?

尽管另一种建议是将所有 300+ 3.5e 龙与地下城的类型定义为紧凑整洁,易于阅读且易于访问,将胜感激。 :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?! 
        };
};

还是这会导致奇怪的问题?

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

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,
    };

如果您需要其他信息,例如级别,那么您可以使用具有所需信息的其他表或使用 const int 而不是枚举并将信息直接编码到代码中(例如级别可以是高或低 n 位),或者您可以按级别而不是拼写类型对枚举进行分组......

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

如果你真的想这样做,我相信你必须使用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.
    ...
};