在C ++中是否有类似于Java中的弱引用? 我有游戏中的对象列表(类Soldier,列表是std :: list * enemy),我在其中列出了可见的敌人士兵列表。我的每一个士兵都可以指向敌方士兵(士兵*目标;内部课程)。当我的其他地方士兵杀死敌人士兵时,我需要什么(然后杀死士兵从敌人名单中移除)我希望所有具有士兵指针的士兵现在都有空,因为它被删除了。 我可以用士兵的身份解决这个问题,并在每个循环中检查是否有同样身份的敌人士兵但似乎是蛮力。我能以更优雅的方式解决这个问题吗(我不能使用c ++ 11?
class Soldier{
Soldier* target;
public:
// other functions
void shootAtTarget();
};
答案 0 :(得分:14)
请注意,没有确切的行为等同性。 Java的弱参考概念实际上依赖于垃圾收集器和一般的托管内存。在C ++中,指针只是一个内存位置,因此其他东西需要“跟踪”对象的生命周期。
在Java中,所有内存都由垃圾收集器管理,因此有一种机制可以知道何时删除了一个对象。在C ++中,没有库使用就不会发生这种情况,因为指针本身实际上只是一个数字。
您应该能够使用std::weak_ptr
(或tr1::weak_ptr
)来获得类似的行为。这需要将对象存储在std::shared_ptr
而不是原始指针中(不过这是一个好主意)。
鉴于您无法使用C ++ 11,您可以将boost::weak_ptr
与boost::shared_ptr
一起使用,而不是使用C ++标准库。
答案 1 :(得分:1)
看起来您应该使用Observer design pattern
http://en.wikipedia.org/wiki/Observer_pattern。
答案 2 :(得分:1)
如果每个士兵都有一个以士兵为目标的士兵名单,那么当士兵死亡时你就可以清除他们的目标。你也可以让目标士兵试图获得另一个目标。
答案 3 :(得分:1)
既然你不能使用weak_ptr(正如在另一个答案中所建议的那样),我建议检查你的其他士兵中的目标是否已经死亡(或解除分配/无效),并采取相应的行动(这就是weak_ptr的内容)会从逻辑的角度给你,除非你必须明确地做检查。)
除非你可以转向C ++ 11(一个好主意)。或者使用boost变体,如另一个答案所述。