我正在使用C ++制作一个简单的,基于文本的Pokemon战斗模拟器。到目前为止,我有一个Pokemon类和一个Pokemon移动类,每个类都有一个类型的成员变量。
现在我将这些类型存储为字符串 - “fire”,“water”,“grass”等。但我不确定这是否是存储信息的最佳方式,特别是因为我有比较损坏奖金/惩罚的类型,这意味着必须解析整个字符串而不是简单的常量。
枚举会是更好的选择吗?如果是这样,我是否只是在头文件的开头用通常的方式声明这样的一个/两个类?
enum PKMN_type = {FIRE,WATER,GRASS,...}
使用枚举而不是字符串是否会在大小/内存方面对程序效率产生可测量的影响?
感谢。
答案 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 ();
});
。