3

示例代码:

#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 龙与地下城的类型定义在一个紧凑且易于阅读和方便访问的替代建议中,我们将不胜感激。: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?! 
        };

};

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

4

2 回答 2

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 而不是枚举并将信息直接编码为代码(例如级别可以是高或低 n 位),或者您可以对枚举进行分组按级别而不是拼写类型...

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

于 2013-10-29T06:48:02.413 回答
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.
    ...
};
于 2013-10-29T07:00:23.720 回答