2012-10-05 37 views
3

这是关于一个带有坦克射击炮弹的C++控制台游戏。问题在于罐壳部分。 我想创建一个PlayerTankShell类的对象,并在每次按下空格按钮时将其添加到链接列表中。我怎样才能做到这一点 ?动态创建对象并将它们添加到链接列表

这里是我的代码:

#include <iostream> 
#include <conio.h> 
#include <list> 

using namespace std; 

#define ATTACK 32 

class PlayerTankShell 
{ 
    int x; 
    int y; 
    int speed; 
    bool isExist; 

public: 
    PlayerTankShell(bool exists) 
    { 
     isExist = exists; 
    } 
    bool getExistense() 
    { 
     return isExist; 
    } 
}; 

int main() 
{ 
    char input; 
    input = getch(); 

    if (input == ATTACK) 
    { 
     // Here create an object and add it to the linked list 
    } 

    // My test so far: 
    PlayerTankShell *s1 = new PlayerTankShell(1); 
    PlayerTankShell *s2 = new PlayerTankShell(1); 
    PlayerTankShell *s3 = new PlayerTankShell(1); 

    list<PlayerTankShell> listShells; 

    listShells.push_back(*s1); 
    listShells.push_back(*s2); 
    listShells.push_back(*s3); 

    list<PlayerTankShell>::iterator i; 

    for (i = listShells.begin(); i != listShells.end(); i++) 
    { 
     cout << "exists=" << i->getExistense() << endl; 
    } 

    return 0; 
} 
+1

作为便笺,你应该定义你的'PlayerTankShell()''构造explicit'和'getExistense()'方法可以被标记为'const'。 –

+0

究竟该怎么做? 在此先感谢。 –

回答

0

你想要的东西,如:

std::list<PlayerTankShell> shells; 

那么你可以添加到它:

shells.push_back(PlayerTankShell(true)) 
+0

非常好。谢谢! 后来我需要遍历它们才能在屏幕上打印它们。 –

+0

因为你的PlayerTankShell没有拷贝构造函数,所以当你添加/从集合中删除时,最后很容易复制,所以只要你把指针/复杂对象放在那里就小心了。 – Benj

+0

如果他们走出屏幕,我会用i-> setExistence(false)标记他们的删除;我的问题是如何从链表中删除它们,而不会丢失迭代器,也许是这样的:i = listShells.erase(i);那是对的吗? –

0

如果你想指针PlayerTankShell保存在列表中,你可能想用一些智能指针模板类,如shared_ptr(如果那些PlayerTankShell也在代码的其他部分共享,一旦引用计数达到零,它们将被破坏,即STL容器和shared_ptr您有一个“确定性垃圾回收器“):

// List of smart pointers to PlayerTankShell 
list<shared_ptr<PlayerTankShell>> shells; 

// Add new PlayerTankShell to the list 
shells.push_back(make_shared<PlayerTankShell>(true)); 
相关问题