#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
в цикле.
Делайте свое дело (области компьютера, проверьте, существует ли треугольник и т.д.), А затем, когда вы закончите, начните удалять динамически выделяемую память…