【问题标题】:How to deduce enum elements?如何推断枚举元素?
【发布时间】:2021-11-09 15:52:55
【问题描述】:

我需要写一本法术书,我有两种方法可以做到——使用枚举,或者使用 std :: map,因为使用枚举对我来说更容易。但是我遇到了如何显示我的枚举的问题?

我想做它,以便我可以在屏幕上显示所有这些咒语,并询问用户你想使用这些咒语中的哪一个?

例如:

enum Book {
Tornado,
FireBall,
etc,
};

我希望它像这样输出到控制台:

choose one:

1.Tornado
2.FireBall

如何输出这个,例如使用数组,可以吗?

【问题讨论】:

  • 问题很不清楚。当你做什么时,你期望什么输出?但无论如何,我的水晶球告诉我你可能应该使用std::map(顺便说一句,它很容易使用。)
  • 那么...您是在问如何将Tornado 转换为"Tornado" 以便可以打印?
  • " 但是我遇到了一个问题,如何显示我的枚举?" 究竟是哪个问题?你收到错误信息了吗?您的代码显示的内容是否超出您的预期? Edit 并告诉我们更多信息。
  • 问题是不知道怎么实现,我自己写了
  • 创建enums,然后创建文本以匹配枚举与关联的数组和计数器。然后写循环。或者只是使用已经这样做并使用迭代器的std::map

标签: c++ enums


【解决方案1】:

如果您想显示枚举(Tornado、FireBall)而不是 1、2,您可以创建一个单独的函数来执行该显示

#include <iostream>


enum Book {
Tornado,
FireBall,
};

void yourFunction(const Book& book)
{
    switch(book)
    {
        case Book::Tornado:
            std::cout<<"Tornado"<<std::endl;
            break;
        case Book::FireBall:
            std::cout<<"FireBall"<<std::endl;
            break;
        default:
            break;
    }
}

int main()
{
    Book b=Book::FireBall;
    yourFunction(b);
    return 0;
}

【讨论】:

  • 保持函数和枚举同步怎么样?这不是什么可以略读的。此外,通过引用传递是过早的悲观。
  • 如果我需要一次显示我的枚举的所有内容,而不是单独显示呢?
【解决方案2】:

这里描述的一般问题是将已知整数值与文本字符串相关联。解决方案可以像这样简单:

enum Book {
    Tornado,
    Fireball,
    last_index // see below
};
static const char* names[] = {
    "Tornado",
    "Fireball"
};

要显示菜单,只需遍历枚举器:

for (int i = Tornado; i < last_index; ++i)
    std::cout << (i + 1) << '.' << names[i] << '\n';

之所以可以这样做,是因为枚举数从 0 开始加 1,即Tornado 的值为 0,Fireball 的值为 1。last_index 的值为 2。

使用last_index的原因是为了更容易维护代码。如果你添加一个循环不会改变的枚举器:

enum Book {
    Tornado,
    Fireball,
    GladHands,
    last_index // see below
};
static const char* names[] = {
    "Tornado",
    "Fireball",
    "Glad Hands"
};

加上枚举器,GladHands 的值为 2,last_index 的值为 3,所以原来的循环仍然有效。

请注意,这不会根据枚举数的名称生成文本。枚举器的名称有文本版本没有的限制,因此在大多数情况下您确实无法生成文本。特别是,GladHands 没有空格,但它的文本版本有一个。

【讨论】:

  • 我在脑海中想象的,但无法实现!谢谢!
猜你喜欢
  • 2021-08-05
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多