簡體   English   中英

復制和交換成語和迭代器

[英]Copy and Swap Idiom and Iterators

我一直在用嵌套迭代器編寫一個雙向鏈表。 當我在復制構造函數和operator =重載時,我遇到了Copy-swap-idiom。 但是從我的意識到,它使用了三個規則(如果你願意,可以使用一半)。 但是迭代器沒有析構函數,因為它們指向的“節點”不是它們的“屬性”,而是它的雙重列表。

這是一項大學任務,我被要求編寫一個復制構造函數和運算符,無論是什么情況,它與隱式定義是否相同。

我的問題是copy-swap-idiom總是需要有一個destuctor? 如果在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) {}
...
...

上面的部分顯示了迭代器的構造函數和私有數據。 下面的部分顯示了它的賦值和交換函數。

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類型,那么編譯器默認將“做正確的事情”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM