【问题标题】:Linked list Move constructor链表移动构造函数
【发布时间】:2017-10-23 04:56:22
【问题描述】:

我正在尝试为双链表编写移动构造函数,但它不起作用。有人可以帮我找出我做错了什么吗?

这是我的课:

class SortedList {
    struct Node {
        T data_;
        Node* next_;
        Node* prev_;
        Node(const T& data = T{}, Node* nx = nullptr, Node* pr = nullptr) {
            data_ = data;
            next_ = nx;
            prev_ = pr;
        }
    };

    Node* front_;
    Node* back_;
    int sizelist;
}

这是我的移动构造函数:

SortedList<T>::SortedList(SortedList&& rhs) {
    if (&rhs != this) {
        sizelist = rhs.sizelist;
        front_ = rhs.front_;
        back_ = rhs.back_;  

        Node* head = rhs.front_;    
        Node* headNext =rhs.front_->next_;      
        for (int i = 0; i < rhs.sizelist-1; i++) {
            head = nullptr;
            head = headNext;            
            headNext = headNext->next_;         
        }
        rhs.sizelist = 0;
    }
}

【问题讨论】:

  • 我建议你在一张纸上画一个链表的实例,然后画出移动赋值应该做什么。
  • 用户提供的构造函数必须在类定义中声明; T 没有在 SortedList 中定义。请贴出真实代码
  • “它不工作”不是一个有用的问题描述。请更具体。

标签: c++ linked-list doubly-linked-list move-constructor


【解决方案1】:

您应该从旧对象中获取数据的所有权,并使旧对象成为一个空列表。
在移动构造函数中测试“自复制”是没有意义的。

SortedList<T>::SortedList(SortedList&& rhs)
{
    sizelist = rhs.sizelist;
    rhs.sizeList = 0;
    front_ = rhs.front_;
    rhs.front_ = nullptr;
    back_ = rhs.back_;
    rhs.back_ = nullptr;
}

【讨论】:

  • 是否有必要使旧对象无效?我们不是假设用户永远不会使用/到达移动的对象吗?
  • @Fureeish 您绝对不想使原始对象无效。它必须保持有效状态,因为它至少会在以后被销毁,甚至可以使用。容器最简单的有效状态通常是空状态。
猜你喜欢
  • 2021-05-31
  • 2020-10-13
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 2014-11-08
相关资源
最近更新 更多