4

我目前不知道如何为我的 Weapon 类实现一个函数来重新加载。

我的程序应该做的(出于学习目的)是有一个抽象的 Weapon 类,它有两个派生自它的类,Sword 和 Crossbow。Sword 类按预期工作,因此需要玩弄。但是,Crossbow 类需要检测它是否已加载,如果未加载,则将加载它并触发它。

例如,这是我的老师给班级的演示输出:(这就是它应该看起来的样子)

弩造成15点伤害。

剑造成10点伤害。

弩没装!

弩造成15点伤害。

乐观地说,我希望它看起来相似。

请,没有直接的答案。这是家庭作业,我真的很想学习这个。我正在寻找正确方向的点。

武器.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;
}
4

2 回答 2

2

不确定它是否适合您,但尝试添加一个Weapon名为ammo. 然后构造者将其设置为所需的数量,并且弩Attack应该检查箭袋中是否有任何弹药。如果不是,请将 的值设置ammo为原始值。这真的很简单。对于Sword,简单地说,不要检查弹药!:)

另请注意,在您更好地理解这些概念之前,这是一种不好的做法,并且只是临时修复。正确的方法是创建一个继承自的新类,Weapon该类将由具有弹药的武器继承。

希望我有所帮助,并在学习 C++ 时玩得开心!:)

于 2013-09-06T16:06:32.733 回答
2

不要尝试在 Base 类中添加字段“ammo”。剑没有“弹药”的概念。将它添加到您的 Crossbow 类中。它可以是布尔类型作为标志。

您可以假设它在创建 Crossbow 时没有加载,因此在构造函数初始列表中,您只需添加加载(假)

然后你应该通过检查是否先加载来改变你的“攻击”。如果没有加载,则重新加载第一种重新加载函数:

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-06T16:23:39.407 回答