【问题标题】:Error when assigning the return of (cin >> someVar) to an istream variable in C++将 (cin >> someVar) 的返回值分配给 C++ 中的 istream 变量时出错
【发布时间】:2018-02-14 20:43:58
【问题描述】:

我刚开始学习 C++ 作为一种附加语言,遇到了标题中提到的问题。这是我开始使用的代码:

#include "HelloWorldWriter.h"
#include <iostream>

using namespace std;

int HelloWorldWriter::getNumberOfRepetitions() {
    cout << "Enter number of Hello Worlds: ";
    int repetitions = 0;
    if(cin >> repetitions){
        if(repetitions > 0){
            return repetitions;
        }
    } else{
        return 0;
    }
}

...

我假设cin &gt;&gt; repetitions 会将用户输入值存储到repetitions 中,如果用户输入了可以解析为整数的内容,则返回true,否则返回false。然后我尝试将cin &gt;&gt; repetitions 的结果分配给布尔值,但它产生了一个错误,说“类型 bool 和 istream 不兼容”。然后我尝试了以下作业:

istream inputSuccessful = cin >> repetitions;

然而这产生了一个错误,说“basic_istream::basic_istream(const basic_istream &) is deleted”。

我现在有以下问题:

1) 当使用cin &gt;&gt; someInt(以整数someInt 作为目标/参数)时,您应该期望什么行为(目标变量中的值、返回值、该运算符下一次调用期间的行为...) ,如果用户输入的单词没有前导数字(即不能解析成整数)?

2) 如何将cin &gt;&gt; someInt 的结果保存在变量中?它必须是什么类型的?该值与布尔表达式有何关系?

【问题讨论】:

标签: c++ cin istream


【解决方案1】:

此声明

istream inputSuccessful = cin >> repetitions;

要求将cin 复制到inputSuccessful。为流删除了复制构造函数,因此会出现错误。但是,复制或引用 cin 是没有意义的,因为您可以对引用执行任何操作,也可以直接使用 cin

您应该改为使用变量bool

bool inputSuccessful(cin >> repetitions);

如果读取repetitions 成功,现在inputSuccessful 将包含true,否则将包含falsethis Q&A 中描述了这种工作方式。

【讨论】:

  • 太好了,谢谢!将其分配给 bool 不起作用,它显示“类型 bool 和 istream 不兼容”。但是,正如您所建议的,我只能使用 cin 作为条件。你能向我解释在cin 的幕后发生了什么吗?是否有任何对象用作布尔条件时调用的特定方法?
  • 加上static_cast 会更好看。作为一个副作用,它看起来也更易读括号(我永远记不住运算符的优先级)。
  • @sildave94 赋值语法不起作用,但初始化语法起作用 (demo)。幕后发生的事情取决于 C++ 的版本。我在答案末尾链接的问答中很好地解释了这一点(为istream 定义了一个隐式转换运算符)。
  • @Drop 我认为带括号的初始化甚至比静态转换更好,并且(显然)包括括号:-)
猜你喜欢
  • 1970-01-01
  • 2011-01-10
  • 2021-03-04
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多