2016-04-01 47 views
1

由於其中一個對象中的指針問題,我想出了一些想法如何在我的應用程序中設計對象複製的問題。最簡單的模式是這樣的:在指定運算符中複製指向另一個列表元素的指針

MyMapClass.h

class MyMapClass 
{ 
    public: 
     std::vector<Point> points; 
     std::vector<Road> roads; 

     MyMapClass& operator=(const MyMapClass&); 
} 

MyMapClass.cpp

MyMapClass& MyMapClass::operator=(const MyMapClass& m) 
{ 
    points = m.points; 
    roads = m.roads; // here is error 
    return *this; 
} 

Point.h

class Point 
{ 
    public: 
     std::string name; 
     std::vector<float> position; 
} 

Road.h

class Road 
{ 
    public: 
     Point* source; 
     Point* destination; 
} 

最初設計時沒有需要複製MyMapClass對象,我花了一段時間才能發現這個錯誤。

據我現在的理解,當我將兩個向量複製到roadssourcedestination的元素中的新對象地址時,它們保持不變。所以當舊對象被銷燬時,roads元素中的指針只會指向垃圾。

你會如何推薦複製roads向量,以便它的元素將指向新的對象?

+0

升級'road'類,以便它可以正確複製自身。 – Unimportant

+0

@ user1320881我在想它,但會知道新的點地址嗎? – sebap123

回答

1

如果可以,請在Road中使用Point類型的對象而不是Point*

class Road 
{ 
    public: 
     Point source; 
     Point destination; 
}; 

如果您必須使用指針,請按照The Rule of Three。另外,如果您必須使用指針,請考慮使用智能指針std::shared_ptrstd::unique_ptr,而不是原始指針。

+0

我必須使用指針。我會看看三大規則。 – sebap123

+0

爲什麼你必須使用指針? – Unimportant

+0

因爲在某些地方我需要通過道路訪問'Point'對象。 – sebap123

0

只需創建一個拷貝構造函數用於class Road ... The copy assignment of std::vector將調用每個元素的拷貝構造函數....

class Road 
{ 
    public: 
     Point* source; 
     Point* destination; 
     Road(const Road& r) { /* implement copy operations of source and destination here */ } 
} 

然後在這裏分配將調用上面拷貝構造函數創建的所有新元素

MyMapClass& MyMapClass::operator=(const MyMapClass& m) 
{ 
    points = m.points; 
    roads = m.roads; // invokes copy constructor m.roads.size() times 
    return *this; 
} 
+0

我在想它,但它會知道點的新地址? – sebap123

+0

是的,它會......提供你的'class Road'的拷貝構造函數,使'source'和'destination'指向新的位置 – WhiZTiM

+0

是的,我知道這一點。但是我擔心的是,如果source和destination指向內存中的一個位置並且points = m.points新的對象被創建,source和destination仍指向內存中的舊位置。他們不知道發生了一些變化。 – sebap123

相關問題