【发布时间】:2019-09-25 21:47:41
【问题描述】:
我的程序的一部分有两种可能的情况:(1)如果用户只提供 2 个命令行参数,则从标准输入(cin)获取输入(2)如果用户提供 3 个命令行参数(最后一个是文件名),从文件中获取输入。为了不为这两个选项重用相同的代码,我尝试使用指向 cin 和 ifstream 的超类的指针,istream 用于两种输入方式。
我的问题是,在下面代码的第 5 行和第 22 行,我试图引用仅可用于子类 ifstream(打开和关闭)的方法。根据我的逻辑,如果调用这些方法,则指针必须指向 ifstream 类型,但程序无法编译,因为这些方法未在 istream 类中定义。
有没有办法解决这个问题?
istream *currentStream;
if (argc == 3) {
// Handle optional file input
currentStream = new ifstream(argv[2]);
currentStream->open(argv[2]);
if (currentStream->fail()) {
cerr << "FILE COULD NOT BE OPENED\n";
return 1;
}
} else {
currentStream = &cin;
}
string myLine;
// go line by line and translate it
while (getline(*currentStream, myLine)) {
if (currentStream->eof()) {
break;
}
cout << rot13(myLine) << endl;
}
if (dynamic_cast<ifstream*>(currentStream)) {
currentStream->close();
}
// handle pointer
delete currentStream;
currentStream = NULL;
return 0;
【问题讨论】:
-
您可能希望将它们包装在单独的类中,您可以在其中调用
open和close,而没有ifstream的类将什么都不做,而另一个类实际上会打开和关闭ifstream。虽然你对dynamic_cast有正确的想法,但你应该get 像if (ifstream* filestream = dynamic_cast...) { filestream->close()这样的回报 -
我开始写答案,但后来我意识到,导致您的问题的那些行:没有必要。如果您将值传递给
std::ifstream的构造函数 - 它会自行调用open。并且调用close是不必要的,因为std::ifstream的析构函数会调用它。这留下了一个真正的问题:delete currentStream;是未定义的行为,当argc != 3时,由于它试图delete &cin。
标签: c++ pointers subclass c++-standard-library