可能我只是错过了文档中的内容(或者只是无法进行正确的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
?
答案 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)
使用模板化构造函数直接构造对象 因此,除非
,否则不能使用默认构造函数m_x
。