在C ++中附加到多态列表?

问题描述 投票:0回答:1

我是C ++的新手,并试图使列表多态/接受从基类派生的任何东西。问题是该列表必须是私有的,使用单独的方法来追加和查询它。

经过一些研究,我能够通过智能指针以安全的方式接近。

这是我得到的:

class Shape
{
public:
    Shape(std::string name)
    {
        this->name = name;
    }

    std::string name;
    std::string getName(void)
    {
        return this->name;
    }
};

class ShapeCollector
{
public:
    void addShape(Shape shape)
    {
        this->shapes.push_back(std::make_unique<Shape>("hey"));
    }

private:
    std::vector <std::unique_ptr<Shape>> shapes;
};

我希望能够使用shape参数替换make_unique调用,但是我尝试的任何东西似乎都没有正确播放。

我可以在ShapeCollector中创建每个派生类,将构造函数参数镜像为参数,但这感觉非常直观。

任何帮助,将不胜感激!

c++ list class polymorphism derived
1个回答
3
投票

编写addShape以将派生类作为模板参数:

template<class Derived, class... Args>
void addShape(Args&&... args) {
    // std::forward will correctly choose when to copy or move
    std::unique_ptr<Shape> shape (new Derived(std::forward<Args>(args)...));
    shapes.push_back(std::move(shape)); 
}

这将允许您为addShape提供派生类classs constructor. For example, if we have aCircle`类的参数:

class Circle : public Shape {
    double radius;
    double x;
    double y;
   public:
    Circle(double radius, double x, double y) 
      : Shape("circle"), radius(radius), x(x), y(y) 
    {}
};

添加它很简单:

ShapeCollector shapes;
shapes.addShape<Circle>(10.0, 0.0, 0.0); 
© www.soinside.com 2019 - 2024. All rights reserved.