2015-07-20 132 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