[英]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.