gpt4 book ai didi

c++ - 在C++中,如何根据运行时条件构造引用不同istream对象的对象?

转载 作者:行者123 更新时间:2023-12-02 10:06:59 24 4
gpt4 key购买 nike

我想设计一个从文件或控制台读取的对象。如果有命令行参数,则假定该参数为文件名,并且将从文件中读取代码。否则,该代码将从标准控制台cin中读取。由于ifstream对象和cin都是从istream派生的,因此我想在类中存储对istream&对象或ifstreamcin引用。下面是该类的代码:

#include <iostream>
#include <fstream>
#include <sstream>

class Reader {
public:
Reader(std::istream& is) : is(is) {}
private:
std::istream& is;
};

但是在尝试根据运行时条件创建此类对象时遇到了一个问题。尝试如下:
int main(int argc, char *argv[]) {
if (argc > 1) { //read from file
std::ifstream in_f(argv[1]);
if (in_f)
LineReader reader(in_f);
}
else { //read from console (standard input)
LineReader reader(std::cin);
}

//work on reader ...

return 0;
}

问题是, Reader对象是在条件语句中构造的。执行结束后,它将消失。但是我需要这个对象在构造之后要做很多工作。因此,我应该在条件之外定义一个 Reader对象,但是看不到在条件之前对其进行初始化的任何方法。我也不知道初始化后如何“分配”对 istream的引用,因为无法更改引用。另外请注意,不能复制 istream类。因此,如果我想存储对 Reader的引用并根据运行时的条件对其进行初始化,那么请教我如何编写 istream类?我的想法是,用于处理来自控制台或文件的输入的代码完全相同。我想重用一个变量来表示不同类型的输入流。谢谢。

PS:我使用的是C++ 11,该代码将在Windows和Ubuntu中运行。

最佳答案

您可以简单地为// work on reader创建一个函数:

void do_work(LineReader& reader)
{
// work on reader
}


int main(int argc, char *argv[]) {
if (argc > 1) { //read from file
std::ifstream in_f(argv[1]);
if (in_f) {
LineReader reader(in_f);
do_work(reader);
}
}
else { //read from console (standard input)
LineReader reader(std::cin);
do_work(reader);
}
}

或重新组织您的代码以获得对 std::istream的引用:
std::istream& get_istream(std::ifstream& in_f, int argc, char* argv[])
{
if (argc > 1) { //read from file
in_f.open(argv[1]);
}
if (in_f) {
return in_f;
} else {
return std::cin;
}
}


int main(int argc, char *argv[]) {
std::ifstream in_f;
LineReader reader(get_istream(in_f, argc, argv));

// work on reader
}

关于c++ - 在C++中,如何根据运行时条件构造引用不同istream对象的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59766185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com