将子对象存储在父对象中

时间:2021-05-17 11:38:50

标签: c++

我正在处理一个 C++ 学校项目。我想在主函数中将子卡对象存储在父卡对象中,因为我需要将库(std::vector<card> _library;)中的卡设置为相同类型。

我需要在主函数中使用什么来在父类中存储子类?

类和主要功能的定义:

#ifndef CARD_H
#define CARD_H

class player;
class card
{
protected:
    std::string _name;
    std::string _type;
    player _owner;
public:
    card();
    card(std::string name, std::string type);
    void setOwner(player&);
    
    virtual void play();

};
#endif
#ifndef  ENCHANTMENT_H
#define ENCHANTMENT_H 

class enchantment :public card
{

public:
    enchantment()
    enchantment(std::string name, std::string type);

    void play() override;
};
#ifndef CREATURE_H 
#define CREATURE_H 


class creature :public card
{
public:
    creature();
    creature(std::string name, std::string type);

    void play()override;
    
};
#endif
#ifndef PLAYER_H
#define PLAYER_H 

class card;
class player
{
protected:
    std::string _name;

    std::vector<card> _hand;
    std::vector<card> _library;
    std::vector<card> _in_play;
    std::vector<card> _discards;

public:
    player();
    player(std::string name);
    

    //setter functions
    void setLibrary(std::vector<card>);

};

#endif // !PLAYER_H
int main() {


    player p1("player1");

    creature p1Soldier01("Soldier", "Creature");
    creature p1Soldier02("Soldier", "Creature");

    enchantment p1Rage01("Rage", "Enchantment");
    enchantment p1Rage01("Rage", "Enchantment");

    std::vector<card> player1Cards(4);
    //this is the part i need help.


    p1.setLibrary(player1Cards);
}

2 个答案:

答案 0 :(得分:0)

还没有人回答,但一个常见的方法是动态多态。可能的实现:

std::vector<std::unique_ptr<card>> allCards; 
allCards.push_back(std::make_unique<enchantment>("foo", "bar"));
std::vector<card*> in_hand; // only has references to the existing card objects.
in_hand.push_back(allCards[0].get());

(p.s. 不要忘记基类中的虚析构函数!)

或者静态多态,其中甚至不需要公共基类

using Card = std::variant<Enchantment, Creature, ...>;
std::vector<Card> cards;

您不需要将子类存储在父类中(CRTP 等一些例外)。通常你可以使用多态,即覆盖虚函数,就像 play() 的情况一样。 (对于静态多态性/变体,您需要一个访问者)。

附言card 不能有 player 对象,因为 player 不是一个完整的类型。但是您根本不希望卡片“拥有”玩家对象。相反,您应该指向现有的播放器对象,即 player*

example

答案 1 :(得分:0)

<块引用>

我需要在主函数中使用什么来在父类中存储子类?

这是不可能直接的。您会看到,子类在其中包含其父类的实例。所以,如果孩子包含一个父实例,其中包含一个子实例,其中包含一个父实例,其中包含一个子实例,其中包含......你能在这里看到问题吗?

解释这个问题的另一种方法是“包含”某物(作为成员)需要在定义容器之前定义该东西。因此,父级需要在其自身之前定义子级,而子级需要在其自身之前定义父级。无法对定义进行排序以满足这两个要求。

这样的事情可以通过间接方式实现:父类可以间接引用或指向子类的实例。指向不需要指向类型的定义。