附加到 C++ 中的多态列表?
Appending to polymorphic list in C++?
我是 C++ 的新手,正在尝试列出 polymorphic/accepting 任何从基础 class 派生的内容。问题是这个列表必须是私有的,使用不同的方法来附加和查询它。
经过一些研究,我能够通过智能指针以安全的方式接近。
这是我的结论:
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;
};
我希望能够用形状参数替换 make_unique 调用,但是我尝试的任何操作似乎都无法正确播放。
我可以在 ShapeCollector 中创建每个派生 class,将构造函数参数镜像为参数,但这感觉非常违反直觉。
如有任何帮助,我们将不胜感激!
写addShape
将导出的class作为模板参数:
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));
}
这将允许您为派生的 classs constructor. For example, if we have a
Circle` class:
提供 addShape
参数
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);
我是 C++ 的新手,正在尝试列出 polymorphic/accepting 任何从基础 class 派生的内容。问题是这个列表必须是私有的,使用不同的方法来附加和查询它。
经过一些研究,我能够通过智能指针以安全的方式接近。
这是我的结论:
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;
};
我希望能够用形状参数替换 make_unique 调用,但是我尝试的任何操作似乎都无法正确播放。
我可以在 ShapeCollector 中创建每个派生 class,将构造函数参数镜像为参数,但这感觉非常违反直觉。
如有任何帮助,我们将不胜感激!
写addShape
将导出的class作为模板参数:
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));
}
这将允许您为派生的 classs constructor. For example, if we have a
Circle` class:
addShape
参数
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);