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