C++类const引用成员随新实例创建异常变化的解决方法问询
问题根因
你遇到的变量自行变更问题是悬垂引用导致的:
- 你的
PerspectiveCamera类中center和forward两个成员被声明为const引用类型 - 你在
a_cameras中创建PerspectiveCamera实例时,给这两个参数传入的是临时构造的Point、Vector对象,这类临时对象的生命周期仅持续到构造函数调用结束 - 构造完成后,类中的两个引用就变成了指向已回收栈内存的悬垂引用,后续创建第二个同类实例时,栈内存被复用,旧实例引用指向的内存值就被覆盖,看起来就像变量自行变更了。
解决方案
不需要修改a_cameras的实现,只要调整PerspectiveCamera类的成员定义,把两个引用类型成员改为值类型即可:
- 修改
perspective.h中的成员声明:
// 原来的声明 // const Point ¢er; // const Vector &forward; // 修改为: const Point center; const Vector forward;
- 原有构造函数的实现不需要做任何调整,初始化列表会自动将传入的临时对象拷贝到类自身的成员变量中。
修改后类实例会自行持有center和forward的副本,生命周期和类实例完全绑定,不再依赖外部临时对象,就可以彻底避免变量被意外篡改的问题。
内容的提问来源于stack exchange,提问作者Jane Cherrytree
相关产品推荐
相关产品推荐

