2015-07-20 178 views
0

我有一類名爲Group對象更新

class Group 
{ 
    int id; 
    string addr; 
    set<int> members; 
    ... 
}; 

我有一個指針存儲在這些容器多個組:

vector<Group*> grpVec 
map<int, Group*> grpIdMap 
map<string, Group*> grpAdMap 

我保存這樣的指針:

//create and populate group object pointer Group *grp 
grpVec.push_back(grp) 
grpIdMap.insert(std::pair<int,Group*>(grp->id, grp)) 
grpAdMap.insert(std::pair<string,Group*>(grp->addr, grp)) 

現在,我想更新一個組對象。如果我只更新grpIdMap容器​​中的指針,所有其他容器中的相同對象指針是否會更新?

//Will this update the same pointer object in grpVec and grpAdMap? 
grpIdMap.find(1)->second->members.insert(99) 

這種方法有什麼問題嗎?

+1

看起來你應該使用共享指針,即'std :: shared_ptr '而不是原始指針。 – PaulMcKenzie

+0

所有這些指針,實際存儲的對象是什麼? –

+0

這是你的方法問題:如果'grp'是動態分配的,哪個容器負責釋放內存? – PaulMcKenzie

回答

0

它改變對象的價值指針指向,只要不是所有的指針指向同一個對象的指針value.So,它會工作

2

如果指針都指向了同一個對象,那麼你可以使用任何指針來改變這個對象。


讓我們看看它有點 「圖形」:

 
+-------------------+ 
| pointer in vector | -----\ 
+-------------------+  \ 
          \ 
+--------------------+  \  +---------------+ 
| pointer in one map | -------->--- | actual object | 
+--------------------+  / +---------------+ 
          /
+----------------------+ /
| pointer in other map | --/ 
+----------------------+ 
+3

可能值得向@cppcoder強調,如果你要修改'Group'實例的'id'或'addr'成員,它會_not_不改變'grpIdMap'或'grpAdMap'對象的索引。舊的索引需要刪除,並添加一個新的索引。 – paddy

+0

是的,多數民衆贊成 – cppcoder

1

這種方法將更新對象。如果有任何指向這個對象的指針(而不是它的副本),那麼他們會得到更新的信息。

我建議你停止使用原始指針和閱讀如何在這裏使用智能指針:Which kind of pointer do I use when?

而且我覺得你應該看看這一個:http://en.cppreference.com/w/cpp/memory/shared_ptr

附:在你的類中使用封裝。其他對象不應該知道數據如何存儲在你的類中,只是提供接口。

P.P.S.如果你想要所有的成員公開,也許你想要使用struct而不是class

+1

'shared_ptr'是安全的選擇,但確實帶來了性能問題,這可能不是在這種特定情況下需要的。我喜歡你關於封裝的觀點,這是最好的建議。在這種情況下,'unique_ptr'的矢量可能更合適,然後封裝類可以處理映射中的原始指針。 – paddy

+0

@paddy,我同意你的說法,'unique_ptr'必須是默認選項。尋找其他類型的指針應該基於時間測量和具體原因。 –

+0

我沒有得到如何使用'unique_ptr'。你能爲我的代碼展示一個例子嗎? – cppcoder