调用Attendee实例setWaitTime()后数据未修改的问题求助
问题分析与解决
问题原因
- 副本修改无效:你当前通过
Attendee attendee = curr->getData();获取的是Node中Attendee对象的副本,修改这个副本不会影响Node内部存储的原对象,所以调用setWaitTime()后数据没变化。 - 引用绑定报错:尝试用
Attendee& attendee声明引用时,getData()返回的是临时对象(T类型的副本),C++不允许非const引用绑定临时对象,因此触发"initial value of reference to non-const must be an lvalue"错误。
解决方案
方案一:修改Node类,提供可修改的引用接口
通过给Node类新增一个返回非const引用的getData()重载,直接获取原对象的引用进行修改:
- 更新Node类的声明:
template<typename T> class Node { public: // 原有构造函数不变... T getData() const; // 保留原const版本,返回副本 T& getData(); // 新增非const版本,返回引用 void setData(const T& data); // 其他方法不变... private: T data; Node<T>* next; };
- 实现新增的非const
getData()方法:
template<typename T> T& Node<T>::getData() { return data; }
- 给LinkedDeque的
getNodeAt方法新增非const重载(原方法是const成员函数,只能返回const指针):
template<typename T> class LinkedDeque { public: // 原有构造函数、析构函数不变... Node<T>* getNodeAt(const int& pos); // 非const版本 const Node<T>* getNodeAt(const int& pos) const; // 原const版本 // 其他方法不变... private: Node<T>* front; Node<T>* back; int count; };
- 修改循环代码,直接通过引用修改原对象:
for (int i = 0; i < reg.size(); i++) { Node<Attendee>* curr = reg.getNodeAt(i + 1); Attendee& attendee = curr->getData(); // 获取原对象的引用 attendee.setWaitTime(waitTime); if ((i + 1) == stop || (i + 1) % 5 == 0) { waitTime += 2; } }
方案二:不修改Node接口,修改后重新赋值
如果不想调整类结构,可以先获取对象副本,修改后通过setData()把修改后的对象存回Node:
for (int i = 0; i < reg.size(); i++) { Node<Attendee>* curr = reg.getNodeAt(i + 1); Attendee attendee = curr->getData(); attendee.setWaitTime(waitTime); curr->setData(attendee); // 将修改后的对象赋值回Node if ((i + 1) == stop || (i + 1) % 5 == 0) { waitTime += 2; } }
这个方法的缺点是会产生对象拷贝,性能略逊于方案一,但代码改动更小。
内容的提问来源于stack exchange,提问作者xvymnp
相关产品推荐
相关产品推荐

