首页 > 解决方案 > 如何在类构造函数中绑定对堆栈分配类的引用?

问题描述

我有这门课

class HumanA
{
    public:

    HumanA(std::string name, Weapon weapon);
    ~HumanA(void);

    inline void     attack(void)
    {
        std::cout << _name << " attacks with his " << _weapon.getType();
    }


    private:

    std::string     _name;
    Weapon          &_weapon;
};

和这个构造函数

HumanA::HumanA(std::string name, Weapon weapon) : _name(ft::strcapitalize(name)), _weapon(weapon)
{
}

我在编译时收到此错误

HumanA.cpp:15:91: error: binding reference member '_weapon' to stack allocated
      parameter 'weapon' [-Werror,-Wdangling-field]
  ...name, Weapon weapon) : _name(ft::strcapitalize(name)), _weapon(weapon)
                                                                    ^~~~~~
./HumanA.hpp:35:12: note: reference member declared here
        Weapon                  &_weapon;
                                 ^
1 error generated.

不能引用堆栈分配的内存吗?这个错误对我来说似乎很奇怪。

标签: c++

解决方案


思考:

  1. 对象的范围和“生存时间”是Weapon weapon什么?
  2. 会员对同一问题的答案是什么 Weapon &_weapon

第一个问题的答案是这样的:weapon只要构造函数在执行就存在。这是一个堆栈分配的变量,在构造函数完成其工作时不再存在。

第二个问题的答案是:_weapon只要包含这个成员的对象存在,成员就存在。

所以 的 寿命比weapon_weapon。现在,当您将引用绑定到其生存时间比引用短的对象时会发生什么?好吧,你会得到一个悬空的参考。对您不拥有的内存的引用。除非使用了一些特殊的诊断工具,如 valgind,否则很难发现和跟踪的严重错误。换句话说,您可以自由地编写此代码,但您只能在程序位于构造函数中时访问该成员。这不是你的本意,不是吗?


推荐阅读