2016-05-04 14 views
-1

問題は、ここで期待される出力が得られないということです。私はneigboursと呼ばれるポインターのベクトルを持つNodeのクラスを持っています。私はオブジェクトneigbourをベクトルに入れたい。ポインタを追加してアクセスするベクトル

Node current = Node(1, 1, street , 2, 2); 
Node neighbour = Node(2, 2); 
neighbour.instreets.push_back(Street(1, 1, street, 2, 2)); 
nodes.push_back(neighbour); 

current.neighours.push_back(&nodes.at(0)); 
nodes.push_back(current); 

次に、印刷するためにアクセスしたいと思います。

cout << nodes[1].x << " " << nodes[1].y << endl; 
cout << "- " << nodes[0].outstreets[0].name << endl; 
cout << "ends " << nodes[1].neighours.at(0)->x << " " << nodes[1].neighours[0]->y << endl; 

しかし、隣人のコーディネートの代わりに乱数を取得します。間違った方法でアクセスしていますか?

期待される出力が

1 1 
- street 
ends 2 2 

EDITある: ノードは、ノードオブジェクトのベクトルです。

答えて

1

nodesベクトルに要素を追加すると、そのメモリを再割り当てできます。これは、その要素がメモリ内の別の場所に移動され、その要素へのポインタが無効になることを意味します。特に

は、あなたが&nodes.at(0)で撮影したアドレスはもうそれを修正するために複数の方法がありますnodes.push_back(current);

実行した後に有効ではありませんが、最も簡単な1はnodesdeque代わりvectorのようにすることです。 Dequeはメモリを再割り当てしないので、コードは正常に動作します。

+0

だから私はベクトルにネイバーを正しく追加していませんか? –

+1

問題は、ベクトル 'nodes'が所有するメモリへのポインタを取っていることです。それを修正する方法については、編集済みの回答を参照してください。 – rburny

+0

ありがとうございます。これははるかに優れています。 –

関連する問題