2011-11-22 38 views
2

是否有解决此问题的方法?在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 
+1

类型'Quad','Rectangle'等是否从同一个基类继承? – hmjd

+0

是Quad是底座 – user954004

回答

3

有一个IPrintable接口,这样

struct IPrintable 
{ 
    virtual ~IPrintable() {} 
    virtual void Print() = 0; 
}; 

然后,派生类型QuadRectangle,从IPrintable等,即实现该接口。然后你的代码看起来是这样的:

std::unique_ptr<IPrintable> pShape; 
switch(shape) 
{ 
    case quad: 
     pShape.reset(new Quad(...)); 
    case rect 
     pShape.reset(new Rect(...)); 
} 
if(pShape) 
    pShape->Print(); 

当然,如果通用的功能比打印更多,你可以添加这些功能,接口为好。也看看访客模式。根据问题的具体情况,它可能对您有所帮助。

+1

'unique_ptr'在这种情况下会是更好的选择(为什么人们总是使用'shared_ptr' ??),因为对象不是* shared *,但其余代码将完全相同+1 –

+0

@David : 我赞同你。编辑。 –

+0

需要确保pShape中存储的指针在调用pShape-> Print()之前不为null。 – hmjd

1

不,这是不可能的。 geo在编译时只能有一种类型,并且在运行时不能更改。

你可以做一些类似的动态分配和多态,但它可能不是你的问题的最佳解决方案。

随着这四是基类中的其他人的知识,下面可能是一个可用的解决方案:

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. 

这个解决方案不是特别漂亮,主要是因为它使用原始指针和直接newdelete 。更精美的版本将使用Factory模式,返回一个智能指针。

+0

让我试试这个 – user954004

+0

这个问题是我有一个超级打印功能,所以如果我输入不同的形状,它只能称为四打印功能 – user954004

+0

@ user954004:我知道'print'不是一个虚拟功能?它应该是。 –