2011-11-21 55 views
1

在我的游戏中,有很多Foo类的对象互相交互。类Foo的静态方法使用容器更新所有对象,以便跟踪创建的对象。任何时候都可能死于多个对象的对象

我的问题是,一个Foo对象可能会杀死另一个对象,Foo的其他实例不知道这个可怕的事件,他们可以使用死对象(删除),从而给出一个错误。

我有一些想法,以避免指针删除的对象,但我不认为他们是合适的。

1)一类智能指针的用于检查空对象。

大概这是糟糕的想法,我也没看不出任何地方这样的事情。我可以创建一个指针,当调用delete时,删除指向的Foo对象,然后在转换为Boolean时给出false(所以可以知道是否可以调用它的方法)。

2)每个Foo对象不与一个指针,但与ID跟踪其他对象。

然后对象通过Foo类的静态方法获取指向另一个Foo对象的指针(正如我所说的Foo类有一个跟踪所有实例的容器)。 它也可以在多线程环境中进行简单的修改,但它可能非常广泛,每个对象在每个帧期间都会在容器中搜索另一个对象。

3)每个Foo对象跟踪具有一个指向它的指针的对象。 该对象在杀死(删除)时调用其他对象的方法。然后这些对象删除指向已删除对象的指针。还有其他的课程。所以这不是真正的面向对象。

我实际上认为有一个简单的解决方案,我找不到。

回答

4

基本上所有这些对象共享这个Killable对象的所有权。你可以给他们最强有力的保证是它不会从他们下面被删除。你可以通过给每一个boost::shared_ptr来完成。当它死亡时通知所有对象将允许它们放弃它们的参考。您可以使用boost::signals来完成此操作。我会为此尝试。

如果你不能这样做,那么你可以让他们存储一个boost::weak_ptr,当他们对boost::weak_ptr::lock的呼叫失败时,他们会知道它已经死了。