2012-09-08 250 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. 

這仍然是做題?

我測試了我自己班的代碼,它很好。