C++ 在开关中声明类对象,然后在开关外部使用该变量
有办法解决这个问题吗?我在switch语句中声明类对象,然后在switch之外使用该变量,只有在每种情况下都使用剩余的代码,这不是很有效。下面是我的代码C++ 在开关中声明类对象,然后在开关外部使用该变量,c++,oop,switch-statement,C++,Oop,Switch Statement,有办法解决这个问题吗?我在switch语句中声明类对象,然后在switch之外使用该变量,只有在每种情况下都使用剩余的代码,这不是很有效。下面是我的代码 switch (shape) { case 'q': { Quad geo(a,b,c,d); } break; case 'r': { Rectangle geo(a,b,c,d); } break; case 't': { Trapezoid geo(a,b,c,d); } break; case 'p': {
switch (shape)
{
case 'q':
{
Quad geo(a,b,c,d);
}
break;
case 'r':
{
Rectangle geo(a,b,c,d);
}
break;
case 't':
{
Trapezoid geo(a,b,c,d);
}
break;
case 'p':
{
Parrelogram geo(a,b,c,d);
}
break;
case 's':
{
Square geo(a,b,c,d);
}
break;
default:
break;
}
geo.print();//obviously wont work
不,这是不可能的
geo
在编译时只能有一种类型,并且在运行时不能更改
您可以使用动态分配和多态性做类似的事情,但这可能不是解决问题的最佳方案
了解到Quad是其他类的基类,以下可能是一个可用的解决方案:
Quad* geo = 0;
switch (shape) {
case 'q':
geo = new Quad(a,b,c,d);
break;
case 'r':
geo = new Rectangle(a,b,c,d);
...
default:
break;
}
if (geo) geo->print();
delete geo; // Ok if geo is 0.
这个解决方案并不特别漂亮,主要是因为它直接使用原始指针和
new
和delete
。更完善的版本将使用工厂
模式,返回智能指针。有一个可打印
界面,如下所示
struct IPrintable
{
virtual ~IPrintable() {}
virtual void Print() = 0;
};
然后,从IPrintable
派生类型Quad
,矩形
等,即实现该接口。然后,您的代码如下所示:
std::unique_ptr<IPrintable> pShape;
switch(shape)
{
case quad:
pShape.reset(new Quad(...));
case rect
pShape.reset(new Rect(...));
}
if(pShape)
pShape->Print();
std::独特的形状;
开关(形状)
{
案例组:
pShape.reset(新的四边形(…);
大小写
形状重置(新矩形(…);
}
if(pShape)
pShape->Print();
当然,如果通用功能不仅仅是打印,那么您也可以将这些功能添加到界面中。还可以看看访问者模式。它可能对您有帮助,也可能没有帮助,这取决于您的问题的具体情况。请执行“Quad”、“Rectangle”类型,etc继承自同一基类?问题是,我有一个overidden打印函数,因此只有在输入不同的shape@user954004:我是否理解
print
不是虚拟功能?它应该是。是否只声明基类或所有派生类的虚拟工作?您应该更喜欢使用智能指针来管理内存。如果print
抛出,则对象将泄漏+1.@user954004:所有重写都必须是虚拟的,但是,将基成员函数声明为virtual
将具有这种效果,因此您只需要在该级别执行该操作(我更喜欢在所有级别将其声明为文档形式,它将是虚拟的,无论关键字是否存在于派生类型中,为什么要隐藏它?)在这种情况下,unique\u ptr
将是一个更好的选择(为什么人们总是使用shared\u ptr
?),因为对象不是共享的,但其余的代码将完全相同+1@David我同意你的看法。已编辑。在调用pShape->Print()
之前,需要确保pShape中存储的指针不为空。