简体   繁体   English

实现类型为vector的元素

[英]Implementing elements of a vector of type class

I'm using a class 'triangle' which is expressed as a vector of type 'vertex', 'vertex' being a structure consisting of an x and y value. 我使用的是“三角形”类,它表示为“顶点”类型的向量,“顶点”是由x和y值组成的结构。 I have a member function in 'triangle' that is supposed to return the area using heron's formula. 我在“三角形”中有一个成员函数,应该使用苍鹭的公式返回该区域。 Everything works fine until I try to output the area in the main function. 一切正常,直到我尝试在main函数中输出该区域。 Here is my code 这是我的代码

vertex.h file 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 file 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 file 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)

main function 主功能

#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;
}

Since you are initialising your triangle using operator[] , you need to make a non-const version of that function that returns a reference. 由于您正在使用operator[]初始化三角形,因此需要制作该函数的非常量版本以返回引用。 Generally you return a const reference from the const version too, rather than by value: 通常,您也从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];
}

Your compiler really shouldn't have let you get away with the code you posted. 您的编译器确实不应该让您摆脱所发布的代码。 Modifying an rvalue should be an error, or at the very least a warning. 修改右值应该是一个错误,或者至少是一个警告。 Make sure you compile with warnings turned on, and read them ! 确保在打开警告的情况下进行编译并阅读警告!

The issue has to do with how you are initializing the triangle object. 问题与如何初始化三角形对象有关。 Try initializing it this way: 尝试通过以下方式进行初始化:

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

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

    return 0;
}

Another less ideal solution would be to make "v" a public member and then assign the values this way: 另一个较不理想的解决方案是使“ v”成为公共成员,然后以这种方式分配值:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM