我们可以在if-else语句中声明一个对象吗?

时间:2019-03-11 17:28:37

标签: c++

此代码是使用数组以及模板类来实现队列的主要功能。

[...new Set(data.map(x=>x.typeConviveId))]

我不明白的是,为什么在const data = [{serviceID: 22, quantite: 120, typeConviveId: 6}, {serviceID: 23, quantite: 240, typeConviveId: 6}, {serviceID: 24, quantite: 100, typeConviveId: 7}, {serviceID: 25, quantite: 150, typeConviveId: 7}]; const result = [...new Set(data.map(x => x.typeConviveId))].map( id => data .filter(x => x.typeConviveId === id) .reduce((acc, val) => { return { ...acc, [val.serviceID]: '' + val.quantite } }, { typeConviveId: '' + id }) ); console.log(result);语句下面的行中出现错误int main(){ int choice, n; cout<<"Enter 1 for integer 2 for double\n"; cin >> choice; cout<<"Enter the size of queue\n"; cin>>n; if (choice == 1) queue<int> obj(n); else queue<double> obj(n); for(;;){ cout<<"1:Insertrear 2:Deletefront 3:Display 4:Exit\n"; cin >> choice; switch(choice){ case 1:obj.insertRear();break; case 2:obj.deleteFront(); break; case 3:obj.display();break; default: return 0; } } return 0; }

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

简单的答案是:是的,您可以在ifelse块中声明对象,但是在离开这些块时它们将被销毁。实际上,在if块之后,不再有obj

您的想法是,由一个对象表示不同的数据类型,这取决于其他运行时变量在c ++中将不起作用。 C ++具有强大的类型系统,这使您的代码想法无法实现。可以在python之类的语言上完成,但在c ++上则完全不能完成。

如果您具有相同的算法(应将其用于不同的数据类型),则可以使用模板。但这仍然会多次生成完整的代码,每种使用的数据类型只有一个实例。

在C ++ 17中,您可以使用std::variant来容纳一个容器,该容器在运行时可以包含不同的数据类型。但这要付出代价,那就是要有一个附加值(tag),它可以告诉代码的其余部分当前在变量本身中存储的是哪种数据类型。每次访问时,编译器必须生成类似if ( data == int ) then ...的东西,详细地讲,它的处理方式将有所不同(用于调用不同方法的跳转表)。 variant也可以在C ++ 17之前的boost等其他库中使用。

答案 1 :(得分:1)

  

我们可以在if-else语句中声明一个对象吗?

是的

  

我不明白的是,为什么在switch语句下面的行中未在此范围中声明错误“ obj”。

在if语句中声明的局部变量的(潜在)作用域扩展到声明该语句的末尾。示例:

if (choice == 1) {
    queue<int> obj(n);
    // obj is in scope here
}
// obj is no longer in scope
else {
    queue<double> obj(n);
    // obj that is in cope here is not the same variable
}
// neither obj is in scope here

您正试图从其范围之外引用该变量。该对象的生命周期已经结束,并且该名称不再在范围内。


C ++是一种静态类型的语言。变量的类型必须在编译时已知,并且不能在运行时更改。

典型的解决方案是使用功能模板:

template<class T>
int do_things() {
    queue<T> obj(n);
    for(;;){
        // ...
    }
}

// in main
if (choice == 1)
    return do_things<int>();
else
    return do_things<double>();

答案 2 :(得分:0)

由于作用域限制,您遇到错误。 obj的范围以if / else结尾,在外部不可见。

对于您的用例,间接访问可能会有所帮助。如果模板队列类具有基类,则可以在if else范围之外定义指向该基类的指针,并在if / else内部分配强类型实例,并在switch语句中使用该基类指针。