Реализация элементов вектора класса типа

0

Я использую "треугольник" класса, который выражается как вектор типа "вершина", "вершина" - это структура, состоящая из значений x и y. У меня есть функция-член в "треугольнике", которая должна возвращать область с помощью формулы цапли. Все работает нормально, пока я не попытаюсь вывести область в основной функции. Вот мой код

Файл vertex.h

#ifndef VERTEX_H
#define VERTEX_H

#include <iostream>

struct vertex
{
    double x, y;

    vertex(double ix = 0.0, double iy = 0.0)
    {
        x = ix;
        y = iy;
    }
};

#endif // VERTEX_H

Файл triangle.h

#ifndef TRIANGLE_H
#define TRIANGLE_H

#include <iostream>
#include <vector>
#include "vertex.h"

class triangle
{
public:
    triangle(vertex iv0 = vertex(), vertex iv1 = vertex(), vertex iv2 = vertex());
    // pre:
    // post: empty triangle

    triangle(const triangle & source);
    // pre:
    // post: triangle created and initialized to given triangle source

    vertex operator[](size_t i) const;
    // pre: 0 <= i < 3
    // post: return vertex i in this triangle

    double area() const;
    //pre:
    //post: returns area of triangle

private:
    std::vector<vertex> v;
};

std::ostream & operator << (std::ostream & os, const triangle & p);
std::istream & operator >> (std::istream & is, triangle & p);
#endif // TRIANGLE.H

Файл triangle.cpp

#include <cassert>
#include <vector>
#include <math.h>
#include "triangle.h"

triangle::triangle(vertex iv0, vertex iv1, vertex iv2) : v(3)
{
    v[0] = iv0;
    v[1] = iv1;
    v[2] = iv2;
}

triangle::triangle(const triangle &p)
{
    v = p.v;
}

vertex triangle::operator[] (std::size_t i) const
{
    assert(i < v.size());
    return v[i];
}

double triangle::area() const
{
    double a, b, c;
    double s;
    a = sqrt(pow((v[0].x-v[1].x), 2)+pow((v[0].y-v[1].y), 2));
    b = sqrt(pow((v[1].x-v[2].x), 2)+pow((v[1].y-v[2].y), 2));
    c = sqrt(pow((v[2].x-v[0].x), 2)+pow((v[2].y-v[0].y), 2));
    s = (a+b+c)/2;
    return sqrt(s*(s-a)*(s-b)*(s-c));
}
//PROBLEM IS HERE^
//(used distance formula to find side lengths a, b, and c)

основная функция

#include <iostream>
#include "triangle.h"

using namespace std;

int main()
{
    triangle t;
    t[0] = vertex(2,3);
    t[1] = vertex(5,4);
    t[2] = vertex(3,7);

    cout << t << endl;

    cout << t.area() << endl;

    cout << t.operator [](2) << endl;

    return 0;
}
  • 3
    Вы точно не указали, в чем проблема. Что не так?
  • 2
    Просто для любопытства, почему вы используете динамическую структуру данных, когда вы уже знаете во время компиляции ее размер? Для этого существует класс std::array : en.cppreference.com/w/cpp/container/array
Показать ещё 3 комментария
Теги:
class
math
vector

2 ответа

1

Поскольку вы инициализируете свой треугольник с помощью operator[], вам нужно создать неконстантную версию этой функции, которая возвращает ссылку. Как правило, вы также возвращаете ссылку const из версии const, а не по значению:

const vertex& triangle::operator[] (std::size_t i) const
{
    assert(i < v.size());
    return v[i];
}

vertex& triangle::operator[] (std::size_t i)
{
    assert(i < v.size());
    return v[i];
}

Ваш компилятор действительно не должен был позволять вам уйти с кодом, который вы опубликовали. Изменение значения r должно быть ошибкой или, по крайней мере, предупреждением. Убедитесь, что вы скомпилированы с предупреждениями и прочитайте их!

0

Проблема связана с тем, как вы инициализируете объект треугольника. Попробуйте инициализировать его таким образом:

int main()
{
    triangle t (vertex(2,3), vertex(5,4), vertex(3,7));

    cout << t.area() << endl;

    return 0;
}

Другим менее идеальным решением было бы сделать "v" публичным членом, а затем присвоить значения следующим образом:

triangle t;
t.v[0] = vertex(2,3);
t.v[1] = vertex(5,4);
t.v[2] = vertex(3,7);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню