我可以在枚举中使用枚举吗?
Can I use an enum within an enum?
示例代码:
#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.
...
};
相关文章:
- 枚举是否可以在C++中减小到其位大小
- 我可以创建一个可以接受任何枚举的模板(非类型)param类吗?C 11
- C++枚举是否可以大于 64 位?
- 我可以使用类型特征从 c++ 中的枚举值推断枚举的类型吗?
- 虚拟方法返回代表派生对象类型的枚举 - 是否可以(在设计方面)
- C 枚举类可以使用方法
- 我可以编写一个在 c++ 中返回到枚举的函数吗?
- 我可以使用枚举作为结构名称吗
- 我可以在枚举中使用枚举吗?
- 我可以使用 typeid() 来知道一个类型是否是枚举吗?
- 我可以使用枚举器的标识符拆除枚举器吗?
- 我可以在类的构造函数中使用枚举吗?
- 我可以传递前向声明枚举的值吗?
- 具有方法和枚举类型的类——方法和枚举值可以有相同的名称
- 我可以使用枚举类值作为变量函数的参数吗?
- 我可以使用std::map,其中键和值都是c++ 11中的枚举类吗?
- c++枚举类型可以作为函数调用吗?或者它只是一种不同风格的类型转换
- 枚举子窗口不起作用,但枚举Windows可以...?
- 为什么我不能分配错误的枚举元素,但可以与错误的枚举元素进行比较?
- 我可以在C++中有一个带有未标记值的枚举吗?