2017-09-10 7 views
-1

私はこの問題に苦労しているので、誰かが私を助けてくれることを願っています。オブジェクトのベクトルを反復するC++

私はオブジェクトのベクトルを作成していますが、このベクトルの要素にアクセスしたいのですが、en要素をベクターにプッシュバックしてアクセスしようとすると、機能しません。 ありがとうございます。

class reserve{ 
    private: 
     vector<float> coordinates; 
    public: 
     reserve(const reserve &); 
     void addACoordinate(float); 
     void readCoordinates(); 
     int getDim(); 
}; 

reserve::reserve(const reserve &w){ 
    int i; 
    for(i=0; i<coordinates.size(); i++){ 
     coordinates[i] = w.coordinates[i]; 
    } 
} 

void reserve::addACoordinate(float c){ 
    coordinates.push_back(c); 
} 

void reserve::readCoordinates(){ 

    int i; 
    cout << "the coordinates are : "; 
    for(i=0; i<coordinates.size(); i++){ 
     cout << coordinates[i] << " "; 
    } 

    cout << endl; 
} 

int reserve::getDim(){ 
    return coordinates.size(); 
} 

次に、2つの座標で予約を作成し、それを予約ベクトルにプッシュします。

vector<reserve> reserves; 
reserve r; 

r.addACoordinate(1.9); 
r.addACoordinate(1.9); 
r.getDim(); 
reserves.push_back(r); 
cout << "size of reserves " << reserves.size() << endl; 


for (vector<reserve>::iterator k = reserves.begin(); k != reserves.end(); ++k) { 
     k->getDim(); 

} 

しかし、反復の出力は2ではなく0です。私が予約rにアクセスしていない理由はわかりません。

+0

デバッグを試しましたか?コピーコンストラクタコードにはいくつかの問題があります。 – VTT

+0

私が見ることができるように、コードはコンパイルされません。クラス 'reserve'のデフォルトコンストラクタはありません。 – Raindrop7

+0

まず、コピーコンストラクタを削除してください。あなたはそれを必要とせず、バグです。 – juanchopanza

答えて

2

示すコピーコンストラクタは完全に破壊される:

reserve::reserve(const reserve &w){ 
    int i; 
    for(i=0; i<coordinates.size(); i++){ 

コピーコンストラクタは、実行時に、新しく構築coordinatesクラスのメンバは、常に完全に空です。明らかに、当初から魔法のようにコンテンツを持っているわけではないので、coordinates.size()は常にここでゼロになります。コピーコンストラクタは、実際にはコピー元の要素を実際にコピーすることはなく、コピーされた要素は常に空のベクトルを持ちます。また、w.coordinates.size()に変更すると、ループ内の割り当てをpush_back()に置き換えない限り、メモリが破損します。ここでベクターにrをコピーする)(push_backといえば...

reserves.push_back(r); 

push_back()試み、。それが仕事です。それをするために何が使われるのだろうか?なぜ、壊れたコピーコンストラクタ、もちろん。 rに初期化されたcoordinatesベクトルがあっても、壊れたコピーコンストラクタは、完全に空のcoordinatesベクトルを持つクラスインスタンスになることを保証します。

ここでコピーコンストラクタを完全に削除できます。それは有用な目的を果たさず、デフォルトのコピーコンストラクタはすべてを正しく行います。

宿題のコピーコンストラクタを手動で実装する必要がある場合は、適切に修正してください。push_back()クラスインスタンスからの値をコピーするか、クラスメンバー自体を手動でコピーします。

+0

本当にありがとうございます。私のコピーコンストラクタは壊れていました。私はそれを取り除き、現在は動作しています。 –

関連する問題