0

このバグが発生するまで、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;
    };
};
4

1 に答える 1