2015-06-03 161 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.