尝试返回区域的对象成员但保持0

时间:2015-01-25 22:41:25

标签: c++ class object inheritance

我一直在打扰这个项目,我无法弄清楚为什么这个函数不会返回多边形的区域。我对此很陌生,所以请不要对我太粗暴。这是我的代码。

#include <iostream>
using namespace std;

struct Point
{
double xCoord, yCoord;
~Point(){};
};

class Triangle;

class Polygon
{
friend class Triangle;

private:
int totalVertices;
int lastIndex = 0;
double area = 0;

public:
void setNumOfVertices();
void setPoint(Point [], Point []);
int getNumOfVertices() const;
};


class Triangle : public Polygon
{
friend class Polygon;

private:
Point triangleVertices[2];
double triangleArea;

public:
double getArea(Point [], Point []);
};


void Polygon::setNumOfVertices()
{
    cout << "Please enter how many vertices(intersections) for this polygon: ";
    cin >> totalVertices;
    while (totalVertices < 3) {
        cout << "ERROR: Must have more than 2 vertices. Please try again." << endl;
        cout << "Please enter how many vertices(intersections) for this polygon: ";
        cin >> totalVertices;
    }
}

void Polygon::setPoint(Point points[2], Point vertexCoords[])
{
    for (int x = 1; x < totalVertices; x++) {
        if (x != lastIndex && x != 1) {
            points[0] = points[1];
            points[1] = vertexCoords[x];
            lastIndex = x;
            break;
        }
        else if (x == 1) {
            points[0] = vertexCoords[1];
            points[1] = vertexCoords[2];
            break;
        }
    }
}    


int Polygon::getNumOfVertices() const
{
    return totalVertices;
}

double Triangle::getArea(Point points[2], Point vertexCoords[])
{
    triangleArea = 0;
    triangleArea = ((vertexCoords[0].xCoord - points[2].xCoord) * (points[1].yCoord - vertexCoords[0].yCoord) -
               (vertexCoords[0].xCoord - points[1].xCoord) * (points[2].yCoord - vertexCoords[0].yCoord)) / 2;
    return triangleArea;
}



int main()
{
    Polygon polygon1;
    Triangle triangle1;
    double area = 0;
    polygon1.setNumOfVertices();
    Point vertexCoords[polygon1.getNumOfVertices()];
    Point trianglePts[2];

    //Get all vertex coordinates from user and store them in an array
    for (int x = 0; x < polygon1.getNumOfVertices(); x++) {
        cout << "Enter vertex number " << x + 1 << "'s X coordinate please: ";
        cin >> vertexCoords[x].xCoord;
        cout << "Enter vertex number " << x + 1 << "'s Y coordinate please: ";
        cin >> vertexCoords[x].yCoord;
    }
    cout << endl;

    //Output all vertex coordinates in parenthesis to the user via console
    cout << "The X and Y coordinates of the vertices are as follows:" << endl;
    for (int x = 0; x < polygon1.getNumOfVertices(); x++)
        cout << "(" << vertexCoords[x].xCoord << ", " << vertexCoords[x].yCoord <<
            ")" << endl;

    for (int x = 0; x < polygon1.getNumOfVertices(); x++) {
        polygon1.setPoint(trianglePts, vertexCoords);
        area += triangle1.getArea(trianglePts, vertexCoords);
    }

    //Output the area of the polygon
    cout << endl;
    cout << "The area of the polygon is: " << area << endl;

    return 0;
}

当我在循环中调用getArea(Point [],Point [])函数来获取main函数中的区域时,似乎Triangle类的成员变量triangleArea永远不会得到应有的更新。谁能告诉我我做错了什么?其他一切都像一个魅力我每次运行程序时都会为我的区域获得0。感谢您的时间。

1 个答案:

答案 0 :(得分:0)

您不断访问这些Point数组的界限。例如,在Triangle::getArea中,参数为:

Point points[2];

但您可以访问points[1]points[2]。数组有0个索引。

乍一看,我认为trianglePtstriangleVertices的尺寸错误,因为您给它们的尺寸为[2],而三角形实际上有3个顶点。但是我现在认为你要做的只是在这个数组的计算中存储每个三角形的3个顶点中的两个,并且始终使用vertexCoords[0]作为第三个顶点。

这至少可以说令人困惑。

Triangle::getArea()的设计和逻辑也是错误的。首先,它甚至不使用Triangle类的任何成员变量,这是一个不好的标志。相反,这应该是一个非成员函数,它只需要3个点作为参数(可以是3的数组,或者2的数组加上第三个作为单独的参数)。您根本不需要Triangle课程,并且您不需要传递整个vertexCoords数组。

下一步:Polygon::setPoint一团糟。我你想要做的事实上是得到 vertexCoords中的下一对2点。同样,这不使用Polygon的任何成员变量,因此将它作为成员函数没有意义。好吧,它确实使用lastIndex,但这不是一个好主意。您正在使用lastIndex按照上次获得的点进行随机播放,但这是一个脆弱且令人困惑的设计。

此功能甚至不起作用:每次调用它时都会执行相同的else if (x == 1)分支,因为在此之前第一个if永远不会成立!

只需让函数在传递Index作为参数的地方提供所需的3个点就会简单得多。也许称之为get3Points而不是setPoint

你应该做的是让Polygon将顶点坐标列表存储为成员变量,而不是将其传递给每个函数。 (这意味着您必须使用vector作为成员变量来保存它们)。

如果您不想这样做,那么根本没有Polygon类的任何一点,您可以让get3Points成为您通过的免费功能每次都vertexCoords

另一个问题是最终循环执行的次数太多。如果共有3个顶点,则此循环应该运行一次,但实际上运行3次(并且这样做,setPoint读取vertexCoords的结尾 - 或者如果setPoint没有被破坏只读过第1点和第2点,那就好了。