7

C++ 中是否有类似于 Java 中的弱引用的东西?我有游戏中的对象列表(士兵类,列表是 std::list* 敌人),其中我持有可见敌方士兵的列表。我的每个士兵都可以有指向敌方士兵的指针(士兵*目标;类内)。当其他地雷士兵杀死敌方士兵时我需要什么(然后将被杀死的士兵从敌人列表中删除)我希望我所有以该士兵指针为目标的士兵现在都为空,因为它已被删除。我可以用士兵的 id 解决这个问题,并且在每个循环中检查是否有具有相同 id 的敌方士兵,但它似乎是蛮力的。我可以用更优雅的方式解决这个问题吗(我不能使用 c++11?

class Soldier{
Soldier* target;

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

4 回答 4

14

请注意,没有确切的行为等效项。Java 的弱引用概念实际上依赖于垃圾收集器和一般的托管内存。在 C++ 中,指针只是一个内存位置,因此需要其他东西来“跟踪”对象的生命周期。

在 Java 中,所有内存都由垃圾收集器管理,因此有一种机制可以知道对象何时被删除。在 C++ 中,如果不使用库,这不会发生,因为指针本身实际上只是一个数字。

您应该能够使用std::weak_ptr(或tr1::weak_ptr)来获得类似的行为。不过,这需要将您的对象存储在 astd::shared_ptr而不是原始指针中(无论如何这是一个好主意)。

鉴于您不能使用 C++11,您可以使用boost::weak_ptrwithboost::shared_ptr而不是 C++ 标准库。

于 2013-05-17T16:09:43.327 回答
1

看起来您应该使用Observer design pattern http://en.wikipedia.org/wiki/Observer_pattern

于 2013-05-17T16:10:21.010 回答
1

如果每个士兵都有一个以该士兵为目标的士兵列表,您可以在士兵死亡时清除他们的目标。您还可以让目标士兵尝试获取另一个目标。

于 2013-05-17T16:10:28.110 回答
1

由于您不能使用weak_ptr(如另一个答案中所建议的那样),我只建议检查您的其他士兵中的目标是否已死(或已释放/为空),并采取相应的行动(这就是weak_ptr 会从逻辑的角度给你,除非你必须明确地做检查)。

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

于 2013-05-17T16:14:36.967 回答