2017-09-12 49 views
4

我对使用多个指针指向对象有个疑问。 我有一个向量中的指针,另一个在地图中。 地图使用矢量来索引对象。示例代码:如何通过向量/地图使用多个指向对象的指针

class Thing 
{ 
public: 
    int x = 1; 
}; 

Thing obj_Thing; 

std::vector<Thing*> v_Things; 

v_Things.push_back(&obj_Thing); 

std::map<int, Thing*> m_ThingMap; 

m_ThingsMap[v_Things[0]->x] = v_Things[0]; // crucial part 

是不是很好的做法,像这样指定彼此的指针?

该矢量和/或地图应该保存地址吗?或者我应该使用指向地图指针的指针?

+1

'v_Things(0)'应该可能是'v_Things [0]'? 'v_Things.push_back(&obj_Thing);'是非常危险的,因为它可以很容易地创建悬挂指针('obj_Thing'生命周期可能比矢量和映射的生命周期更早结束) – UnholySheep

+1

而不是存储'Thing *',你可能想要存储'std :: shared_ptr '而不是,以确保该对象不会太早解除分配(并指出它是在两个单独的“事物”之间共享) – UnholySheep

+0

固定的错字,谢谢。如果不是所有v_Things成员都必须位于m_ThingsMap中,我还应该使用shared_ptr吗? –

回答

4

这一切都取决于你想要做什么。

但是,当您的项目不断增加时,您的方法会变得非常多毛,尤其是当其他人对其做出贡献时。

首先,这样的:

m_ThingsMap[v_Things[0]->x] = v_Things(0); 

应该是:

m_ThingsMap[v_Things[0]->x] = v_Things[0]; 

此外,在std::vector存储原始指针是可能的,但需要特别小心,因为你可能最终与悬空指针,如果指针指向的对象太快解除分配。

对于我建议你使用std::weak_ptr,像这样:

std::vector<std::weak_ptr<Thing>> v_Things; 

的情况下,你决定坚持这一做法(我的意思是,如果指针指向的对象,它是从另一个指针的指针共享)。


如果我是你,我会重新设计我的方法,因为你的代码不够干净,更不用说你的逻辑了;人们需要一两分钟的时间才能了解所有指针和共享位置正在发生的事情。

+1

我这样做:p ------- – Quentin

相关问题