Вычисление расстояния между точками треугольника с использованием указателей

#c #c 11 #pointers

#c #c 11 #указатели

Вопрос:

Я пишу программу, в которой вы вводите координаты точки треугольника, программа проверяет, существует ли треугольник, и выводит площадь треугольника. Я должен использовать указатели в программе.

 class Vertex
{
private:
    int x, y;
public:
    Vertex(int x, int y) : x(x), y(y) {}

    int getX() {
        return x;
    }

    int getY() {
        return y;
    }

    float getDistance(Vertex *anotherVertex)
    {
        float dist;
        int tempx = 0, tempy = 0;
        tempx = anotherVertex->getX();
        tempy = anotherVertex->getY();
        dist = ((tempx - x) * (tempx - x)   (tempy - y) * (tempy - y));
        return dist;
    }

    void setCoord(int x, int y)
    {
        this->x = x;
        this->y = y;
    }
};

class Triangle
{
private:
    Vertex *a, *b, *c;
public:
    Triangle()
    {
        a = new Vertex(0, 0);
        b = new Vertex(0, 0);
        c = new Vertex(0, 0);
    }

    void Set_coord()
    {
        int x1, y1, x2, y2, x3, y3;
        cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
        a->setCoord(x1, y1);
        b->setCoord(x2, y2);
        c->setCoord(x3, y3);
    }

    bool existTriangle() {
        float ab = a->getDistance(b);
        float bc = b->getDistance(c);
        float ca = c->getDistance(a);
        if (ab   bc > ca amp;amp; ab   ca > bc amp;amp; bc   ca > ab) {
            return true;
        }
        else {
            return false;
        }
    }

    float getArea() {
        float p;
        float ab = a->getDistance(b);
        float bc = b->getDistance(c);
        float ca = c->getDistance(a);
        p = (ab   bc   ca) / 2;

        return sqrt(p * ((p - ab)*(p - bc)*(p - ca)));
    }
};
  

Я изо всех сил пытаюсь заставить функцию getDistance работать, поскольку я неопытен в использовании указателей, при отладке я получаю эту ошибку в функции getX().

Возникло исключение: нарушение доступа для чтения. это было 0xDDDDDDDD.

Редактировать:

вот мой основной ()

 int main() {
    int n = 0;
    cin >> n;

    vector<Triangle*> vertices;
    for (int i = 0; i < n; i  ) {
        Triangle* newVertices = new Triangle();
        newVertices->Set_coord();
        vertices.push_back(newVertices);
        delete newVertices;
    }

    for (int i = 0; i < n; i  )
    {
        if (vertices[i]->existTriangle())
        {
            cout << vertices[i]->getArea();
        }
    }
}
  

Комментарии:

1. Приведите минимальный пример ( main() где вы используете свои классы).

2. Как вы вызываете getDistance ? Кроме того, в его реализации, похоже, отсутствует вызов квадратного корня.

3. Я добавил свой main() к сообщению, также спасибо, что указали, что в нем отсутствует квадратный корень, я вызываю getDistance в классе Triangle

4. vertices.push_back(newVertices); delete newVertices; — вы просто превратили указатель, который вы вставили в вектор, в висячий указатель

Ответ №1:

Проблема в вашей основной функции (вот почему я попросил вас опубликовать ее 🙂 ):

 Triangle* newVertices = new Triangle();
vertices.push_back(newVertices);
delete newVertices;
  

Вы динамически выделяете память, на которую указывает newVertices .
Вы сохраняете указатель в вектор.
Вы удаляете память, на которую указывает newVertices .

В результате теперь этот указатель является висячим указателем.

Таким образом, вы не должны удалять newVertices в цикле.

Делайте свое дело (области компьютера, проверьте, существует ли треугольник и т.д.), А затем, когда вы закончите, начните удалять динамически выделяемую память…