目前,我不知道如何为我的武器类实现一个函数来重新加载。
我的程序应该做的(为了学习的目的)是有一个抽象武器类,其中有两个来源于它的类,剑和十字。剑类的工作方式应该是它的,因此需要玩。然而,十字弓类需要检测它是否加载,如果它没有加载,那么它将加载并发射它。
举个例子,这是我的老师给全班的演示输出:(这就是它应该看起来的样子)
弩造成15点伤害。
剑造成10点伤害。
十字弓没上膛!
弩造成15点伤害。
乐观地说,我希望它看起来类似。
请不要直接回答。这是作业,我真的很想学这个。我在找正确方向的点。
Weapon.h
#include <iostream>
using namespace std;
class Weapon
{
public:
Weapon(int damage = 0);
virtual void Attack() const = 0;
protected:
int m_Damage;
};
Weapon::Weapon(int damage) : m_Damage(damage)
{}
class Sword : public Weapon
{
public:
Sword(int damage = 10);
virtual void Attack() const;
};
Sword::Sword(int damage): Weapon(damage)
{}
void Sword::Attack() const
{
cout << "The sword hits for " << m_Damage << " points of damage" << endl;
}
class Crossbow : public Weapon
{
public:
Crossbow(int damage = 20);
virtual void Attack() const;
void Reload() const;
};
Crossbow::Crossbow(int damage) : Weapon(damage)
{}
void Crossbow::Attack() const
{
cout << "The crossbow hits for " << m_Damage << " points of damage" << endl;
}
void Crossbow::Reload() const
{
cout << "Crossbow not loaded! Please reload" << endl;
}发布于 2013-09-06 16:23:39
不要试图在基类中添加字段“弹药”。剑没有“弹药”的概念。添加到你的十字弓类。它可以是作为标志的bool类型。
您可以假设它在创建十字弓时没有加载,所以在构造函数初始列表中,只需添加loaded(false)
然后,你应该改变你的“攻击”,检查是否先加载。如果未加载,请重新加载第一种重新加载功能:
void Crossbow::reload() {
if ( !loaded ) {
cout << "Crossbow loading ..." << endl;
loaded = true;
}
cout << "Crossbow reloaded" << endl;
}
void Crossbow::attack() {
if ( !loaded ) {
cout << "Crossbow not loaded! Please reload" << endl;
reload();
}
cout << "The crossbow hits for " << m_Damage << " points of damage" << endl;
loaded = false;
}为此,您的攻击和重新加载不能是const,因为函数中有一个更改的值。
现在,您可以调用reload()来重新加载,也可以调用attack(),而不管它是否已加载。
发布于 2013-09-06 16:06:32
不确定它是否适合您,但是尝试在Weapon中添加一个名为ammo的字段。然后构造者将其设置为所需的数量,并且十字弓的Attack必须检查箭袋中是否还剩弹药。如果没有,则将ammo的值设置为原始值。这真的很简单。对于Sword,简单地说,不要检查弹药!:)
另外,请注意,在您更好地理解这些概念之前,这只是一个错误的实践,只是一个临时的修复。正确的方法是创建一个继承自Weapon的新类,这个类将由拥有弹药的武器继承。
希望我有所帮助,并愉快地学习C++!:)
https://stackoverflow.com/questions/18661909
复制相似问题