c++ - 使用三元运算符从 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
,但遇到类似的问题。为什么是这样?
解决方案
std::istream
不允许您执行类似in_data = std::cin
或in_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
}
推荐阅读
- delphi - 如何在 Delphi Syndey 10.4 中正确拆分逗号分隔的文本?
- c# - 如何根据运行时条件停止某个属性的更改跟踪
- python - 在 FastAPI 的 Swagger UI 中使用 /token 路由而不是授权按钮时,身份验证不起作用
- c - 为什么在 C 中允许获取函数参数的地址?
- apache-kafka - 处理确认和重新平衡
- haskell - 如何使用 GADT 和 Data.Map 创建类型化的玩具语言环境映射?
- python - pandas infer_freq 返回无
- c++ - 重复执行的多线程 C++ 方法的执行时间,无需检测代码
- flutter - Flutter 将图片保存到本地永久目录
- javascript - 有人可以解释为什么这些 webkit 动画功能之一有效而另一个无效。我知道它的类与 ID,但为什么呢?