首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按基类将派生对象存储在向量中,移除后将它们返回给派生对象。

按基类将派生对象存储在向量中,移除后将它们返回给派生对象。
EN

Stack Overflow用户
提问于 2016-04-14 03:01:43
回答 2查看 262关注 0票数 0

我是C++的新手,所以我决定创建一个纸牌游戏。我想将派生的卡片对象作为卡片*存储在向量中。当有人画一张卡片时,我想从向量中取出第一个对象并返回它。这是事情变得棘手的地方,当我这样做时,我想把它从Card*转换回它原来的派生类型。我读到,在c++中没有明确的转换是不可能的,我想要么重申这一点,要么找到解决方案。

卡片类

代码语言:javascript
复制
class Card
{
public:
    int Cost;
    string Name;
    string Description;

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

灵魂阶级

代码语言:javascript
复制
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);
};

最后是一个特定卡片类的示例。

代码语言:javascript
复制
class Fire_Spirit : public Soul
{
public:
    Fire_Spirit() : Soul(1, "Fire Spirit", "A lonely spirit born from the inferno.", 2, 1) {}
    ~Fire_Spirit();
};

甲板级

代码语言:javascript
复制
class Deck
{
public:
    Deck();
    ~Deck();
    Card* Draw();
    void Shuffle();
    void Add(Card* cardToAdd);
    void PrintDeck();
    static vector<Card*> Cards;
};

绘制法

代码语言:javascript
复制
auto Deck::Draw() -> Card*
{
    auto temp = Cards.front();
    Cards.erase(Cards.begin());

    return temp;
}

理想情况下,我只想在这里返回auto,但我读到我需要为方法定义返回类型的auto (我希望不这样显示)

我想从卡*到Fire_Spirit(*?)或者任何其他特定的卡类。我知道我可以做一个巨大的转换声明,但必须有一个更好的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-14 04:27:33

根据评论中提供的反馈,我会提出这样的解决方案:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-04-14 03:10:29

按指针存储在容器中会导致类型信息在您将类型放入容器时丢失。类型擦除的要点正是以统一的方式处理元素,而类层次结构就是这样做的。

如果您想要返回类型信息,则需要使用typeid(my_var)dynamic_cast询问运行时。确保基类具有虚拟析构函数。这将为您提供原始类型:

代码语言:javascript
复制
auto temp = cards.front();
if (typeid(temp) == typeid(MyDerivedCard)) {

}
else if (...) {

}

代码语言:javascript
复制
if ((MyDerivedCard * c = dynamic_cast<MyDerivedCard>(temp)) != nullptr) {
//Use derived
}
...

P.S.:你可以用std::unique_ptr<Card>来存储卡片。它们将自动删除内存并清除所有权。在ptr了解它

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36613102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档