对于抽象类型,我有什么方法可以使用make_shared
代替shared_ptr
吗?
示例:
#include <memory>
#include <vector>
class Foo
{
public:
virtual void fooFunc() = 0;
};
class Bar : public Foo
{
public:
void fooFunc() {};
};
int main()
{
std::vector< std::shared_ptr<Foo> > vec;
vec.push_back(std::shared_ptr<Foo>(new Bar()));
//vec.push_back(std::make_shared<Foo>(new Bar())); //doesn't work because Foo is abstract
return 0;
}
答案 0 :(得分:3)
如果您想明确提及演员表,可以使用std::static_pointer_cast
:
int main()
{
std::vector<std::shared_ptr<Foo>> vec;
vec.push_back(std::static_pointer_cast<Foo>(std::make_shared<Bar>()));
}
但没有它也可以:
vec.push_back(std::make_shared<Bar>());
以下是演示行为的演示:Demo
我建议不要将std::make_shared
与new
结合使用。这里有一个性能问题,在我看来,避免不平衡new
/ delete
是件好事。
答案 1 :(得分:1)
我到这里结束了,因为我没有将继承指定为公开。所以我有:
class Bar : Foo
代替:
class Bar : public Foo
增加公众参与shared_ptr<Foo> foo = make_shared<Bar>(...)
的工作