gpt4 book ai didi

c++ - 如何将对象定义为一种类型,然后再将其声明为子类型?

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:14 25 4
gpt4 key购买 nike

我有一些代码需要从 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
}

这不会编译,第 2 行出现错误:“没有匹配的构造函数来初始化‘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;

注意:此解决方案并不理想,因为您最终需要手动删除流。更好的方法是依靠智能指针,它会自动删除您的对象。

关于c++ - 如何将对象定义为一种类型,然后再将其声明为子类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49441305/

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