其他分享
首页 > 其他分享> > c – 返回特定类型对象的工厂函数 – 如何以更好的方式执行

c – 返回特定类型对象的工厂函数 – 如何以更好的方式执行

作者:互联网

我有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)));

但它看起来很难看.那有更好的解决方案吗?或者我应该尝试使用我的函数创建对象的不同方法?

解决方法:

如果要执行shared_ptr的运行时向下转换,请使用std :: dynamic_pointer_cast<>:

std::shared_ptr<B> b = std::dynamic_pointer_cast<B>(createObject(0));

如果要在运行时确定要创建的对象的类型,并且您的尝试是检查返回的对象是否具有类型B,那么我看不到比动态向下转换更好的替代方案.

另一方面,如果您100%确定知道指向对象具有类型B,那么您可以使用std :: static_pointer_cast<>:

std::shared_ptr<B> b = std::static_pointer_cast<B>(createObject(0));

然而,在你100%确定地知道这一点的那一刻,我不明白为什么这样的指令不应该成为:

std::shared_ptr<B> b = std::make_shared<B>();

标签:c,shared-ptr,pointers,factory
来源: https://codeday.me/bug/20190825/1723302.html