是否可以在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;
。
如果您需要三个不同的对象,也许您应该编写三个不同函数。或者可能是一个可以与不同类型一起使用的模板函数。
您想要实现什么?如果您试图声明一个变量并稍后使用它,那么:
为此使用继承和工厂。
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的家伙在他们的教程中所说的那样。这里唯一的问题是您确实创建了两个对象。声明中的对象本身(MyClass3 object()),然后是变量在内部执行的复制。
相关文章:
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 指针数据类型变量如何包含对象?
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 将内置类型变量传递给只有一个类类型参数的"+"运算符函数时自动类型转换的构造函数
- 如何为结构类型变量赋值
- 如何将字符类型变量附加到字符串中?
- 共享或私有 openmp 代码中的结构化类型变量
- 有没有办法在 c++ 中制作类型变量?
- 从其他类声明类类型变量会给出 C2143 错误(在"*"之前缺少";")
- 如何检查类中定义的枚举类型变量是否被分配给?
- 将子类实例保存在父类型变量中并通过父变量使用 Child 函数?
- 是否可以在没有结构的情况下创建新的类型变量?
- 为什么类型变量;不调用默认 CTR
- 如何使用CIN将输入整数值获取到char类型变量中
- 如何为 char** 类型变量提供适当的值,以便将其分配给字符串变量
- 在C++标准中哪里说必须初始化 const 内置类型变量的定义
- 为什么可以将其他类型变量用作C 中常量参考参数参数的参数
- Eclipse CDT 打开声明的自动类型变量
- 如何计算长长类型变量中的位数
- 将自动类型变量初始化为零.这种类型安全吗?