2014-01-31 50 views
1

我試圖創建一個類'三角'表示爲類型'頂點'的向量,其中'頂點'是由'x'和'y'組成的結構雙重類型。我需要在「三角形」中使用蒼鷺公式返回該區域的成員函數,但我無法弄清楚如何訪問三角形中每個元素的單獨x和y分量。這是到目前爲止我的代碼,麻煩來的第三個代碼 - 的triangle.cpp文件訪問類的元素

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 & t); 
std::istream & operator >> (std::istream & is, triangle & t); 
#endif // TRIANGLE_H 

三角形。 cpp源文件:

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

triangle::triangle(vertex iv0, vertex iv1, vertex iv2) 
{ 
    v = std::vector<vertex>(); 
    v[0] = iv0; 
    v[1] = iv1; 
    v[2] = iv2; 
} 

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

vertex triangle::operator[] (std::size_t i) const 
{ 
    assert(i < v.size()); 
    return v[i]; 
} 
//HERE IS THE PROBLEM 
double triangle::area() const 
{ 
    int a, b, c; 
    double s; 
    //need to use something like a = (v[0].y-v[1].y)/(v[0].x-v[1].x) to calculate area, 
    // this syntax is wrong however^^^ 
    s = (a+b+c)/2; 
    return sqrt(s*(s-a)*(s-b)*(s-c)); 
} 

std::ostream & operator << (std::ostream & os, const triangle & t) 
{ 
    for (size_t i = 0; i < 3; ++i) 
     os << t[i] << " "; 
    return os; 
} 

std::istream & operator >> (std::istream & is, triangle & t) 
{ 
    std::size_t n; 
    vertex vx; 

    is >> n; 
    for (size_t i = 0; i < n; ++i) 
    { 
     is >> vx.x >> vx.y; 
    } 
    return is; 
} 
+0

什麼是確切的錯誤? – 0x499602D2

+0

沒有錯誤,只需要幫助定義三角形的邊長 – user3201372

+0

另外,你不想使用整數作爲a,b和c – kmort

回答

2

訪問該向量的方式沒有任何問題(v[0].x是正確的),但你如何初始化它的一個問題:

triangle::triangle(vertex iv0, vertex iv1, vertex iv2) 
{ 
    v = std::vector<vertex>(); 
    v[0] = iv0; 
    v[1] = iv1; 
    v[2] = iv2; 
} 

矢量大小爲零。你不能只將物品推到它上面。請使用push_back成員,或者明確設置大小。實際上,使用矢量是有問題的。三角形不需要任意數量的頂點。它正好需要3.一個數組會很好。

下面是兩種基於矢量的選擇我提到:

// Using push_back 
triangle::triangle(vertex iv0, vertex iv1, vertex iv2) 
{ 
    v.reserve(3); 
    v.push_back(iv0); 
    v.push_back(iv1); 
    v.push_back(iv2); 
} 

// Preallocating a vector size before modifying elements 
triangle::triangle(vertex iv0, vertex iv1, vertex iv2) 
    : v(3) 
{ 
    v[0] = iv0; 
    v[1] = iv1; 
    v[2] = iv2; 
}