You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用Attendee实例setWaitTime()后数据未修改的问题求助

问题分析与解决

问题原因

  1. 副本修改无效:你当前通过Attendee attendee = curr->getData();获取的是Node中Attendee对象的副本,修改这个副本不会影响Node内部存储的原对象,所以调用setWaitTime()后数据没变化。
  2. 引用绑定报错:尝试用Attendee& attendee声明引用时,getData()返回的是临时对象(T类型的副本),C++不允许非const引用绑定临时对象,因此触发"initial value of reference to non-const must be an lvalue"错误。

解决方案

方案一:修改Node类,提供可修改的引用接口

通过给Node类新增一个返回非const引用的getData()重载,直接获取原对象的引用进行修改:

  1. 更新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;
};
  1. 实现新增的非constgetData()方法:
template<typename T>
T& Node<T>::getData() {
    return data;
}
  1. 给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;
};
  1. 修改循环代码,直接通过引用修改原对象:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 11:22:04