我一直在使用提供多边形三角测量的库。由于我试图将更多的信息(一个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#解决方案之外,我还没有想出任何东西。在这一点上,我假设我缺乏实际形成良好搜索查询的问题。
我是否真的必须遍历列表只是为了将孩子重铸为他们的父类型?我错过了转换吗?这甚至不可能或合理吗?任何提示都表示赞赏。
答案 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++.