实施"重新加载"功能

时间:2013-09-06 16:01:37

标签: c++

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

我的程序应该做什么(出于学习目的)有一个抽象的武器类,它有两个派生自它的类,Sword和Crossbow。 Sword类可以像它一样工作,因此需要玩弄它。但是,Crossbow类需要检测它是否已加载,如果没有加载,它将加载它并将其激活。

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

弩造成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;
}

2 个答案:

答案 0 :(得分:2)

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

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

希望我帮助过,学习C ++很有趣! :)

答案 1 :(得分:2)

不要尝试在Base类中添加字段“ammo”。剑没有“弹药”的概念。在Crossbow课程中添加它。它可以是bool类型的旗帜。

您可以假设在创建弩时未加载它,因此在构造函数初始列表中,您只需添加加载(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(),不管它是否被加载。