实现类型为vector的元素

时间:2014-01-31 02:32:26

标签: c++ class math vector

我使用的是一个“三角形”类,它表示为“顶点”类型的向量,“顶点”是一个由x和y值组成的结构。我在'triangle'中有一个成员函数,它应该使用苍鹭的公式返回该区域。一切正常,直到我尝试输出main函数中的区域。这是我的代码

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

2 个答案:

答案 0 :(得分:1)

由于您使用operator[]初始化三角形,因此您需要创建一个返回引用的该函数的非const版本。通常,您也会从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];
}

你的编译器真的不应该让你逃脱你发布的代码。修改右值应该是错误,或者至少是警告。确保在打开警告的情况下进行编译,然后读取它们

答案 1 :(得分: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);