在C++中是否有类似于Java中弱引用的东西?

7
在C++中是否有类似于Java中的弱引用? 我有一个游戏对象列表(Soldier类,列表为std::list* enemy),其中我保存可见敌方士兵的列表。每个我方士兵都可以拥有指向敌方士兵的指针(在类内部是Soldier* target;)。当其他我方士兵杀死敌方士兵时(被杀士兵从敌方列表中删除),我希望所有拥有该士兵指针作为目标的我方士兵现在都为null,因为它已被删除。我可以通过士兵的id来解决这个问题,并在每次循环中检查是否有相同id的敌方士兵,但这似乎太过暴力。我能否以更优雅的方式解决这个问题(我不能使用c++11)?
class Soldier{
Soldier* target;

public:
// other functions
void shootAtTarget();
};

1
http://en.cppreference.com/w/cpp/memory/weak_ptr - user405725
关于C++11;如果我没记错的话,std::weak_ptr也包含在tr1中。除此之外,还有boost::weak_ptr可用。如果一切都失败了,我会查看boost代码并获得灵感。 - Just another metaprogrammer
4个回答

14
请注意,这里没有完全相同的行为等效物。Java的弱引用概念确实依赖于垃圾回收器和管理内存。在C++中,指针只是一个内存位置,因此需要"跟踪"对象的生命周期。
在Java中,所有的内存都由垃圾回收器管理,因此有一种机制可以知道何时删除对象。在C++中,如果不使用库,这是不会发生的,因为指针本身只是一个数字。
您应该能够使用std::weak_ptr(或tr1::weak_ptr)来获得类似的行为。但是,这需要将对象存储在std::shared_ptr中而不是原始指针中(这也是一个好主意)。

如果您无法使用C++11,可以使用boost::shared_ptrboost::weak_ptr代替C++标准库。


他说他不能使用C++11。 - SubSevn
@SubSevn 我也提供了一个备选方案。 - Reed Copsey
2
这不是STL,而是C++标准库。 - Angew is no longer proud of SO

1

1
如果每个士兵都有一个指向该士兵的士兵列表,当士兵死亡时,您可以清除其目标。您还可以使瞄准士兵尝试获取另一个目标。

1

由于您不能使用weak_ptr(如其他答案所建议),我建议在其他Soldiers中检查目标是否已死亡(或已分配/为空),并相应地采取行动(从逻辑上看,这与weak_ptr会给你的类似,只是您必须明确进行检查)。

除非您可以转移到C++11(一个好主意)。 或者使用boost变体,如另一个答案中所提到的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接