簡體   English   中英

是否可以在c ++中聲明具有不同類型的變量?

[英]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;
}

但是在編譯時,編譯器返回以下錯誤:

  • 穿越了'MyClass myObject'的初始化
  • 聲明'MyClass2 myObject'沖突
  • “ myObject”以前有一個聲明為“ MyClass myObject”

有什么辦法解決嗎?

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告訴您的有關聲明變量的內容。 我認為您要使用多態性。 那就是使MyClass1MyClass2MyClass3成為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM