子类对象列表被重新解释为基类对象列表? (C ++ 11)

时间:2017-03-22 17:50:28

标签: c++ list inheritance type-conversion

我一直在使用提供多边形三角测量的库。由于我试图将更多的信息(一个ID和一堆方法)添加到它消耗的多边形和它返回的三角形,我继承了它的内部多边形类(Poly)以创建我自己的多边形类(PolyMine) )。我有一个包含数百个多边形的列表,足够多的迭代它们进行任何转换需要相当长的时间。我事先没有分配内存,因为我在运行时从SVG文件中消耗了未知数量的多边形。

以下是定义:

class PolyMine : public Poly
{
public:
  void AddPoint(float _x, float _y);

private:
  int id
  // ...etc
}

我正在创建一个对象列表:

std::list<PolyMine> outlinePolygons;
std::list<PolyMine> resultTriangles;

并希望在三角测量中使用它们:

Triangulate(&outlinePolygons, &resultTriangles);

但是,由于具有更多C ++经验的人可能已经看到,因为Triangulate需要指向Poly列表的指针,所以这不起作用。现在,我的印象是,在这种情况下,该计划将简单地“跳过”#39; PolyMine中不在Poly中的部分,并使用此列表。

在尝试谷歌问题之后,除了C#解决方案之外,我还没有想出任何东西。在这一点上,我假设我缺乏实际形成良好搜索查询的问题。

我是否真的必须遍历列表只是为了将孩子重铸为他们的父类型?我错过了转换吗?这甚至不可能或合理吗?任何提示都表示赞赏。

1 个答案:

答案 0 :(得分:1)

在C ++中,您使用指针和动态内存进行泛化/继承。

您可以将列表设为Poly指针:

std::list<std::unique_ptr<Poly>> outlinePolygons;
std::list<std::unique_ptr<Poly>> resultTriangles;

Poly* childPoly = new PolyMine;
Poly* childPoly2 = new AnotherPoly;  // Another derived class from Poly
outlinePolygons.insert(childPoly);
outlinePolygons.insert(childPoly2);

通过这种方式,您可以将所有Poly引用存储到具体的派生对象中。

更新

知道Triangulate函数签名是:

Triangulate(std::list<Poly> *inpolys, std::list<Poly> *outtris);

现在可以使用智能指针实例化您的列表:

std::unique_ptr<std::list<Poly>> outlinePolygons = new std::list<Poly>;
std::unique_ptr<std::list<Poly>> resultTriangles = new std::list<Poly>;

Triangulate现在可以使用了,但我预见会出现问题,因为std::list<Poly*>std::list<std:unique_ptr<<Poly>>std::list<Poly>*不同,这是Triangulate期望作为它的两个参数。您将无法使用std::list<Poly>*派生类对象填充列表PolyMine,除非您可以创建另一个带有Poly*列表的函数:

Triangulate(std::list<Poly*> *inpolys, std::list<Poly*> *outtris); // A function with the same name but different parameter types is allowed in C++.