我有一个列表,其中存储指向对象指针的指针。我有一个函数,可以创建指向这些对象的指针,并将它们的地址存储在列表中(因此指针指向指针)。然而,一旦这个函数完成,指针就不再有效(对象是指针,但不是指针,因为它超出了范围),所以现在我的指针到指针就不起作用了。你是怎么解决的?
list<Actor**> lst;
void CreateEnemy()
{
Actor* a = new Actor();
lst.push_back(&a);
}
int _tmain(int argc, _TCHAR* argv[])
{
CreateEnemy();
// at this point the pointer to a pointer stored in lst isn't valid anymore because it went out of scope after CreateEnemy() completed.
}
这里有一个简单的例子,说明您可以根据自己的评论做些什么。
list<unique_ptr<Actor>> lst;
void CreateEnemy()
{
lst.push_back(unique_ptr<Actor>(new Actor));
}
void KillRandomEnemies()
{
for (auto& i : lst)
{
if (rand() % 100)
i.reset();
}
}
class Projectile
{
public:
Projectile(unique_ptr<Actor> & a)
:actor(&a)
{}
bool IsTargetDead() const { return !(*actor); }
private:
unique_ptr<Actor> * actor;
};
int main()
{
CreateEnemy();
Projectile proj(lst.front());
while (something())
{
KillRandomEnemies();
if (proj.IsTargetDead())
whatever();
}
}
只需使用std::list<Actor*>
并存储指针。或者,更好的是std::list<Actor>
。这里没有任何内容表明需要任何指针,更不用说指向指针的指针了。
试试这个:调用createEnemy:之后
Actor * a = * lst.front();
a -> some function.
这仍然有问题吗?
我在自己的课上测试了代码,结果很好。