2013-11-14 2 views
2

Во-первых, некоторые сводились код:Вызов std :: vector :: push_back() меняет предыдущие элементы в векторе?

#ifndef UNDIRECTED_GRAPH_HPP 
#define UNDIRECTED_GRAPH_HPP 

#include <vector> 
#include <iostream> 

template <typename T> 
struct undirected_graph 
{ 
    struct node 
    { 
     T data; 
    }; 

    struct edge 
    { 
     node& node0; 
     node& node1; 
    }; 

    ~undirected_graph() { 
     for (auto n : nodes_) delete n; 
     for (auto e : edges_) delete e; 
    } 

    const node& add_new_node(const T& data); 

private: 
    std::vector<node*> nodes_; 
    std::vector<edge*> edges_; 
}; 

template <typename T> 
const typename undirected_graph<T>::node& 
undirected_graph<T>::add_new_node(const T& data) 
{ 
    node *n = new node { data }; 
    nodes_.push_back(n); 
    for (auto x : nodes_) std::cout << x->data.pos.x << "," << x->data.pos.y << std::endl; 
    return *n; 
} 

#endif 

Проблема существует в undirected_graph::add_new_node(const T& data). Я добавил вывод в консоль для целей отладки, так как я использую этот класс только с моим собственным типом данных. Каждый раз, когда я вызываю этот метод, кажется, что предыдущие записи в векторе nodes_ все изменены на последний элемент.

Я полагал, что это, возможно, придется делать с типом данных, я выбираю для хранения в моем графике, поэтому я добавляю часть кода, который называет его также:

// Somewhere in dungeon_generator.cpp ... 
undirected_graph<const DungeonLayout::Room&> graph; 

for (auto room : dungeon->rooms) { 
    graph.add_new_node(room); 
} 

Так либо мой метод испорчен, либо способ, которым я его называю, является ошибочным, или и то, и другое. Но я не могу понять, что происходит не так! Может кто-нибудь, пожалуйста, помогите мне?

Чтобы проиллюстрировать проблему еще больше, я добавил результат нескольких вызовов метода. dungeons_->rooms контейнера содержит кучу комнат на случайно сгенерированные позициях (обозначаемую их атрибутом pos)

2,2 
9,9 
9,9 
3,2 
3,2 
3,2 
2,6 
2,6 
2,6 
2,6 
9,3 
9,3 
9,3 
9,3 
9,3 
+1

Я не знаю, является ли это причиной вашей проблемы, но класс ломает [Правило трех] (http://stackoverflow.com/questions/4172722) и развяжет хаос, если вы его скопируете. –

+0

Вы совершенно правы. В попытке исправить мою проблему, я изменил векторы, чтобы удерживать указатели на кучу, а не объекты, что неуспешно. Это было поздно ночью/ранним утром, поэтому я поспешно добавил деструктора и забыл о другом 2. Спасибо за головы! – robrene

ответ

2

КАЖЕТСЯ ваши ссылки складирования на временную переменную room. Изменение

undirected_graph<const DungeonLayout::Room&> graph; 

в

undirected_graph<DungeonLayout::Room> graph; 
+3

Или измените переменную цикла на 'auto const &', если вы хотите сохранить ссылочную семантику. –

+0

Спасибо, это абсолютно правильно! Я ожидал, что 'auto' будет автоматически использовать ссылки, я думаю, мне еще нужно больше узнать об этих возможностях C++ 11. – robrene

Смежные вопросы