我有一个没有默认构造函数或赋值运算符的类,因此它根据另一个函数的结果在if/else语句中声明和初始化.但后来它表示它超出了范围,即使条件的两个路由都会创建一个实例.
考虑以下示例(int仅用于说明这一点):
#include <iostream>
int main()
{
if(1) {
int i = 5;
} else {
int i = 0;
}
std::cout << i << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在条件结束时,条件中声明的变量是否超出范围?处理没有默认构造函数但构造函数的参数依赖于某些条件的情况的正确方法是什么?
编辑
根据给出的答案,情况更复杂,因此可能必须改变方法.有一个抽象的基类A和两个从A派生的B和C类.如下所示:
if(condition) {
B obj(args);
} else {
C obj(args);
}
Run Code Online (Sandbox Code Playgroud)
改变方法?由于A是抽象的,我不能只声明A* obj并创建适当的类型new.
我确信这个问题之前已经被问过并得到回答,但如果没有正确的术语,我在搜索时遇到困难。
我有两个独特的结构 A 和 B (不是类)。我的代码使用函数重载来以不同的方式处理结构。我不明白如何处理声明多态性。对于伪代码示例,我深表歉意。
if( flag ==1 ){
declare stuct A scoped to main
}
else{
declare stuct B scoped to main
}
Run Code Online (Sandbox Code Playgroud)
上面的伪代码将不起作用,因为声明的范围在 if 语句内。由于我试图描述的范围问题,我的“真实”代码无法编译。
编辑
澄清:
根据指定的标志(arg),我想声明两个不同的结构之一。一旦声明了正确的结构,所有多态性都已由操作重载处理。
谢谢
我正在尝试使用ifstream和istringstream仅使用变量.我知道他们俩都是孩子的istream.所以,我试图只做一个类型的变量istream和初始化取决于一些输入.
真正的问题是我要求用户输入文件路径或文件内容.然后,我将逐行阅读.我试着这样做.
istream * stream;
if(isFile){
ifstream a("fileOrContent");
stream = &a;
} else {
istringstream a("fileOrContent");
stream = &a;
}
getline(stream,line)
// do something with line
Run Code Online (Sandbox Code Playgroud)
我也尝试过这个
ifstream stream;
if(isFile){
ifstream stream("fileOrContent");
} else {
istringstream stream("fileOrContent");
}
getline(stream,line)
// do something with line
Run Code Online (Sandbox Code Playgroud)
目前,我为每个代码使用了两个完整的代码副本.有关我怎么做的任何建议?
谢谢