2016-04-14 15 views
0

我是C++的新手,所以決定創建一個紙牌遊戲。我想將派生的卡片對象作爲卡片*存儲在一個向量中。當有人抽卡時,我想從矢量中獲取第一個對象並將其返回。這是事情變得棘手的地方,當我這樣做時,我想將它從Card *轉換回原來的派生類型。我正在讀的是,如果沒有明確的演員表,就不可能在C++中低調,我想重申一下或者找到一個解決方案。通過基類在一個向量中存儲派生對象,並在移除時將它們返回給派生對象

卡類

class Card 
{ 
public: 
    int Cost; 
    string Name; 
    string Description; 

    Card() {} 
    Card(int Cost, string Name, string Description) : Cost(Cost), Name(Name), Description(Description) {} 
}; 

靈魂類

class Soul : public Card 
{ 
public: 
    int Attack; 
    int Defense; 

    Soul(int Cost, string Name, string Description, int Attack, int Defense) :Card(Cost, Name, Description), Attack(Attack), Defense(Defense) {} 
    void Attacking(Soul* DefendingSoul); 
}; 

和最後一個特定的卡類的例子

class Fire_Spirit : public Soul 
{ 
public: 
    Fire_Spirit() : Soul(1, "Fire Spirit", "A lonely spirit born from the inferno.", 2, 1) {} 
    ~Fire_Spirit(); 
}; 

甲板類

class Deck 
{ 
public: 
    Deck(); 
    ~Deck(); 
    Card* Draw(); 
    void Shuffle(); 
    void Add(Card* cardToAdd); 
    void PrintDeck(); 
    static vector<Card*> Cards; 
}; 

Draw方法

auto Deck::Draw() -> Card* 
{ 
    auto temp = Cards.front(); 
    Cards.erase(Cards.begin()); 

    return temp; 
} 

理想我只想回到這裏的汽車,但我讀了我需要定義自動爲方法的返回值類型

我想(我很想做出另外的說明)從卡片*到Fire_Spirit(*?)或任何其他特定的卡片類別。我知道我可以做一個巨大的切換聲明,但必須有更好的方法?

回答

1

通過在註釋中提供的反饋,我會去的這樣一個解決方案:

class Card { 
private: 
    CardKind kind_; 
    std::fucntion<void (Card &)> attack_; 
    std::function<void (Card &)> effectFunc_; 

    std::unordered_map<std::string, boost::any> properties; 

    Card(CardKind kind, std::function<void (Card &)> attackFunc, 
     std::function<void (Card &)> effectFunc); 
}; 
+1

我會仔細研究一下。非常感謝,你一直非常樂於助人! – Maspe36

+0

事實上,現在你可以擁有三元組(kind,effectfunc,attackfunc)的集合並存儲在某個關聯容器中。這些可以用來構造我們的卡片類型。更靈活。 –

0

通過指針存儲在容器中會在您將類型放入容器時丟失類型信息。類型刪除點正是以統一的方式處理元素,而類層次結構則是這樣做的。

如果您想要返回類型信息,則需要詢問運行時的typeid(my_var)dynamic_cast確保您的基類具有虛擬析構函數。這會給你的原始類型:

auto temp = cards.front(); 
if (typeid(temp) == typeid(MyDerivedCard)) { 

} 
else if (...) { 

} 

if ((MyDerivedCard * c = dynamic_cast<MyDerivedCard>(temp)) != nullptr) { 
//Use derived 
} 
... 

P.S:你可以使用std::unique_ptr<Card>存儲卡。他們將自動刪除內存並清除所有權。瞭解它在http://en.cppreference.com/w/cpp/memory/unique_ptr

+0

但如果我按照這不會我結束了一個巨大的if/else或switch語句?我應該更清楚地說明這一點,但我打算在那裏有很多卡片,都有自己的班級。認爲神奇的聚會或爐石數量的卡。 – Maspe36

+0

我建議你在上百萬課之前改變你的設計(我前段時間玩過魔術師:D)。更均勻地存儲信息,不要使用類層次結構。 –

+0

你也可以使用每個類和其他技巧的函數註冊,但這會使事情變得複雜很多。 –

相關問題