我正在尝试用C ++解决有关继承的问题,并想知道如何正确地进行。
我设置了3个班级: - 敌人(有成员数据:int Damage,int Health和int Level) - 狼 - 熊
我的遗产建立的方式是:狼是 - 敌人,熊是 - 敌人。换句话说,狼和熊都继承了敌人。
我想设置我的程序,以便在我创建一个新的敌人时:
Enemy anEnemy;
然后在Enemy :: Enemy()构造函数中,它会随机决定敌人是狼还是熊。
如何解决这个问题?我知道我必须在Enemy :: Enemy()构造函数中生成一个随机数,并根据随机数的结果将敌人变成熊或狼。但我无法绕过如何“把它”(敌人)变成狼或熊的方式。
任何帮助都会非常感激。谢谢!
答案 0 :(得分:2)
要在运行时随机决定类型,那么对于类型安全,您几乎必须使用动态分配,例如
Enemy* p_enemy = random_enemy();
// Use p_enemy here, e.g. p_enemy->make_noises(), then:
delete p_enemy;
其中random_enemy
是一个类似
auto random_enemy()
-> Enemy*
{
return (my_random_number() > 0.5? new Wolf : new Bear);
}
然而,正如您所发现的那样,在很多/大多数情况下,手动delete
很难正确。因此,通过使用std::unique_ptr
和std::shared_ptr
等智能指针,自动化会很常见。然后使用代码可能如下所示:
unique_ptr<Enemy> p_enemy = random_enemy();
// Use p_enemy here, e.g. p_enemy->make_noises(), then it auto-deletes.
和
这样的功能auto random_enemy()
-> unique_ptr<Enemy>
{
return unique_ptr<Enemy>(
my_random_number() > 0.5? new Wolf : new Bear
);
}
答案 1 :(得分:1)
你现在有2个问题:
首先,多态(查找)基于引用或指针,而不是值。 因此,当你创建你的Ennemy(可能是熊或狼&#34;随机&#34;)时,你不能保存一个值类型的变量,因为类型不会总是相同的。< / p>
Ennemy my_ennemy = (Bear or Wolf); // This is impossible.
基本上熊和狼不是同一类型,甚至不是相同的大小,所以它们不适合分配的Ennemy大小的内存。
你需要这些内容:
Ennemy *my_ennemy = new Bear(); // OR
Bear someExistingBear;
Ennemy *my_ennemy = &someExistingBear; // Or even
std::unique_ptr<Ennemy> my_ennemy(new Bear());
相反,您必须决定是否在Ennemy构造函数之外构建Bear或Wolf。
您可以使用这样的免费功能:
Ennemy *make_ennemy() {
// Some random way to choose. Probably with a static seed.
if (isbear)
return new Bear();
else
return new Wolf();
}