2016-08-04 13 views
2

のうち、私の運動の一つでは、私はヘッダファイルのCPPを記述する必要があります:ベクトル添字の範囲および多型

class Triangle : public Polygon 
{ 
public: 
    Triangle(Point, Point, Point); 
    ~Triangle(); 
private: 
}; 

:私が持っているtriangle.hファイルで三角形や多角形

だから私はこれを行う三角形のCPPファイルに:ポリゴンファイルでさらに

Triangle::Triangle(Point a, Point b, Point c) 
{ 
_points[0] = a; 
_points[1] = b; 
_points[2] = c; 
} 
Triangle::~Triangle(){} 

私が持っているヘッダファイルには、以下のようなものです:

class Polygon 
{ 
    public: 
    Polygon(); 
    ~Polygon(); 
    virtual double perimeter() const; 
    protected: 
    vector<Point> _points; 

};

Polygon::Polygon(){} 
Polygon::~Polygon(){} 
double Polygon::perimeter() const 
{ 
    return 0.0; 
} 

をしかし、私はコンパイルする場合、コンパイラはエラーを表示::

は、だから私はこのように、このファイルのCPPを完了範囲外の添字ベクトルを、私は私がで物事を入れたときに理解していません範囲外のベクトル。ですから、問題の解決方法を知っていれば、助けてください。 ありがとう!

+1

代わりに '_pointsの[0] =;'、 '_points [1] = b; '、' _points [2] = c; '' push_back'を使う '' _points.push_back(a); _points.push_back(b); _points.push_back(c); 'コンストラクタ内で正しく初期化する' this - > _ points = vector (3); ' – DimChtz

+0

コンパイラはエラーを出すか、プログラムを実行していて例外がスローされますか? 'ベクトル _points;'はデフォルトでサイズ0に設定されています。今、あなたが '_points [0]'またはそれ以上のものにアクセスすると、あなたは範囲外になります。代わりに 'push_back()'を使用してください。初心者であれば、例外の可視性を高めるために '[] 'の代わりに' vector :: at() 'メソッドを使うこともできます。サイドノートでは、コンストラクタでの余分なコピーを避けるために、const参照によって 'Point a、b、c'を渡してください。 – iammilind

+0

仮想dtorsなしの継承...どのようなC + +の訓練のクラスですか? o.O –

答えて

2

あなたのベクトルは、適切なサイズで初期化されていないので:

Triangle::Triangle(Point a, Point b, Point c) 
{ 
_points.resize(3); // reserve space for 3 points. 
_points[0] = a; 
_points[1] = b; 
_points[2] = c; 
} 

それとも一backを使用します。

Triangle::Triangle(Point a, Point b, Point c) 
{ 
_points.push_back(a); 
_points.push_back(b); 
_points.push_back(c); 
} 
関連する問題