C ++使用int从列表中设置枚举

时间:2015-05-06 17:52:27

标签: c++ enums switch-statement

我在游戏中使用头文件作为角色类(将其作为经验的副项目)。我有它工作,但感觉就像我在做很长的路。我要求'int'设置字符类,然后使用switch语句基于枚举位置设置它。是否有更清晰,更短的方式来进行此操作?我在这做任何被认为是不良做法的事情吗?

class Character_Class {
  public:
    enum classofnpc { CLERIC, FIGHTER, ROGUE, WIZARD, BARBARIAN, DRUID, PALADIN, SORCERER, BARD, MONK, RANGER, WARLOCK };

    Character_Class(const int& a, const int& b){
        switch (a) {
            case 0 :
                a_class = CLERIC;
                break;
            case 1 :
                a_class = FIGHTER;
                break;
            case 2 :
                a_class = ROGUE;
                break;
            case 3 :
                a_class = WIZARD;
                break;
            case 4 :
                a_class = BARBARIAN;
                break;
            case 5 :
                a_class = DRUID;
                break;
            case 6 :
                a_class = PALADIN;
                break;
            case 7 :
                a_class = SORCERER;
                break;
            case 8 :
                a_class = BARD;
                break;
            case 9 :
                a_class = MONK;
                break;
            case 10 :
                a_class = RANGER;
                break;
            case 11 :
                a_class = WARLOCK;
                break;
        }
        lvl = b;
    }
  private:
    classofnpc a_class;
    int lvl;
};

2 个答案:

答案 0 :(得分:1)

你的构造函数可能只是

Character_Class(const classofnpc& a, const int& b)
: a_class { a }, lvl { b }
{ }

由于公开了enum,因此您不需要switch语句。您可以像这样实例化此类的实例

Character_Class foo{ Character_Class::ROGUE, 12 };

答案 1 :(得分:1)

  

是否有更清晰,更短的方法来进行此操作?

1。添加标记值:

enum classofnpc
{
    CLERIC,
    //cut...
    WARLOCK,
    CLS_LIMIT = WARLOCK //set sentinel to largest value
};

2。检查并投射:

Character_Class(const int& a, const int& b)
{
    if(a > CLS_LIMIT)
        //report error, wrong value passed
    else
        a_class = static_cast<classofnpc>(a);

    lvl = b;
}

如果您想出于某种原因(用户输入?)使用数值,这是一个完美的解决方案。但是,如果可以的话,最安全的方法是使用classofnpc构造对象作为构造函数中的第一个参数(而不是普通int)。