2015-06-03 103 views
1

我需要帮助的链表,如果我有:创建多个对象

class gameObject{ 
    public: //get and set; 
    private: int x; 
    int y; 
    string texture; 
} 

class gun:public gameObject{ 
    public: //get and set; 
    private: int ammo; 
} 

class armor:public gameObject ... , 
class boots:public gameObject... 

如何我可以创建基类游戏物体的多个派生对象的链接列表?例如用户有一个菜单:[1。添加对象2.删除对象]。如果用户选择1,则会出现另一个菜单[类型:单枪2-护甲]。添加4个对象后,列表将为:1.Gun 2.Armor 3.Gun 4.Boots。 我需要一个例子来理解这个概念。

谢谢。

+4

'的std ::列表'' – NathanOliver

+3

的std ::列表<性病::的unique_ptr >' – Quentin

回答

1

如何从基类gameObject创建多个派生对象的链表?

你会结合使用std::forward_list(单链表)或std::list(双向链表)与像std::unique_ptrstd::shared_ptr智能指针(取决于拥有语义),如下所示:

std::list<std::unique_ptr<gameObject>> list; 

然后你会分配使用的对象:

list.emplace_back(std::make_unique<gameObject>(...)); 
0

你会想为此使用自动指针。

list<unique_ptr<gameObject>> foo; 

foo.push_back(make_unique<gun>()); 
foo.push_back(make_unique<armor>()); 

for(auto& i : foo){ 
    if(dynamic_cast<gun*>(i.get())){ 
     cout << "gun" << endl; 
    }else if(dynamic_cast<armor*>(i.get())){ 
     cout << "armor" << endl; 
    } 
} 

此示例将一个gun并且然后armorfoo作为unique_ptr<gameObject>

for -loop中,我们使用dynamic_cast来辨别类型。该代码将输出:


装甲

你可以看到这个代码在这里的一个例子:http://ideone.com/trj9bn

1

其他人的答案是好的,但如果他们回答错了问题在这里:

的指针基本类型(智能或其他方式)可以指向任何派生类型的,所以你需要做的指针列表的碱基T YPE。

你不能让基类型本身的列表,因为派生类型的可能更大,将不适合。该语言甚至不会让你尝试。

std::list<GameObject *> is ok. 
std::list<GameObject> is not.