纯虚拟和std :: shared_ptr

时间:2014-04-11 12:30:18

标签: c++ c++11 shared-ptr pure-virtual

可能我只是错过了文档中的内容(或者只是无法进行正确的Google搜索),但我遇到了shared_ptr和纯虚函数的问题。

这是一个有效的简短例子:

class Base
{
public:
    virtual int stuff() = 0;
};

class Derived : public Base
{
public:
    virtual int stuff() {return 6;}
};

class Container
{
public:
    Container() : m_x( 0 ) {}
    Container(Base* x) : m_x(x) {} 

private:
    Base* m_x;
};

由于我想使用新的花哨std::shared_ptr,我将Container修改为:

class Container
{
public:
    Container() : m_x( std::make_shared<Base>() ) {}
    Container(const std::shared_ptr<Base>& x) : m_x(x) {} 

private:
    std::shared_ptr<Base> m_x;
};

显然,这不起作用,clang和其他编译器抱怨:error: allocating an object of abstract class type 'Base'Container() : m_x( std::make_shared<Base>() ) {}

所以,问题是:如何使用std::shared_ptr

3 个答案:

答案 0 :(得分:4)

你的问题在这里:

Container() : m_x( std::make_shared<Base>() ) {}

您无法创建Base对象。你想要的是一个空的shared_ptr。这样做。

Container() : m_x( std::shared_ptr<Base>() ) {}

或者这样做。

Container() : m_x() {}

这是平等的。

答案 1 :(得分:2)

std::make_shared<Base>()相当于new Base()。你想要的是完全省略m_x初始化(默认构造函数将初始化为空)或明确地执行:

Container() : m_x(nullptr) {}

答案 2 :(得分:0)

使用模板化构造函数直接构造对象 因此,除非

,否则不能使用默认构造函数
  • B非抽象,
  • 您决定使用一个具体的受欢迎的派生类或
  • 您接受0初始化m_x