C++ 实施";“重新加载”;作用

C++ 实施";“重新加载”;作用,c++,C++,我目前不知道如何在我的武器类中实现一个函数来重新加载 我的程序应该做的(为了学习目的)是有一个抽象的武器类,它有两个派生类,剑和弩。剑类按其预期工作,因此需要玩弄。但是,弩类需要检测它是否加载,如果没有加载,它将加载并发射它 例如,这里是我的老师给全班同学的演示输出:(这是它应该看起来的样子) 弩造成15点伤害 剑造成10点伤害 弩未装弹 弩造成15点伤害 乐观地说,我希望它看起来相似 请不要直接回答。这是家庭作业,我真的很想学。我正在寻找方向正确的点。 武器 #包括 使用名称空间std; 阶级

我目前不知道如何在我的武器类中实现一个函数来重新加载

我的程序应该做的(为了学习目的)是有一个抽象的武器类,它有两个派生类,剑和弩。剑类按其预期工作,因此需要玩弄。但是,弩类需要检测它是否加载,如果没有加载,它将加载并发射它

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

弩造成15点伤害

剑造成10点伤害

弩未装弹

弩造成15点伤害

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

请不要直接回答。这是家庭作业,我真的很想学。我正在寻找方向正确的点。

武器
#包括
使用名称空间std;
阶级武器
{
公众:
武器(智力伤害=0);
虚空攻击()常数=0;
受保护的:
内部损坏;
};
武器:武器(智力伤害):魔法伤害(伤害)
{}
职业剑:公共武器
{
公众:
剑(智力伤害=10);
虚空攻击()常量;
};
剑:剑(智力伤害):武器(伤害)
{}
虚空之剑::攻击()常量
{

不能确定它是否适合你,但试着给武器添加一个类似于弹药的区域。然后建造师将其设置为所需的数量,弩的攻击必须检查箭袋中是否还有弹药。如果没有,将弹药的值设置为原始值。Th这真的很简单。对于
,简单地说,不要检查弹药!:)

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

“希望我帮助,并有乐趣学习C++!”:< /p> < P>不要尝试在你的基类中添加字段“弹药”。剑没有“弹药”的概念。在你的弩类中添加它。它可以是一个布尔类型作为标志。< /P> 您可以假设在创建十字弓时未加载,因此在构造函数初始列表中,您只需添加已加载(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;
}
void Crossbow::reload(){
如果(!已加载){

cout-ahem…这太有帮助了。我想说
Crossbow
有一些内部状态就足够了,因为OO的主要功能之一是封装,应该很明显在哪里存储这个状态…你也可以创建一个可重新加载的接口,并且只在需要它的类中实现它。@HanletEscaño:c++没有接口。但有子类或多重继承(brrr)@ KarolyHorvath,你可以在C++中有接口。@ KalyOrthva:我会删除我的注释,用一个小提示替换它:你需要在你的弩弓类中有一个BooL。我不同意。把一个字段添加到一些派生类中多余的基类不是最好的事情。对需要弹药的武器的抽象层次。同样,剑也可以来自于说它是一种有刃武器(因此可以切割)的东西要将它与俱乐部区分开来,这确实是一种糟糕的做法。但OP是一个学习者,增加另一层深度对他来说可能是一种过火的行为。这是我这样写答案的唯一原因。这是一种误导。问题不在于弹药(目前)@LeventeKurusa因为某人只是一个学习者而教他一个不好的练习是一个很糟糕的借口。如果你要这样做,你需要指出这是一个不好的练习以及它的后果。否则,学习者应该如何学习?尽管这与我说的“请不要直接回答”相反,这确实证实了我头脑中的想法。
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;
}