0

我有一个列表,我在其中存储指向对象指针的指针。我有一个函数,在其中创建指向这些对象的指针并将它们的地址存储在列表中(因此指向指针)。然而,一旦这个函数完成,指针不再有效(对象是但不是指针,因为它超出了范围)所以现在我的指针指针不起作用。你如何解决这个问题?

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.
}
4

3 回答 3

2

这是一个简单的示例,说明您可以根据您的评论做一些事情。

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();
    }
}
于 2012-09-08T16:25:42.250 回答
1

只需使用std::list<Actor*>并存储指针。或者,甚至更好,std::list<Actor>. 这里没有任何迹象表明需要任何指针,更不用说指向指针的指针了。

于 2012-09-08T15:47:52.560 回答
0

试试这个:在调用 createEnemy 之后:

Actor * a = * lst.front();
a -> some function.

这还在做问题吗?

我在自己的课堂上测试了代码,结果很好。

于 2012-09-08T16:05:22.373 回答