C++ 无法从函数返回对象

标签 c++ clipperlib

我正在尝试使用 C++“Clipper 库”(http://www.angusj.com/delphi/clipper.php),但是当我尝试从一个函数返回 clipper 库中的对象之一时,它似乎变为 null 或以某种方式被更改

这是我写的函数。唯一相关的行应该是最后 3 行。

ClipperLib::PolyTree MeshHandler::trianglesToPolyTreeUnion(std::vector<Triangle> triangles)
{
    // Make all of the triangles CW
    for (auto& triangle : triangles)
    {
        triangle.makeClockwise();
    }
    // Set up the Clipper
    ClipperLib::Clipper clipper;
    // To take a union, add all the paths as "subject" paths
    for (auto& triangle : triangles)
    {
        ClipperLib::Path triContour(3);
        triContour[0] = convertGLMToClipperPoint(triangle.getVertex(0));
        triContour[1] = convertGLMToClipperPoint(triangle.getVertex(1));
        triContour[2] = convertGLMToClipperPoint(triangle.getVertex(2));
        clipper.AddPath(triContour, ClipperLib::PolyType::ptSubject, true);
    }
    // Now get the PolyTree representing the contours
    ClipperLib::PolyTree tree;
    clipper.Execute(ClipperLib::ClipType::ctUnion, tree);
    return tree;
}

当我调用 clipper.execute 时,它​​会在树结构中写入一些轮廓信息。它写了正确的信息,我已经测试过它是正确的。但是,当我返回这棵树时,它似乎没有复制任何东西,而且这个函数产生的 PolyTree 是空的。

我确信这个库没有任何问题,我只是犯了一个 c++ 初学者的错误。希望有人知道它可能是什么。

谢谢!

编辑:作为引用,这里是多树 (http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Classes/PolyTree/_Body.htm) 的文档页面

编辑:我认为 clipper 库不是开源的,但它是。这是代码

typedef std::vector< IntPoint > Path;
typedef std::vector< Path > Paths;
class PolyNode;
typedef std::vector< PolyNode* > PolyNodes;

class PolyNode 
{ 
public:
    PolyNode();
    Path Contour;
    PolyNodes Childs;
    PolyNode* Parent;
    PolyNode* GetNext() const;
    bool IsHole() const;
    bool IsOpen() const;
    int ChildCount() const;
private:
    unsigned Index; //node index in Parent.Childs
    bool m_IsOpen;
    JoinType m_jointype;
    EndType m_endtype;
    PolyNode* GetNextSiblingUp() const;
    void AddChild(PolyNode& child);
    friend class Clipper; //to access Index
    friend class ClipperOffset; 
};

class PolyTree: public PolyNode
{ 
public:
    ~PolyTree(){Clear();};
    PolyNode* GetFirst() const;
    void Clear();
    int Total() const;
private:
    PolyNodes AllNodes;
    friend class Clipper; //to access AllNodes
};

最佳答案

在做任何事情之前,请确保以下程序正常运行:

int main()
{
   PolyTree p1;
   // fill PolyTree with some values that make sense (please add code to do this)
   //...
   PolyTree p2 = p1; 
   PolyTree p3;
   p3 = p1;
}

这基本上就是我们要测试的内容。如果您可以使此代码正常工作(添加相关的 header 和必要的初始化),那么您可以重新关注函数。如果上面的代码不起作用,那么这就是您的答案。

您需要获取上面的代码以生成正确的复制语义,甚至重要的是,当 main() 退出时,在 p1、p2 和 p3 的销毁时不会发生内存损坏。

因此,要么您可以修复该类以安全地进行复制,要么忘记它并使用您必须在有限情况下非常小心地处理的类(即您无法在执行操作时可靠地返回它的拷贝)现在)。

关于C++ 无法从函数返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22841696/

相关文章:

c++ - Eigen::MatrixXd 索引排列

python - pyclipper : Crash on trivial case ("terminate called throwing an exception")

clipperlib - 多边形中的点 HitTest 算法

c++ - 继承和功能

c++ - 将自上周日午夜以来的秒数转换为日期和时间

c++ - 在 C++ 中的 OpenCV 中旋转图像而不进行裁剪

geometry - 多边形之间的交点作为线剪

javascript - googlemaps 多边形与 clipper.js 的结合

c++ - 递归函数中返回函数和不返回有什么区别?