2013-07-27 41 views
0

我正在開發一個遊戲項目,我的隊友有一定的方法來解決我們的參考問題,並且它的效果很好,除非遊戲很大時,我們最終會有大量的構造函數。在構造函數中初始化引用

class Player 
{ 
    private: 
     Weapon *w1, *w2, *w3; 
     Armor *a1, *a2; 

    public: 
     Player(Weapon *w1, Weapon *w2, ...) : w1(w1), w2(w2), ...; 
} 

然後我的構造is Player(w1, w2, w3, ...);這是令人不安的,如果有什麼播放器類有100個參考?

有沒有辦法讓這個語法更簡單,還是我們做錯了?有沒有更好的方法來引用玩家類以外的變量?

重要事項 以上只是一個例子,寫得很差。我不只有武器和盔甲。我有很多課程。我有一個開發者控制檯引用,我有armor引用,項目,我有調試類的引用,記錄類,然後列表繼續。矢量對我沒有幫助。對不起,這個不好的例子。

+0

如果您需要傳遞數十個(或更多)參數,那麼您最有可能做錯了什麼。讓構造函數將成員變量初始化爲一個合理的默認值,然後改變那些真正需要修改的元素。 –

+2

至於這種情況下,你考慮過['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)而不是謹慎的變量嗎?如果你使用繼承,那麼無論類型如何,對於* all *設備都可以有單個向量。 –

+1

最後的評論,只是挑剔,但在C++中,你不是初始化引用,你正在初始化*指針*。 C++中的引用有些不同。 –

回答

1

爲什麼不使用vectors

std::vector<Weapon *> W; 
std::vector<Armor *> A; 
+0

因爲武器和盔甲只是一個例子。我有武器,裝甲,工具,開發者控制檯,以及許多課程。他們大多數都有獨特的成員,所以矢量對我來說決不是一個解決方案:/ –

+1

@ZamriMalakun然後我會說這個例子不足以指出特定的數據結構/ stl容器 – P0W

+2

@ZamriMalakun:你可能會考慮使用多態。如果所有不同的設備都來自共同的「設備」類,則可以將它們存儲在單個容器中。如果你需要快速選擇一些「類型」的設備,你可以創建一個'enum'來區分不同的類型,並創建一個'std :: map >裝備件,仍然有辦法獲得所有武器或所有裝甲,而不必通過整個裝備清單。 –

0

不必少數類型的指針固定數量的相反,嘗試使用向量:

class Player 
{ 
    private: 
     std::vector<Weapon*> weapons; 
     std::vector<Armor*> armors; 

    public: 
     Player(const std::vector<Weapon*>&, const std::vector<Armor*>&); 
} 
1

你的確可以把它們都放在一個單一的載體,如果你使用繼承。

對於幻想主題的遊戲(我假設你寫的)也可能是這樣的:

// The base object, contains common attributes 
class Object { ... }; 

// The item class 
class Item : public Object { ... }; 

class Weapon : public Item { ... }; 

class Sword : public Weapon { ... }; 

class Clothing : public Item { ... } 

class Armour : public Clothing { ... }; 

然後,它足以與一個向量所有設備:

std::vector<std::shared_ptr<Item>> inventory; 

對於磨損的東西,你可以有單獨的變量,如

std::shared_ptr<Weapon> wielded; 
std::shared_ptr<Clothing> head; // Helmets, hats, etc. 

或者使用地圖設備齊全的東西:

std::unordered_map<std::string, std::shared_ptr<Item>> equipped; 

然後你可以使用例如

equipped["wielded"] 

獲得揮舞的物品。


爲了完整起見,在上面的分類其他一些可能的類可能是:

class Character : public Object { ... } 

class Player : public Character { ... } 

class Monster : public Character { ... } 

class Dragon : public Monster { ... } 

class RedDragon : public Dragon { ... } 

class TheUltimateBossDragon : public RedDragon { ... } 

作爲一個方面說明,我以前用過像上面的層次結構在我自己的遊戲。然而,在我的下一個遊戲中(當和如果我得到那麼多),我可能會使用另一種模式,其中類表示行爲。例如,swordequipable,它是damage_inflicter,它是takeable等。這意味着更復雜的繼承層次結構,具有更多的多重繼承,並且可能會更多地使用RTTI。但在光明的一面,它將有希望變得更加靈活。

+1

初學者的重要注意事項:僅**就足夠**如果「Object」或「Item」具有公共'虛擬'析構函數。 –