口袋妖怪类型的枚举常量

时间:2017-08-08 17:06:38

标签: c++ enums

我正在使用C ++制作一个简单的,基于文本的Pokemon战斗模拟器。到目前为止,我有一个Pokemon类和一个Pokemon移动类,每个类都有一个类型的成员变量。

现在我将这些类型存储为字符串 - “fire”,“water”,“grass”等。但我不确定这是否是存储信息的最佳方式,特别是因为我有比较损坏奖金/惩罚的类型,这意味着必须解析整个字符串而不是简单的常量。

枚举会是更好的选择吗?如果是这样,我是否只是在头文件的开头用通常的方式声明这样的一个/两个类?

enum PKMN_type = {FIRE,WATER,GRASS,...}

使用枚举而不是字符串是否会在大小/内存方面对程序效率产生可测量的影响?

感谢。

2 个答案:

答案 0 :(得分:3)

使用enum将有几个好处,包括代码速度,类型安全性,并确保在您不小心尝试制作窃取式神奇宝贝时提前检测到它。

由于这是C ++,我通常建议将其设为enum class,而不仅仅是enum然而,因为神奇宝贝可以有多种类型,您可能希望做一些something like FLYING|NORMAL to mean “both FLYING and NORMAL的事情,您可以使用普通enum而不是enum class轻松完成这项工作。您可以通过将每种类型设置为不同的2的幂来实现此目的:

enum pokemon_type {
    NORMAL = 1,
    FIRE = 2,
    FIGHTING = 4,
    WATER = 8,
    // ...
    // Depending on design, a `std::map` might be better, but you could do this:
    VULNERABLE_TO_FIRE = GRASS | ICE | BUG | STEEL,
    RESISTANT_TO_FIRE = FIRE | WATER | ROCK,
    IMMUNE_TO_FIRE = 0,  // Nothing is outright immune to fire
    // ...
};

在一个不太简单的应用程序中,我建议使用enum class并手动实现相关的运算符。

答案 1 :(得分:1)

对于一个简单的,非性能关键的程序,比较字符串与枚举可能无关紧要。 但是,因为枚举可以像字符串一样表达你的目的(并且可能更快)我没有看到任何理由不使用它们。

顺便说一句;在新代码中,通常更喜欢类型安全import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; 而不是旧式$("#preventlink").on('click', function (e) { e.preventDefault (); });