作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这门课
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.
难道不能引用堆栈分配的内存吗?这个错误对我来说似乎很奇怪。
最佳答案
思考:
武器 weapon
对象的范围和“生存时间”是多少?Weapon &_weapon
对同一问题的答案是什么?第一个问题的答案是:weapon
只要构造函数在执行就存在。这是一个堆栈分配的变量,在构造函数完成其工作时不再存在。
第二个问题的答案是:只要包含该成员的对象存在,成员_weapon
就存在。
所以 weapon
的生存时间比 _weapon
的生存时间短。现在,当您将引用绑定(bind)到一个生存时间短于引用的对象时会发生什么?好吧,你会得到一个悬空的引用。对不属于你的内存的引用。除非使用一些特殊的诊断工具,如 valgind,否则很难发现和跟踪的严重错误。换句话说,您可以自由编写此代码,但只有当您的程序在构造函数中时,您才能访问该成员。这不是您想要的,不是吗?
关于c++ - 如何在类构造函数中绑定(bind)对堆栈分配类的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65656677/
我是一名优秀的程序员,十分优秀!