このバグが発生するまで、C ++のポインター/参照を理解していると本当に思っていました。
問題:
参照された戻り値にデータを割り当てても、データ構造内のデータは変更されません。
私が試したこと:
これは概念的な問題だと確信していますが、ポインターと参照に関するチュートリアルを読み直しても、まだ問題を特定できないようです。
コード:
ヘッダー内
template <class directed_graph_type>
typename directed_graph<directed_graph_type>::vertex& directed_graph<directed_graph_type>::add_vertex(directed_graph_type& obj)
{
// create new vertex
vertex* v = new vertex;
v->vertex_data = obj;
// adding to list
vertices.push_back(v);
return *v;
}
注: 関数からわかるように、参照が返されます。これにより、次のコードで頂点データの値を変更すると、リスト構造の値も変更されると思いました。しかし、繰り返してみると、そうではないことがわかりました。
主に
// assigning
directed_graph<int> graph;
int a = 1;
directed_graph<int>::vertex v1 = graph.add_vertex(a);
v1.data() = 20;
cout << v1.vertex_data << endl; // output: 20
// iterating through
std::list<directed_graph<int>::vertex*>::iterator it = graph.vertices.begin();
while(it != graph.vertices.end())
{
cout << (*it)->vertex_data << endl; // output: 1
++it;
}
クラス宣言(念のため)
template <class directed_graph_type>
class directed_graph
{
public:
class vertex;
virtual ~directed_graph();
vertex& add_vertex(directed_graph_type& obj);
void add_connection(vertex& from, vertex& to);
void remove_vertex(vertex& v);
void remove_connection(vertex& from, vertex& to);
iterator begin();
iterator end();
std::list<vertex*> vertices;
class vertex
{
public:
void add_connection(vertex& to);
void remove_connection(vertex& to);
iterator begin();
iterator end();
directed_graph_type& data();
directed_graph_type vertex_data;
std::list<vertex*> connected_to;
};
};