示例代码:
#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?!
};
};
或者这会导致奇怪的问题吗?
答案 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.
...
};