2017-01-19 10 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 여전히 적절한 정보를 저장 (벡터) 벡터에서, 모든 개체를 생성자를 종료 한 후 즉 잘 작동합니다. 내 질문은 이것이 어떻게 달성 된 것인가? 임시 aCell 객체가 좌변 객체이기 때문에

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

그것은 두 번째 변형을 호출 할 수 없습니다 : 정의에 의하면, vector.push_back는 두 가지 변종이있다. 첫 번째 변형을 호출하면 임시 개체 aCell이 루프를 종료 할 때 삭제됩니다.

이것에 대한 설명은 감사하겠습니다.

편집 : 오류로 인해 고정 된 코드는 샘 Varshavchik 지적하고 첫 번째 변형을 호출하는 경우 다음 루프가 종료 될 때 파괴 임시 객체 aCell를, 밀어,

+0

[새 요소는 'value'의 복사본으로 초기화됩니다.] (http://en.cppreference.com/w/cpp/container/vector/push_back). – user657267

+0

아, 첫 번째 변형에서 push_back 객체가 생성 된 객체가 아니라 오히려 인수의 복사 생성자에 의해 생성 된 객체입니까? – TuanDT

+0

죄송합니다. 죄송합니다. –

답변

2

을 songyuanyao.

aCell은 1 치이므로 첫 번째 버전이 호출됩니다. push_back ed 요소가 인수에서 복사 초기화되기 때문에 문제가 없습니다. 로컬 변수 aCell과는 무관합니다.

컨테이너 끝 부분에 지정된 요소 값을 추가합니다.

1) 새 요소는 값의 복사본으로 초기화됩니다.

이 BTW : 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

아, 코드 버그에 대해 포인터를 보내 주셔서 감사합니다. 방금 고쳤어. – TuanDT