ZooRyan 2022-02-08 15:50 采纳率: 100%
浏览 23
已结题

类的私有成员变量用引用,构造函数形参默认值,用make_unique创建对象,形参默认值失效

问题遇到的现象和发生背景

构造函数形参默认值,用make_unique创建对象,形参默认值失效。
而改为new就可以

问题相关代码,请勿粘贴截图
class VBase
{
 
public:
    VBase(){}
    virtual ~VBase(){}
public:
    virtual void Handle() = 0;
protected:
 
};
 
class Transfer : public VBase
{
 
public:
    Transfer(const int& currDate = 20220209):m_currDate(currDate)
    {
        std::cout << m_currDate << std::endl;//此处有值20220209
    }
    ~Transfer(){}
 
    virtual void Handle()
    {
        std::cout << m_currDate << std::endl;//值为0
    }
 
private:
    const int& m_currDate;  //是不是加了引用的问题
 
};
 
int main()
{
    std::unique_ptr<VBase> pTrans = std::make_unique<Transfer>();
    pTrans->Handle(); // 打印 0
    VBase* pNew = new Transfer(); // 输出20220209
    return 0;
}
运行结果及报错内容

构造函数中打印 20220209
Handle中打印 0

我的解答思路和尝试过的方法

private:
const int& m_currDate; //是不是加了引用的问题
此处的引用去掉就能达到预期效果,但是不知道是为什么。
而且为什么成员变量用引用,采用new的方式就能达到预期效果

我想要达到的结果

构造函数中打印 20220209
Handle中打印 20220209

  • 写回答

1条回答 默认 最新

  • _GX_ 2022-02-08 19:32
    关注

    如果你要绑定引用,你得确保你所绑定的对象一直存在。
    当用缺省参数调用Transfer构造函数时,编译器创建了一个临时变量值为20220209,参数currDate和成员变量m_currDate都绑定到这个临时变量,当构造函数返回时,这个临时变量被释放了,因此m_currDate引用也就失效了。
    解决方法有两种:

    1. 去掉m_currDate中的引用,这样构造函数会把缺省参数的值拷贝到m_currDate里
    2. 缺省参数不要用数字常量,而用一个全局常量或静态成员常量代替,这样可以确保绑定的对象一直存在。比如像下面这样
    class Transfer {
    public:
        static const int default_date;
        Transfer(const int &currentDate = default_date) : m_currentDate(currentDate) {
            // ...
        }
        // ...
    private:
        const int &m_currDate;
    };
    const int Transfer::default_date = 20220209;
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月23日
  • 已采纳回答 4月15日
  • 修改了问题 2月8日
  • 创建了问题 2月8日

悬赏问题

  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000