从C ++中的方法返回一个对象

时间:2013-10-09 09:10:56

标签: c++

我相信这个问题的答案很简单,但我无法让这个东西正常工作。我基本上创建了两个类;一个用于点,一个用于多边形。多边形由一个动态的点列表组成。

然而,当我尝试重写点类中的+运算符并使它返回两个点的多边形时,我得到了一个奇怪的输出,并且在我关闭控制台窗口后出现了“Debug assertion failed”。

这是+运算符重载方法:

CPolygon CPoint::operator + (CPoint pointToAdd) {
    CPolygon polygon;
    polygon.addPoint(this);
    polygon.addPoint(pointToAdd);

    cout << polygon.toString();

    return polygon;
}

当我现在尝试使用此方法时,我得到以下输出:

(5,2,3) - (1,1,2)

(444417074,-33686019 ,, -1555471217) - ( - 1424299942,0,0)

第一行来自方法本身,而第二行来自返回多边形的位置。

我真的不知道我的多边形对象在从方法内部到返回到调用代码的路上发生了什么。

如果有人能就这一点给我一点见解,我将非常感激:)

修改

以下是polygon类的addPoint方法:

void CPolygon::addPoint(CPoint pointToAdd) {
    nrOfPoints++;

    // Create a temp array of the new size
    CPoint * tempPoints = new CPoint[nrOfPoints];

    // Copy all points to the temp array
    for(int i = 0; i < (nrOfPoints - 1); i++) {
        tempPoints[i] = points[i];
    }

    // Add the new point to the end of the array
    tempPoints[nrOfPoints - 1] = pointToAdd;

    // Delete the old array and set the temp array as the new array
    delete[] points;
    points = tempPoints;
}

void CPolygon::addPoint(CPoint * pointToAdd) {
    addPoint(* pointToAdd);
}

3 个答案:

答案 0 :(得分:1)

我做了上面提到的PlasmaHH和urzeit并实现了多边形类的复制构造函数,猜猜是什么,它解决了问题! :)感谢所有帮助我的人!

polygon类的复制构造函数如下所示:

CPolygon::CPolygon(const CPolygon & polygon) :
    nrOfPoints(polygon.nrOfPoints)
{
    points = new CPoint[nrOfPoints];

    // Add all the points from the polygon to be copied
    for(int i = 0; i < nrOfPoints; i++) {
        points[i] = polygon.points[i];
    }
}

答案 1 :(得分:0)

您的代码:

CPolygon CPoint::operator + (CPoint pointToAdd) {
    CPolygon polygon;


    polygon.addPoint(this);
    polygon.addPoint(pointToAdd);

    cout << polygon.toString();

    return polygon;
}

我觉得很奇怪 polygon.addPoint(this)您要添加指向CPolygon的指针,因为this是指针。你应该使用polygon.addPoint(*this)吗? 在polygon.addPoint(pointToAdd)中,您按值或引用添加。

如果您需要进一步的帮助,请添加函数CPolygon::addPoint的所有原型。

答案 2 :(得分:-1)

您的多边形对象在堆栈上声明,您将在运算符范围之后失去对它的引用!

尝试声明:

CPolygon* polygon = new Polygon(...);

您的签名应如下所示:

CPolygon* CPoint::operator + (CPoint pointToAdd) 

确实使用原始指针这是一个坏主意,你必须在范围之外处理它,更好的解决方案将是用户智能指针:

std::auto_ptr<CPolygon> CPoint::operator + (CPoint pointToAdd) 
{
    std::auto_ptr<CPolygon> polygon(new CPolygon);
    // do stuff here
    return polygon;
}

// ...

{
  std::auto_ptr<CPolygon> polygon = firstPoint + secondPoint;
  // working with CPolygon

  // auto_ptr frees polygon 
}