如果子类是唯一的,我该如何访问指针的子类的方法?

问题描述 投票:1回答:1

我的程序的一部分有两种可能的情况:(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;
c++ pointers subclass c++-standard-library
1个回答
0
投票

塔斯评论中的方法正确。您不能直接在currentStream上调用该方法,而必须在强制转换接口上调用它。

ifstream* stream = dynamic_cast<ifstream*>(currentStream);
if (ifstream) {
     ifstream->close();
}

我还认为您应该更改代码以不依赖于动态转换,无论是新接口还是单独的方法。

© www.soinside.com 2019 - 2024. All rights reserved.