2017-01-19 13 views
1

これは非常に基本的な質問ですが、私はここで何が起こっているのかという論理を頭に浮かべているようです。コードスニペットを考える:どのC++ベクタpush_backがループ内で作成されたオブジェクトに対して呼び出されますか?

class Board{ 
private: 
    vector< vector<Cell> > allCells; 
    int bheight; 
    int bwidth; 
public: 
    Board(int width = 10, int height = 10){ 
     bheight = height; bwidth = width; 
     allCells.resize(width); 
     #loop for creating cell objects 
     for(int i = 0; i < width; i++){ 
      allCells[i].reserve(height); 
      for(int j = 0; j < height; j++){ 
       Cell aCell(i,j,0); #an object created inside a loop 
       allCells[i].push_back(aCell); #push it into a vector 
      } 

     } 
    } 

このコードはallCellsが依然として適切な情報を格納する(ベクトルの)ベクターに、すべてのオブジェクトをコンストラクタを出た後、すなわち正常に動作します。私の質問は、これがどのように達成されたかです。定義によると、vector.push_backは2つだけのバリアントを持っています

void push_back (const value_type& val); 
void push_back (value_type&& val); 

一時的aCellオブジェクトは左辺値オブジェクトであるので、それは第二の変形を呼び出すことはできません。最初のバリアントを呼び出すと、の一時的なオブジェクトaCellがループを終了すると破棄されます。

これのフードの下で何が起こっているのかについての説明はありがたいです。

EDIT:それは最初のバリアントを呼び出すと、それは、ループが終了するときに破棄される一時的なオブジェクトaCellを、プッシュによるエラーへの固定コードサムVarshavchikによって指摘されsongyuanyao

+0

[新しい要素は 'value'のコピーとして初期化されます。](http://en.cppreference.com/w/cpp/container/vector/push_back)。 – user657267

+0

ああ、最初の変種のpush_backオブジェクトは作成されたオブジェクトではなく、引数のコピーコンストラクタによって作成されたオブジェクトですか? – TuanDT

+0

おっと、私は誤解しました。ごめんなさい。 –

答えて

2

はいaCellは左辺であるため、最初のバージョンが呼び出されます。 push_back ed要素が引数からコピー初期化されているので問題ありません。ローカル変数aCellとは無関係です。

コンテナの最後に指定された要素の値を追加します。

1)新しい要素は、値のコピーとして初期化されます。ところで

allCells[i]は、forループで使用されているときあなたのコードは、未定義の動作をしているallCellsは、その時点ではまだ空であるので、それは何の要素を持っていません。ノートreserveはサイズを変更しませんが、vectorの容量はresizeです。

Board(int width = 10, int height = 10){ 
    bheight = height; bwidth = width; 
    allCells.reserve(width);   // it should be allCells.resize(width) !! 
    #loop for creating cell objects 
    for(int i = 0; i < width; i++){ 
     allCells[i].reserve(height); 
     for(int j = 0; j < height; j++){ 
      Cell aCell(i,j,0); #an object created inside a loop 
      allCells[i].push_back(aCell); #push it into a vector 
     } 
    } 
} 
+0

ahhコード内のバグについてのポインタに感謝します。ちょうどそれを固定した。 – TuanDT

関連する問題