перегрузка оператора — копирование данных одного объекта в другой объект того же типа Переполнение стека

Ну, я понимаю, что это уже написанная проблема, и я следовал нескольким объяснениям, но мне все еще не везет. Может быть, есть объяснение, которое я не смог увидеть во время поиска или я делаю что-то не так.

Я создал график и пытаюсь скопировать данные из одного графика в другой. Это много работает. Однако у меня возникают проблемы с их разделением.

graph_maker temp_graph;
temp_graph = kruskal_graph;
for(unsigned int j = 0; j < min_edges.size(); j++){
temp_graph.add_undirected_edge(min_edges[j].node1, min_edges[j].node2, min_edges[j].edge_dist);
if(check_cycle(temp_graph) == true)
temp_graph = kruskal_graph;
else
kruskal_graph = temp_graph;
}

temp_graph а также kruskal_graph тот же тип называется graph_maker, Когда я провожу add_undirected_edge() функция края добавляется к обоим объектам. Чтобы разделить их, я попытался перегрузить оператор присваивания для graph_maker учебный класс:

    graphmaker& operator=(const graphmaker& Other)
{
v_map = Other.v_map;
return *this;
}

v_map это структура, содержащая данные, которые мне нужны. Я также попробовал следующее:

    graphmaker& operator=(graphmaker other)
{
using std::swap;
swap(v_map, other.v_map);
return *this;
}

Но ни один из этих методов не разделяет два объекта. Для обоих, когда я добавляю ребро, он добавляет оба к первой строке после цикла for. Я чувствую, что совершаю простую ошибку, но мне трудно понять, почему.

Спасибо за ваш вклад.

редактировать:

struct vertex
{
vector <pair<float,vertex*>> adj; //cost of edge, destination vertex
string name;
vertex(string s){
name=s;
}
};

class graphmaker
{
public:
/*
graphmaker& operator=(graphmaker other)
{
using std::swap;
swap(v_map, other.v_map);
// repeat for other member variables;
return *this;
}*/

graphmaker& operator=(const graphmaker& Other)
{
v_map = Other.v_map;
return *this;
}

//typedef map<string, vertex *> map;
map<string, vertex *> v_map;
void add_vertex(const string&);
void add_directed_edge(const string& from, const string& to, float cost);
void add_undirected_edge(const string& node1, const string& node2, float cost);
void make_graph(const string& name);
};

1

Решение

Для глубокого копирования сложной структуры данных, содержащей динамически размещенные элементы, вам нужно инициализировать каждый динамический элемент с помощью new держать их отдельно. Поэтому, если у вас есть несколько указателей узлов (вершин), их нужно инициализировать с помощью new для нового объекта.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector