【问题标题】:enum type can not accept cin commandenum 类型不能接受 cin 命令
【发布时间】:2012-04-29 11:18:37
【问题描述】:

请看这段代码:

#include <iostream>
using namespace std;
int main()
{

    enum object {s,k,g};
    object o,t;

    cout << "Player One: "; cin >> o;
    cout << "Player Two: "; cin >> t;

    if (o==s && t==g) cout << "The Winner is Player One.\n";
    else if (o==k && t==s) cout << "The Winner is Player One.\n";
    else if (o==g && t==k) cout << "The Winner is Player One.\n";
    else if (o==g && t==s) cout << "The Winner is Player Two.\n";
    else if (o==s && t==k) cout << "The Winner is Player Two.\n";
    else if (o==k && t==g) cout << "The Winner is Player Two.\n";
    else cout << "No One is the Winner.\n";
        return 0;
}

编译时我会得到这个错误:no match for 'operator&gt;&gt;' in 'std::cin &gt;&gt; o 我正在使用代码块。那么这段代码有什么问题呢?

【问题讨论】:

标签: c++ enums


【解决方案1】:

枚举没有运算符>>()。你可以自己实现一个:

std::istream& operator>>( std::istream& is, object& i )
{
    int tmp ;
    if ( is >> tmp )
        i = static_cast<object>( tmp ) ;
    return is ;
}

当然,如果你只是 cin 一个整数并自己转换会更容易。只想向您展示如何编写 cin >> 运算符。

【讨论】:

    【解决方案2】:

    您是否希望能够输入“s”、“k”或“g”并将其解析为您的枚举类型?如果是这样,您需要定义自己的流运算符,如下所示:

    std::istream& operator>>(std::istream& is, object& obj) {
        std::string text;
        if (is >> text) {
            if (text == "s") {
                obj = s;
            }
            // TODO: else-if blocks for other values
            // TODO: else block to set the stream state to failed
        }
        return is;
    }
    

    【讨论】:

    • 如果它只是一个字符,char + switch 将使代码更易于阅读。否则,unordered_map&lt;std::string, object&gt;
    • 我同意 switch 的事情,但不想通过检查输入长度为 1 来使我的答案复杂化。不过,我不同意使用 unordered_map,因为它不是少量值的有效数据结构。如果您想要更多数据驱动的东西,我建议使用 std::pairs 数组,如果只有几个元素,则仅使用 std::find 进行线性搜索。如果有一天有成千上万的玩家,很容易从那里进行二分搜索,甚至构建哈希表。 :)
    • 不用担心效率问题,97% 的时间 ;) unordered_map 提供了一个自然的按键查找界面,所以它开箱即用。如果你想要效率,你需要避免构造函数并用 POD 构建你的数组,以便它的初始化可以完全在静态初始化期间完成,并且不需要任何 malloc/new 调用......但它是额外的工作小奖励。 KISS 说:unordered_mapmap
    • 内部if条件不应该是if (text == "s")吗?
    • @shobhu 是的,当然,已修复,谢谢。花了 9 年的时间才有人注意到!
    【解决方案3】:

    如果您不熟悉 运算符重载 概念并想要快速修复,只需使用:

    scanf("%d%d", &o, &t);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2021-10-24
      • 2021-03-29
      相关资源
      最近更新 更多