2013-07-16 55 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_graphkruskal_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; 
    } 

但是這兩種技術都不能保持兩個物體分開。對於這兩種情況,當我添加edge時,它會在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

爲了深拷貝包含動態分配的元素複雜的數據結構,你需要在每個動態成員initalize與new讓他們分開。因此,如果您有一些節點(頂點)指針,則需要使用new對新對象進行初始化。

+0

當你說新的動態成員。對於這種情況,它只是v_map,這是正確的嗎?我的圖形當前是頂點的映射(v_map),我的每個頂點都包含頂點名稱和包含連接的目標頂點和權重的對的向量。 – user2427671

+0

@ user2427671,你能展示v_map的定義嗎? –

+0

@ user2427671,是的,你需要用new來初始化v_map中的所有頂點指針,然後你可以使用這些新指針來構造成員adj。 –

相關問題