2011-11-25 48 views
2

首先,我很抱歉,如果标题不正确的描述我的问题,但我想不出一个更好的。 =/C++如何跟踪局部变量/对象

我试图做一个游戏,我需要在屏幕上绘制所有的实体是一个演员类的子类。

演员类有一个名为“虚拟void drawMe()”的虚拟函数,它由子代覆盖以指定应如何绘制。

人体工程学,在游戏循环的结束,我想提请所有行动者。我创建了一个“矢量allActors”来帮助我这个,每次我创建一个新的演员,我这样做:“allActors.push_back(& newActor)”。到目前为止这么好(我认为)。

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

但我发现,这种方法不会为我本地创建,像子弹字符芽(他们是内部的if语句创建)时创建的演员的工作。 我认为这是因为当我在allActor矢量中保存子弹的地址时,演讲者本身在if语句结束后被销毁,所以这是一个无用的地址。

例如:

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

我不知道该怎样做到这一点的方式,它的作品,因为我只能创建子弹演员在角色芽的想法!

请帮我找出一个更好,更实用的方式做我想做的。

预先感谢您!

+0

我喜欢你对这个问题的想法。这是一个初学者的问题,但我只希望所有初学者都仔细考虑,并花时间耐心地提问。你会很快到达那里! – sehe

回答

2

动态分配对象:

allActors.push_back(new Bullet); 

注意,寿命管理将是一个真正的恶梦;你应该使容器元素成为某种智能指针(最好是std::unique_ptr<Bullet>或者一些合适的基类)。

+0

呵呵 - 总是乐观主义者。不是一场噩梦......如果所有的指针都是由矢量所拥有的,那么只要记住在删除时删除项目(并且在破坏矢量之前删除所有项目)。这可能是一个(容易出错的)杂事,所以智能指针有很多帮助。 – sehe

+0

@sehe:是的,也许:-)考虑到OP在家中似乎没有100%的动态与自动存储的概念,我让我的想象力疯狂起来......但是你是对的,它是完全有可能她的代码完全没问题! –

+0

谢谢大家的回复,我之前从未使用动态对象分配。有效!我仍然想知道你们对智能指针的看法,但是我会去那里! =) 注:我是他。大声笑 – DaedalusCoder

0

你就在你的假设,即你推一个地址到本地对象,那么超出范围。这样做会导致您的应用程序非常不稳定。

分配对象上堆相反,使用智能指针跟踪对象的生命周期中对您:

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

这给了你一个问题:你必须从allActors取出子弹阵列击中目标后。