【问题标题】:C++ Using an int to set an enum from a listC++ 使用 int 从列表中设置枚举
【发布时间】:2015-05-06 17:52:27
【问题描述】:

我在游戏中使用角色类的头文件(将其作为经验的辅助项目)。我有它的工作,但感觉就像我正在做这件事很长的路要走。我要求一个“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;
};

【问题讨论】:

  • a_class = a; 似乎更清晰。 enums 默认从 0 开始递增 1。
  • @zch 是的,但只能进行额外检查 - 否则不安全。 int 可以产生值,这超出了此枚举的范围。
  • 顺便说一句,我建议只通过 const 引用传递大型类,对于原语,它是 not necessary,实际上它通常效率略低,你应该只通过值传递它们。

标签: c++ enums switch-statement


【解决方案1】:

你的构造函数可能只是

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

由于enum 是公开的,所以不需要switch 语句。你可以像这样实例化这个类的一个实例

Character_Class foo{ Character_Class::ROGUE, 12 };

【讨论】:

  • 那太美了。谢谢。
【解决方案2】:

有没有更清晰、更短的方法来做这个操作?

是的。

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)来构造对象。

【讨论】:

  • a_class= static_cast(a);非常适合我正在做的事情。在另一个函数中请求输入时,我已经进行了检查以确保 int 'a' 在范围内。感谢您的回答。
猜你喜欢
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2010-12-21
  • 2016-11-30
相关资源
最近更新 更多