gpt4 book ai didi

c++ - 返回特定类型对象的工厂函数——如何以更好的方式做到这一点

转载 作者:太空狗 更新时间:2023-10-29 20:27:45 24 4
gpt4 key购买 nike

我有 3 个类 BCD,它们派生自一个基类 A:

class A
{
// body
};

class B : public A
{
// body
};

class C : public A
{
// body
};

class D : public A
{
// body
};

我想创建一个工厂函数,让我创建特定类型的对象(BCD)并返回它作为指向 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++ - 返回特定类型对象的工厂函数——如何以更好的方式做到这一点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15272090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com