是否可以在c++中声明具有不同类型的变量

Is it possible declare a variable with different types in c++?

本文关键字:同类型 变量 声明 c++ 是否      更新时间:2023-10-16

我正试图声明这样一个变量:

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;

如果您需要三个不同的对象,也许您应该编写三个不同函数。或者可能是一个可以与不同类型一起使用的模板函数。

您想要实现什么?如果您试图声明一个变量并稍后使用它,那么:

为此使用继承和工厂。

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的家伙在他们的教程中所说的那样。这里唯一的问题是您确实创建了两个对象。声明中的对象本身(MyClass3 object()),然后是变量在内部执行的复制。