我有3个班B
,C
,D
,从一个基类A
得出:厂功能 - 如何做到这一点的更好的方式
class A
{
// body
};
class B : public A
{
// body
};
class C : public A
{
// body
};
class D : public A
{
// body
};
我想创建一个工厂功能,可以让我创建特定类型(B
,C
或D
)的对象,并为返回一个指向它A
类:
typedef std::shared_ptr<A> a_ptr;
a_ptr createObject(int type)
{
switch(type)
{
case 0:
return a_ptr(new B());
break;
case 1:
return a_ptr(new C());
break;
case 2:
return a_ptr(new D());
break;
}
}
然后,如果我有例如B
类型的指针,我想将工厂创建的对象指定给B
。对我而言,唯一合理的解决方案是:
std::shared_ptr<B> b = std::shared_ptr<B>(dynamic_cast<B*>(createObject(0)));
但它看起来很丑。有没有更好的解决方案?或者,也许我应该尝试用我的函数创建对象的不同方式?
如果您基于运行时值创建对象(这里是'int type'),那么就没有可能返回值被“正确”键入(如果'createObject'是一个模板,这将是可能的,但然后你只能够静态创建),所以需要强制转换。你可以设计*隐藏它的方式,但恕我直言,这不是一个好主意。演员应该是突出的。 – Jon 2013-03-07 13:14:50
C++是静态类型的。也就是说,你必须在编译时知道每个表达式的类型。 (在你的情况下,应该是'A'类型。) – 2013-03-07 13:15:59
请注意,'shared_ptr's有自己的[cast methods](http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast)。 – 2013-03-07 13:18:04