Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在开关中声明类对象,然后在开关外部使用该变量_C++_Oop_Switch Statement - Fatal编程技术网

C++ 在开关中声明类对象,然后在开关外部使用该变量

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语句中声明类对象,然后在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':
{
    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中存储的指针不为空。