2015-12-06 205 views
0

我是C++新手,使用列表時出現問題。我不明白爲什麼我在下面的示例中出現錯誤。C++列表 - 添加項目

遊戲對象類是一個抽象類 Player類和子彈類繼承遊戲對象類

list<GameObject*> gameObjects = list<GameObject*>(); 
gameObjects.push_front(&player); 
while(gameLoop) 
{ 
    if (canShoot) 
    { 
     Bullet b = Bullet(player.Position.X , player.Position.Y); 
     gameObjects.push_front(&b); 
    } 
    for each (GameObject *obj in gameObjects) 
    { 
     (*obj).Update(); // get an error 
    } 
} 

的錯誤是調試錯誤-Abort()被調用。

+0

哪些錯誤?你可以說得更詳細點嗎? – Baltasarq

+0

@Baltasarq我猜錯誤的地方,他是poop9ng通過一個矢量完整的處置對象?可能是SEGFAULTS – CompuChip

+0

爲什麼你需要'list gameObjects = list ();'?我的意思是初始化部分。 – Mahesh

回答

2

foreach語法是錯誤的,實際上,更多的是,遍歷列表中的每一個元素,使其:

for (GameObject *obj : gameObjects) 
{ 
    obj->Update(); 
} 

或者,預C++ 11:

for(std::list<GameObject*>::iterator itr = gameObjects.begin(); itr != gameObjects.end(); ++itr) 
{ 
    (*itr)->Update(); 
} 

另外,您正在創建一個Bullet對象,其範圍爲if (canShoot),並將其地址推送到std::list<GameObject*>。到達您的foreach時,Bullet對象已經被銷燬,因此列表中的指針懸而未決。

在堆上動態分配給你的對象:

list<GameObject*> gameObjects; 

while(gameLoop) 
{ 
    if (canShoot) 
    { 
     Bullet* b = new Bullet(player.Position.X , player.Position.Y); 
     gameObjects.push_front(b); 
    } 
    for (GameObject* obj : gameObjects) 
    { 
     obj->Update(); 
    } 
} 
+0

謝謝你的回答:)。但現在編譯器告訴我:錯誤\t C2259 \t'GameObject':無法實例化抽象類 – user2837445

+0

@ user2837445回答更新,使用堆分配。 –