Во-первых, некоторые сводились код:Вызов 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
Я не знаю, является ли это причиной вашей проблемы, но класс ломает [Правило трех] (http://stackoverflow.com/questions/4172722) и развяжет хаос, если вы его скопируете. –
Вы совершенно правы. В попытке исправить мою проблему, я изменил векторы, чтобы удерживать указатели на кучу, а не объекты, что неуспешно. Это было поздно ночью/ранним утром, поэтому я поспешно добавил деструктора и забыл о другом 2. Спасибо за головы! – robrene