2

有什么方法可以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;
}
4

2 回答 2

3

std::static_pointer_cast如果您想明确提及演员表,可以使用 a :

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_sharednew. new这里有一个性能问题,我认为避免不平衡/ deletes是一件好事。

于 2013-08-12T12:29:58.120 回答
2

我最终来到这里是因为我没有将我的继承指定为公开的。所以我有:

class Bar : Foo 

代替:

class Bar : public Foo 

shared_ptr<Foo> foo = make_shared<Bar>(...)按预期添加公共制作的作品

于 2020-06-01T15:38:12.017 回答