具体的c ++指针/参考错误?

时间:2013-11-10 22:09:59

标签: c++ pointers data-structures reference runtime-error

在我遇到这个错误之前,我真的以为我理解了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;
    };
};

1 个答案:

答案 0 :(得分:2)

directed_graph<int>::vertex v1 = graph.add_vertex(a);

此处v1不是参考变量。返回的引用将复制v1(而不仅仅是v1引用相同的变量),因此更改v1不会更改原始。{ / p>

请改为尝试:

directed_graph<int>::vertex &v1 = graph.add_vertex(a);