Thyke 2022-01-31 21:35 采纳率: 100%
浏览 24
已结题

多态调用中智能指针和new方法 访问相同类产生的结果不同

问题遇到的现象和发生背景
在练习装饰模式的时候编写了4个类

用相同的调用顺序,不同的调用方法
产生的结果不同

问题相关代码,请勿粘贴截图
#include<iostream>
#include<memory>
using namespace std;

//抽象英雄
class AbstractHero {
public:
    virtual void ShowStatus() = 0;
    int mHP;
    int mMP;
    int mATK;
    int mDF;
};

class HeroA :public AbstractHero {
public:
    HeroA() {
        mHP = 0;
        mMP = 0;
        mATK = 0;
        mDF = 0;
    }
    virtual void ShowStatus() {
        cout << "血量" << mHP << endl;
        cout << "魔法" << mMP << endl;
        cout << "攻击" << mATK << endl;
        cout << "防御" << mDF << endl;
    }
};

class AbstractEquipment :public AbstractHero {
public:
    AbstractEquipment(AbstractHero* hero){
        this->pHero = hero;
    }
    virtual void ShowStatus() = 0;
    AbstractHero* pHero;
};

//狂徒
class KuanagTuEquipment :public AbstractEquipment {
public:
    KuanagTuEquipment(AbstractHero* hero):AbstractEquipment(hero){}

    void AddKuangtu() {
        this->mHP = this->pHero->mHP + 1000;
        this->mMP = this->pHero->mMP;
        this->mATK = this->pHero->mATK;
        this->mDF = this->pHero->mDF;
    }
    virtual void ShowStatus() {
        AddKuangtu();
        cout << "血量" << mHP << endl;
        cout << "魔法" << mMP << endl;
        cout << "攻击" << mATK << endl;
        cout << "防御" << mDF << endl;
    }
    //增加额外功能
};
void test01() {
    AbstractHero* hero = new HeroA;
    hero->ShowStatus();

    hero = new KuanagTuEquipment(hero);
    hero->ShowStatus();

}

void test02() {
    shared_ptr<AbstractHero> hero= make_shared<HeroA>();
    hero->ShowStatus();

    hero.reset(new KuanagTuEquipment(hero.get()));
    hero.get()->ShowStatus();
}

int main() {
    test01();
    cout << endl;
    test02();
}

运行结果及报错内容

img


为啥用智能指针reset的hero没有赋值成功
而直接用new的可以呢?

我的解答思路和尝试过的方法
我想要达到的结果

就是想用KuanagTuEquipment 类更改HeroA对象的数值

  • 写回答

2条回答 默认 最新

  • _GX_ 2022-01-31 21:58
    关注

    test02()函数中, 调用hero.reset()后,hero原来所指的对象就被销毁了,所以new KuanagTuEquipment(hero.get())对象里所存的指针就变成了野指针。
    test01()不存在这个问题,是因为你创建的两个对象都没有被销毁。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月18日
  • 已采纳回答 2月10日
  • 修改了问题 1月31日
  • 创建了问题 1月31日

悬赏问题

  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图