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

时间:2011-06-16 06:40:35

标签: c++ variables object initialization

我正在尝试声明一个这样的变量:

switch(foo){
    case 1:
        MyClass myObject();
        break;
    case 2:
        MyClass2 myObject();
        break;
    case 3:
        MyClass3 myObject();
        break;
}

但是在编译时,编译器会返回这些错误:

  • 跨越'MyClass myObject'的初始化
  • 冲突声明'MyClass2 myObject'
  • 'myObject'之前的声明为'MyClass myObject'

有什么想法解决这个问题吗?

5 个答案:

答案 0 :(得分:6)

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;
}

答案 1 :(得分:3)

不,你不能做那样的事情。除了交换机内部的命名冲突之外,还有一个问题就是当你离开交换机时变量超出了范围。

最重要的是,MyClass myObject();声明一个返回MyClass的函数。您可以将变量声明为MyClass myObject;

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

答案 2 :(得分:0)

你想要达到什么目的?如果您尝试声明变量并在以后使用它,那么:

使用继承和工厂。

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是抽象的,并且所有类型的对象都是从它继承的。

答案 3 :(得分:0)

你可以查看Bo Persson告诉你的关于声明变量here的内容。我认为你想要做的是使用多态。这是使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语句的范围内使用。

答案 4 :(得分:0)

您可以尝试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;
    }
}

然后创建一个访问者,因为他们在他们的教程中说道。 这里唯一的问题是你真的创建了两个对象。声明中的对象本身(MyClass3 object())然后复制变量就在里面。