Pio*_*cki 3 c++ pointers factory shared-ptr
我有3个班B,C,D,从一个基类派生A:
class A
{
// body
};
class B : public A
{
// body
};
class C : public A
{
// body
};
class D : public A
{
// body
};
Run Code Online (Sandbox Code Playgroud)
我想创建一个工厂函数,让我创建特定类型(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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,如果我有一个类型的指针B,我想将B工厂创建的对象分配给它.我想到的唯一合理的解决方案是:
std::shared_ptr<B> b = std::shared_ptr<B>(dynamic_cast<B*>(createObject(0)));
Run Code Online (Sandbox Code Playgroud)
但它看起来很难看.那有更好的解决方案吗?或者我应该尝试使用我的函数创建对象的不同方法?
如果你想执行a的运行时向下转换shared_ptr,而是使用std::dynamic_pointer_cast<>:
std::shared_ptr<B> b = std::dynamic_pointer_cast<B>(createObject(0));
Run Code Online (Sandbox Code Playgroud)
如果要在运行时确定要创建的对象的类型,并且您的尝试是检查返回的对象是否具有类型B,那么我看不到比动态向下转换更好的替代方案.
另一方面,如果您100%确定知道指向对象具有类型B,那么您可以使用std::static_pointer_cast<>:
std::shared_ptr<B> b = std::static_pointer_cast<B>(createObject(0));
Run Code Online (Sandbox Code Playgroud)
然而,在你100%确定地知道这一点的那一刻,我不明白为什么这样的指令不应该成为:
std::shared_ptr<B> b = std::make_shared<B>();
Run Code Online (Sandbox Code Playgroud)