我正在处理一个 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);
}
答案 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*
。
答案 1 :(得分:0)
我需要在主函数中使用什么来在父类中存储子类?
这是不可能直接的。您会看到,子类在其中包含其父类的实例。所以,如果孩子包含一个父实例,其中包含一个子实例,其中包含一个父实例,其中包含一个子实例,其中包含......你能在这里看到问题吗?
解释这个问题的另一种方法是“包含”某物(作为成员)需要在定义容器之前定义该东西。因此,父级需要在其自身之前定义子级,而子级需要在其自身之前定义父级。无法对定义进行排序以满足这两个要求。
这样的事情可以通过间接方式实现:父类可以间接引用或指向子类的实例。指向不需要指向类型的定义。