C++ 如何修复';读取访问冲突';处理不同类中的整数时出现异常
当试图“装备”武器和装甲对象时,它们会导致读访问冲突,输出伤害和输入都是空白。(括号中的任何内容都是可选输出)输出应为C++ 如何修复';读取访问冲突';处理不同类中的整数时出现异常,c++,C++,当试图“装备”武器和装甲对象时,它们会导致读访问冲突,输出伤害和输入都是空白。(括号中的任何内容都是可选输出)输出应为 Attacker : Gary using Wooden Sword does 1 (or 2) damage. Defender : Mary(4 HP) is equipped with Iron Armour and receives 0 (or 1) damage 但产出是有限的 Attacker : Gary using Weapon does damage.
Attacker : Gary using Wooden Sword does 1 (or 2) damage.
Defender : Mary(4 HP) is equipped with Iron Armour and receives 0 (or 1) damage
但产出是有限的
Attacker : Gary using Weapon does damage.
Defender : Mary( HP) is equipped with Armour and recieves
代码如下:
class Weapon {
public:
std::string weapon_Name = "Weapon";
int MIN_DAMAGE = 0;
int MAX_DAMAGE = 1;
};
class Wooden : public Weapon {
public:
std::string weapon_Name = "Wooden Sword" ;
int MIN_DAMAGE = 1;
int MAX_DAMAGE = 2;
};
class Iron : public Weapon {
public:
std::string weapon_Name = "Iron Sword";
int MIN_DAMAGE = 2;
int MAX_DAMAGE = 4;
};
class Armour {
public:
std::string armour_Name = "Armour";
int DAM_REDUCTION = 0;
int DAM_ABSORBTION = 0;
};
class Leather : public Armour {
public:
std::string armour_Name = "Leather Armour";
int DAM_REDUCTION = 0;
int DAM_ABSORBTION = 1;
};
class Chainmail : public Armour {
public:
std::string armour_Name = "Iron Armour";
int DAM_REDUCTION = 1;
int DAM_ABSORBTION = 2;
};
class Player {
private:
int hp;
std::string name;
Weapon *WEAPON_EQUIPPED;
Armour *ARMOUR_EQUIPPED;
public:
Player(std::string pName, int startHP) {
this->hp = startHP;
this->name = pName;
}
void equipWeapon( Weapon &Weapon){ this->WEAPON_EQUIPPED = &Weapon; }
void equipArmour( Armour &Armour){ this->ARMOUR_EQUIPPED = &Armour; }
void getWeaponName() { std::cout << WEAPON_EQUIPPED->weapon_Name; }
void getArmourName() { std::cout << ARMOUR_EQUIPPED->armour_Name; }
void getPlayerName() { std::cout << name; }
int getPlayerHP() { return hp; }
int getOutDamage() {
srand((int)time(0));
int outDamage = ((rand() % this->WEAPON_EQUIPPED->MAX_DAMAGE) + this->WEAPON_EQUIPPED->MIN_DAMAGE);
return outDamage;
}
int getInDamage() {
int inDamage = getOutDamage();
srand((int)time(0));
int totalDamage = inDamage - (((rand() % this->ARMOUR_EQUIPPED->DAM_ABSORBTION) + this->ARMOUR_EQUIPPED->DAM_REDUCTION) % this->ARMOUR_EQUIPPED->DAM_ABSORBTION);
return totalDamage;
}
int recieveDamage(int inDam) {
//this->hp - inDam;
int dam = this->hp - inDam;
return dam;
}
};
void Attack(Player& attacker, Player& defender) {
std::cout << "Attacker : ";
attacker.getPlayerName();
std::cout << " using ";
attacker.getWeaponName();
std::cout << " does ";
attacker.getOutDamage();
std::cout << " damage." << std::endl;
std::cout << "Defender : ";
defender.getPlayerName();
std::cout << "(";
defender.getPlayerHP();
std::cout << " HP) is equipped with ";
defender.getArmourName();
std::cout << " and recieves ";
defender.recieveDamage(defender.getInDamage());
std::cout << " damage(";
defender.getPlayerHP();
std::cout << ")" << std::endl;
}
int main() {
Player Gary("Gary", 4);
Player Mary("Mary", 4);
Wooden wood;
Chainmail chain;
Wooden* ptrWeap = &wood;
Chainmail* ptrChain = &chain;
Gary.equipWeapon(wood);
Mary.equipArmour(chain);
Attack(Gary, Mary);
return 0;
}
类武器{
公众:
std::字符串武器\u Name=“武器”;
int MIN_损坏=0;
int最大损坏=1;
};
类别:公共武器{
公众:
std::弦武器\u Name=“木剑”;
int MIN_损坏=1;
int最大损坏=2;
};
铁级:公共武器{
公众:
std::弦武器\u Name=“铁剑”;
int MIN_损坏=2;
int最大损坏=4;
};
类{
公众:
std::string armor_Name=“armor”;
int DAM_折减=0;
int DAM_吸收=0;
};
等级皮革:公共装甲{
公众:
std::string armor_Name=“皮革盔甲”;
int DAM_折减=0;
int DAM_吸收=1;
};
类别:公开邮件{
公众:
std::string armor_Name=“铁甲”;
int DAM_折减=1;
int DAM_吸收=2;
};
职业选手{
私人:
int-hp;
std::字符串名;
武器装备;
装甲*装备装甲;
公众:
播放器(std::string pName,int startHP){
这->hp=startHP;
此->名称=pName;
}
无效装备武器(武器和武器){此->装备武器=&武器;}
无效装备装甲(装甲和装甲){此->装备装甲=&Armour;}
void getWeaponName(){std::cout-weaponName;}
void getArmorName(){std::cout\u Name;}
void getPlayerName(){std::cout武器装备->最大伤害)+此->武器装备->最小伤害);
归还损坏;
}
int getInDamage(){
int inDamage=getOutDamage();
srand((int)时间(0));
int TOTALDAME=inDamage-((兰德()%此->装甲装备->大坝吸收)+此->装甲装备->大坝降低]%此->装甲装备->大坝吸收);
归还全部损失;
}
int收到损坏(int inDam){
//本->hp-inDam;
int dam=此->hp-inDam;
回水坝;
}
};
无效攻击(玩家和攻击者、玩家和防御者){
std::cout如果在抛出异常时查看调用堆栈,您将看到在main
中调用Attack(Gary,Mary);
,其中Gary
是攻击者,Mary
是防御者。然后调用defender.receivedamage(defender.getInDamage());
。然后getInDamage()
,再次调用对象Player
上的getOutDamage()
,该对象的实例是Mary
,您从未为其实际设置装备的武器。由于它未初始化,因此默认情况下为nullptr
(至少在调试时)这就是你的访问冲突读取
的来源。你应该只调用srand
一次,而且你不能像你看起来试图做的那样“覆盖”成员变量。使用构造函数。我只是用构造函数重新定义了它,thnx m8