我的程序的一部分有两种可能的情况:(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;
塔斯评论中的方法正确。您不能直接在currentStream上调用该方法,而必须在强制转换接口上调用它。
ifstream* stream = dynamic_cast<ifstream*>(currentStream);
if (ifstream) {
ifstream->close();
}
我还认为您应该更改代码以不依赖于动态转换,无论是新接口还是单独的方法。