gpt4 book ai didi

c++ - 我如何访问一个指针子类方法,那些方法是子类独有的?

转载 作者:行者123 更新时间:2023-11-30 01:33:39 25 4
gpt4 key购买 nike

我的程序的一部分有两种可能的情况:(1) 如果用户只提供 2 个命令行参数,则从标准输入 (cin) 获取输入 (2) 如果用户提供 3 个命令行参数(最后一个是文件名),从文件中获取输入。为了不为两个选项重复使用相同的代码,我尝试使用指向 cin 和 ifstream 的父类(super class)的指针,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;

最佳答案

通过获取其缓冲区动态分配 std::cin 的“拷贝”。将内存存储在 std::unique_ptr 中也是理想的选择,因为您不必担心手动删除指针。

#include <memory>

int main(int argc, char* argv[]) {
std::unique_ptr<std::istream> currentStream( argc == 3
? std::make_unique<std::ifstream>(argv[2])
: std::make_unique<std::istream>(std::cin.rdbuf())
);

// will only fail when the file cannot open
if (!currentStream) {
std::cerr << "FILE COULD NOT BE OPENED\n";
return 1;
}

std::string myLine;
// go line by line and translate it
while (std::getline(*currentStream, myLine)) {
std::cout << rot13(myLine) << std::endl;
}
}

关于c++ - 我如何访问一个指针子类方法,那些方法是子类独有的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58106964/

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