gpt4 book ai didi

c++ - 如何在类构造函数中绑定(bind)对堆栈分配类的引用?

转载 作者:行者123 更新时间:2023-12-04 08:17:13 24 4
gpt4 key购买 nike

我有这门课

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.

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

最佳答案

思考:

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

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

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

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

关于c++ - 如何在类构造函数中绑定(bind)对堆栈分配类的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65656677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com