C ++如何跟踪局部变量/对象

时间:2011-11-25 21:08:29

标签: variables local draw children actor

首先,如果标题没有正确描述我的问题,我很抱歉,但我想不出更好的问题。 = /

我正在尝试创建一个游戏,我需要在屏幕上绘制的所有实体都是Actor类的子项。

actor类有一个名为“虚拟空白drawMe()”的虚函数,被子节点覆盖以指定它应该如何绘制。

Ergo,在游戏循环结束时,我想画出所有演员。我创建了一个“ vector allActors ”来帮助我解决这个问题,每次创建一个新演员时我都这样做:“ allActors.push_back(& newActor)”。到目前为止一切都很好(我认为)。

要在循环结束时绘制它们,我会遍历allActors中的所有元素,并为每个元素调用“ allActors [i] - > drawMe()”。

但我发现这种方法不适用于我在本地创建的演员,比如角色射击时创建的子弹(它们是在if语句中创建的)。 我认为这是因为当我在allActors向量中保存项目符号的地址时,在if语句结束后,actor本身就被销毁了,所以它是一个无地址。

示例:

if ( characterShot == true)
{
    Bullet newBullet;
    allActors.push_back( &newBullet );
    characterShot = false;
}

我不知道如何以一种有效的方式做到这一点,因为我只能在角色射击时创造子弹演员!

请帮助我找出一种更好,更实用的方法来做我想做的事。

提前谢谢!

2 个答案:

答案 0 :(得分:2)

动态分配对象:

allActors.push_back(new Bullet);

请注意,终身管理将是一场真正的噩梦;你应该使容器元素成为某种智能指针(理想情况为std::unique_ptr<Bullet>或某些合适的基类)。

答案 1 :(得分:0)

您认为将地址推送到本地对象然后超出范围是正确的。这样做会导致您的应用程序非常不稳定。

使用智能指针在堆上分配对象,该指针会为您跟踪对象的生命周期:

allActors.push_back(tr1::shared_ptr<Bullet>(new Bullet));

这会给您带来另一个问题:您必须在allActors阵列到达目标后从其中移除子弹。