我正在尝试声明一个这样的变量:
switch(foo){
case 1:
MyClass myObject();
break;
case 2:
MyClass2 myObject();
break;
case 3:
MyClass3 myObject();
break;
}
但是在编译时,编译器会返回这些错误:
有什么想法解决这个问题吗?
答案 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的内容。我认为你想要做的是使用多态。这是使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语句的范围内使用。
答案 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())然后复制变量就在里面。