抽象类类型的新表达式无效'形状'使用std :: vector

时间:2016-03-22 20:08:30

标签: c++ oop c++11 vector polymorphism

所以我有一个 Shape 抽象基类。

class Shape{
    virtual int getRadius() = 0;
};

派生类 Sphere

class Sphere: public Shape {
private:
    int radius;
    int origin = 5;
public:
    Sphere(int radius){
        this->radius = radius;
    }

    int getRadius() {
        return this->radius;
    }
};

在我实例化一个半径为2的球体对象之后,我将它推入一个std :: vector对象。但是当我尝试这样做时出现错误:

int main() {
    std::vector<std::shared_ptr<Shape>> shapes;
    Sphere * firstSphere = new Sphere(2);
    shapes.push_back(firstSphere);
    cout << shapes[0]->getRadius() <<endl;
    return 0;
}

在复制构造函数&#st; :: vector&lt; _Tp,_Alloc&gt; :: vector(const std :: vector&lt; _Tp,_Alloc&gt;&amp;)&#39;: 我想要做的是实现多态,因为我将有几个派生自 Shape ABC的形状类,我希望能够将它们推入形状向量容器中能够访问它们并调用它们的方法。

我做错了什么?什么是最好的方法呢? 这个问题的要点还在于提出实现多态的最佳方法。

Scnerario:  1. 形状 ABC  2. 球体形状  3.从Shape

派生的其他类

对于我来说,存储Shape派生类的对象(或指针)对哪个容器有效且简单?

1 个答案:

答案 0 :(得分:7)

当您撰写shapes.push_back(firstSphere)时,您隐含地将Sphere*转换为shared_ptr<Shape>。但是您尝试在shared_ptr上调用的构造函数标记为explicit

template< class Y > 
explicit shared_ptr( Y* ptr );

因此错误。

有许多方法可以确保显式调用构造函数:

// explicitly calls constructor internally
shapes.emplace_back(firstSphere);

// just explicitly call it yourself
shapes.push_back(std::shared_ptr<Shape>(firstSphere)); 

// just avoid firstSphere altogether
shapes.push_back(std::make_shared<Sphere>(2));