2010-06-21 8 views
0

다음은 벡터가 참조로 전달 되더라도 노드가 값으로 전달되기 때문에 다음과 같이 작동하지 않습니다 (인쇄 2). 내가 어떻게 고칠 수 있니?해당 위치의 벡터 요소 수정

#include <iostream> 
using std::cout; 
using std::endl; 

#include <vector> 
using std::vector; 

class Node{ 
    public: 
     int value; 
     Node(int); 
     void createChildren(vector<Node> &); 

}; 

//! constructor of a single node 
Node::Node(int value) 
{ 
    this->value = value; 
} 

void Node::createChildren(vector<Node> &nodes) 
{ 
    for (int i = 0; i < 5; i++) { 
     Node n(0); 
     nodes.push_back(n); 
     if (i == 0) { 
      value = nodes.size(); 
     } 
    } 
} 

int main(void) { 
    Node a(0); 
    vector<Node> asdf; 
    asdf.push_back(a); 
    asdf[0].createChildren(asdf); 
    cout << asdf[0].value << endl; 

    return 0; 
} 
+1

달성하려는 목표가 내게 명확하지 않습니다. 예상되는 결과는 무엇입니까? – pmr

+2

당신은 무엇을 기대합니까? 값은 i == 0에 대해서만 업데이트되기 때문에 출력 1은 올바른 것입니다. –

+2

실제로 "asdf"에는 두 개의 요소가 있어야하므로 "2"여야합니다. – haavee

답변

2

nodes.push_back(n); 줄을 실행하면 벡터가 크기 조정되고 이전에 보유한 참조를 무효화하여 기존 멤버를 새로 할당 된 메모리 블록에 복사하므로 벡터가 크기가 조정됩니다. 귀하의 경우 *this 안에 createChildren은 asdf [0]에 대한 참조입니다. 이 객체의 소멸자가 실행되었으므로 더 이상 정의 된 동작이 변경되지 않습니다. (~Node()을 정의하고 호출 할 때 참조하십시오.)

+0

그래서 컨테이너를 수정하기 전에 createChildren을 호출하는 객체를 수정해야합니다. 메소드의 시작점에서'value = nodes.size() + 1'을 시도해 보았습니다. –

+0

@myle 예, 또는'CreateChildren (std :: vector & nodes, size_t parent_index)'를 가지고 인덱스로 액세스 할 수 있습니다 :'nodes [parent_index] .value = nodes.size() + 1;'. – Cubbi

0

당신은 당신이 그렇지 않으면 당신은 포인터를 놓아야합니다, 그것은 복사 생성자와 및 연산자 = 구현이 있는지 확인해야 벡터 (또는 그 문제에 대해 다른 용기)에 노드 클래스를 넣어하려는 경우 벡터의 노드

class Node { 
    ... 
    public: 
     Node(const Node& rhs) { ... } 

     Node& operator=(const Node& rhs) { 
      if(this == &rhs) 
       return *this; 
      value = rhs.value; 
      // ... other members copied ... 
      return *this; 
     } 

     Node& operator=(Node& rhs) { ... non const version ... } 
}; 

외부의 createChildren() 메소드는 루프 다음에 값을 5로 설정해야합니다.

+0

기본 복사 생성자 및 할당 연산자가 값을 보존합니다. –

+0

사실, 그렇습니다. 더 깊은 복사를 위해서만 필요합니다. 그래도 좋은 연습입니다. –

+0

하지만이 경우에는 아무 도움이되지 않습니까? –

1

이 솔루션은 Adrian Regan sais와 관련이 있습니다.

"createChildren()"메서드에서 다른 요소를 노드 벡터에 푸시하면 벡터 자체의 크기를 조정해야 할 가능성이 있습니다. 그렇게하면 기존 요소를 새로 할당 된 저장소에 복사합니다.

그래서,이 그것을 값 0

와 노드 0의 inital 값을 복사하는 일이 처음 컴파일러는 비트 단위 복사를 수행하는 기본 복사 생성자를 생성합니다. 그러나 복사 생성자를 구현하는 것만으로는 노드 0의 업데이트 된 값을 잃어 버리기 때문에 도움이되지 않습니다.

h.