2013-07-16 3 views
1

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

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

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:

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 для нового объекта.

+0

Когда вы говорите каждый динамический член с новым. Для этого случая это будет просто v_map, будет ли это правильно? Мой граф в настоящее время представляет собой карту (v_map) вершин, и каждая из моих вершин содержит имя вершины и вектор пар, которые содержат связанную вершину назначения и вес. – user2427671

+0

@ user2427671, можете ли вы показать определение v_map? –

+0

@ user2427671, да, вам нужно инициализировать все указатели вершин в v_map с помощью new, тогда вы можете constrcut member adj использовать эти новые указатели. –

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