首页 > 解决方案 > 使用三元运算符从 cin 或文件中选择 istream

问题描述

我想要一个类的成员变量,它根据用户输入的字符串存储输入流。例如。

#include <string.h>
#include <iostream>
#include <fstream>

class myInput {
public:
    myInput(std::string file_name);
    myInput() = delete;

protected:
    std::istream& in_data;
};
 
myInput::myInput(std::string file_name)
    : in_data((file_name == "-") ? std::cin : std::ifstream(file_name)){}

void main() {
    myInput("file.txt");
}

但是我收到以下错误

error: use of deleted function ‘std::basic_istream<_CharT, _Traits>::basic_istream(const std::basic_istream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits]’
error: ‘std::basic_istream<_CharT, _Traits>::basic_istream(const std::basic_istream<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits]’ is protected within this context

我也尝试过ifstream单独创建对象并将其分配给in_data,但遇到类似的问题。为什么是这样?

标签: c++iostream

解决方案


std::istream不允许您执行类似in_data = std::cinin_data = std::ifstream("file.txt")删除赋值运算符的操作。

另一种解决方案是使用指向std::istream.

class myInput {
public:
    myInput(std::string file_name);
    virtual ~myInput() { if (bIsHeapAllocated) delete in_data; } // delete the heap allocation if done.
    myInput() = delete;

protected:
    std::istream* in_data = nullptr;
    bool bIsHeapAllocated = false;    // You can make this a private member if you don't want your inherited classes knowing this.
};

myInput::myInput(std::string file_name)
{
    if (file_name == "-")
        in_data = &std::cin;
    else
        in_data = new std::ifstream(file_name), bIsHeapAllocated = true;    // Allocate the ifstream in heap
}

推荐阅读