2012-09-08 180 views
0

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

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

是否有特别的理由来存储一个指向指向列表中的对象的指针,而不是直接指向该对象的指针? –

+0

如果你需要*(请确保你这样做)指针的指针,我认为你必须在你的函数中分配一个'Actor **',而不仅仅是一个'Actor *'。 – chris

+0

克里斯如何看待?我无法获得正确的语法。所以Actors在一个类中创建并存储在这个列表中。它们作为抛射物目标被传递给了射弹类。但是5个投射物可以具有相同的目标。第一个射中目标的射手会杀死Actor,导致它被删除(我想要的),但其他4个射弹仍然会有指向已删除目标的指针,NULL检查将不起作用,除非我检查指向指针的指针。 – user441521

回答

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(); 
    } 
} 
+0

我需要用KillRandomEnemies()中的for循环来做什么?它不喜欢那种语法,我从来没有见过它。猜测这是新的C++风格?我仍然在使用C++的oldville。 – user441521

+0

@ user441521:是的,这是一个基于范围的for循环,在C++ 11中是新的。如果你的编译器不支持它,只需用for循环遍历容器中的每个元素来替换它。 GCC已经支持了一段时间。 Visual C++ 10不支持它,但我认为版本11。 –

1

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

+1

如果他确实需要一个指针(可能是多态),它应该是一个智能指针。 –

+0

@BenjaminLindley - 不一定。智能指针只有在共享所有权时才适用。 –

+1

不,智能指针适用于任何类型的所有权。 'shared_ptr'用于共享所有权,'unique_ptr'用于非共享所有权。非智能指针只适合作为非拥有参考。这不太可能,因为他动态地分配对象。 –

0

试试这个: 调用createEnemy后:

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

这仍然是做题?

我测试了我自己班的代码,它很好。