簡體   English   中英

如何將一個對象定義為一種類型,然后再將其聲明為子類型?

[英]How can I define an object as one type, then later declare it as a sub-type?

我有一些代碼需要從istringstream或ifstream讀取數據。 我對C ++不太了解,但是我在其他語言中的經驗告訴我,我應該只擁有一個istream變量(ifstream和istringstream的父類型),然后再將其設置為istringstream或ifstream。 例如,這是在Java中的樣子:

String word;
IStream stream;

if (someCondition) {
    stream = new IStringStream("banana");
} else {
    stream = new IFStream("apple.txt");
}

while (word = is.read()) {
    // do some stuff
}

這種語法在Java和其他類似語言中不會有問題,但是我無法在C ++中使用它。 這是我的代碼現在的樣子:

string word;
istream stream;

if (someCondition) {
    string mystr = "banana";
    istringstream stream(mystr);
} else {
    string myfile = "apple.txt";
    ifstream stream(myfile);
}

while(stream >> word) {
    // do some stuff
}

這不會編譯,並在第二行顯示錯誤:“沒有匹配的構造函數來初始化'istream'(又名'basic_istream')”。 為了使C ++代碼像我上面編寫的Java偽代碼示例一樣工作,我需要做些什么更改?

由於您來自Java,因此快速的經驗法則是,對於多態對象,您需要一個指針(星號* ),一個引用(&符& ),智能指針或其他設置間接方式的方法。

這是解決該問題的語法示例:

string word;
istream *stream;

if (someCondition) {
    string mystr = "banana";
    stream = new istringstream(mystr);
} else {
    string myfile = "apple.txt";
    stream = new ifstream(myfile);
}

while((*stream) >> word) {
    // do some stuff
}

delete stream;

注意:此解決方案不是理想的,因為您最終將手動刪除流。 更好的方法是依靠智能指針,該指針會自動刪除對象。

您應該將使用流的部分放在帶有std::istream&的函數中,然后只需傳入您想使用的任何內容。

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

void useStream(std::istream& stream) {
    std::string word;
    while (stream >> word)
        std::cout << word << ' ';
}

int main() {
    if (someCondition) {
        std::string str = "The best program in the world";
        std::stringstream foo(str);
        useStream(foo);
    }
    else {
        std::ifstream file("text.txt");
        useStream(file);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM