[英]Is it possible declare a variable with different types in c++?
我正在嘗試聲明這樣的變量:
switch(foo){
case 1:
MyClass myObject();
break;
case 2:
MyClass2 myObject();
break;
case 3:
MyClass3 myObject();
break;
}
但是在編譯時,編譯器返回以下錯誤:
有什么辦法解決嗎?
switch
語句的主體是單個作用域。 如果要聲明單個case
局部變量,則必須使用大括號在case
創建一個塊:
switch (foo) {
case 1: {
MyClass myObject();
break;
}
case 2: {
MyClass2 myObject();
break;
}
case 3: {
MyClass3 myObject();
break;
}
}
如果您發現經常這樣做,則可以考慮在每種case
為代碼創建函數,以獲得更易於理解和維護的代碼:
switch (foo) {
case 1:
HandleCase1();
break;
case 2:
HandleCase2();
break;
case 3:
HandleCase3();
break;
}
不,你不能那樣做。 除了開關內部的命名沖突外,還存在一個問題,即當您離開開關時,變量超出了范圍。
最重要的是, MyClass myObject();
聲明一個返回MyClass
的函數。 您可以將變量聲明為MyClass myObject;
。
如果需要三個不同的對象,也許應該編寫三個不同的函數。 或者是可以與不同類型一起使用的模板函數。
您想達到什么目的? 如果嘗試聲明變量並在以后使用它,則:
為此使用繼承和Factory。
ParentObject * FactoryCreator::createObject(cstring type){
ParentObject * theObject = null;
switch(type){
case "type1":
theObject = new ObjectType1();
break;
case "type2":
theObject = new ObjectType2();
break;
...
}
return theObject;
}
並從您的代碼。
ParentObject object = FactoryCreator::createObject("type you want");
而且,您必須創建一個結構,其中ParentObject是抽象的,並且所有類型的對象均從該結構繼承。
您可以在此處查看Bo Persson告訴您的有關聲明變量的內容。 我認為您要使用多態性。 那就是使MyClass1
, MyClass2
和MyClass3
成為BaseClass
派生對象,然后您可以執行以下操作:
BaseClass *myObject;
switch (foo) {
case 1: {
myObject = new MyClass1;
break;
}
case 2: {
myObject = new MyClass2;
break;
}
case 3: {
myObject = new MyClass3;
break;
}
}
現在,您可以讓myObject表現得像聲明的對象一樣,並且不僅可以在該switch語句的范圍內使用它。
您可以嘗試boost :: variant並使用訪問者:
typedef boost::variant<MyClass1, MyClass2, MyClass3> MyVariantClass;
boost::shared_ptr<MyVariantClass> myObject;
switch (foo) {
case 1: {
MyClass1 object();
myObject = boost::shared_ptr<MyVariantClass>(new MyVariantClass(object))
break;
}
case 2: {
MyClass2 object();
myObject = boost::shared_ptr<MyVariantClass>(new MyVariantClass(object))
break;
}
case 3: {
MyClass3 object();
myObject = boost::shared_ptr<MyVariantClass>(new MyVariantClass(object))
break;
}
}
然后像Boost Guys在教程中所說的那樣創建訪客。 這里唯一的問題是您確實創建了兩個對象。 對象本身在聲明中(MyClass3 object()),然后在變量內部進行復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.