gpt4 book ai didi

c++ - copy-and-swap 习语和迭代器

转载 作者:太空狗 更新时间:2023-10-29 21:33:10 26 4
gpt4 key购买 nike

我一直在写一个带有嵌套迭代器的双向链表。当我处理复制构造函数和 operator= 重载时,我遇到了 Copy-swap-idiom。但据我所知,它使用了三的规则(如果你愿意的话,还有一半)。但是迭代器没有析构函数,因为它们指向的“节点”不是它们的“属性”,而是双重列表。

这是一项大学作业,我被要求编写一个复制构造函数和运算符,无论是什么情况,无论是否与隐式定义相同。

我的问题是 copy-swap-idiom 是否总是需要有一个析构函数?如果在 Iterators 的情况下是这样,这会起作用还是我应该使用正常的“脏”分配?以下是我的迭代器类的相关部分:

template<class T>
class List<T>::ForwardIterator {
private:
Node<T> *current;

public:
ForwardIterator(Node<T> *curr = nullptr) : current(curr) {}
ForwardIterator(const ForwardIterator& right) : current(right.current) {}
...
...

以上部分展示了迭代器的构造函数和私有(private)数据。下面部分显示了它的赋值和交换功能。

friend void swap(ForwardIterator& first, ForwardIterator& second) {
using std::swap;
swap(first.current, second.current);
}

ForwardIterator& operator=(ForwardIterator right) {
swap(*this, right);
return *this;
}

这是我的实现,我想知道在这里使用是否明智? (我的迭代器没有析构函数,因此我的问题)。

最佳答案

您拥有的是正确的并且可以工作,但不是必需的。

由于您的迭代器不负责它持有指向它的指针的节点,所以有一个什么都不做的析构函数很好。因为你有一个什么都不做的析构函数,你不需要为任何复制/移动构造函数或复制/移动赋值运算符做任何特殊的事情。这意味着您不需要定义它们中的任何一个,您可以遵循零规则。

请记住,当您的类实际负责获取和释放资源时,您只需要实现 3 规则/5 规则。如果您所做的只是处理 POD/RAII 类型,那么编译器默认会“做正确的事”。

关于c++ - copy-and-swap 习语和迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52409892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com