ZooRyan 2022-02-08 15:50 采纳率: 80%
浏览 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 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀