Реализация функций обмена / копирования: есть ли лучший способ? - PullRequest
1 голос
/ 02 апреля 2019

Вот как я реализовал функции подкачки и копирования для своей очереди.

Есть ли лучший способ?

template <class T>
void Queue<T>::copy(Queue<T> const & other)
{
    if(this == &other) 
        return;

    if(m_size != 0)
        this->clear();

    this->m_cap = other.m_cap;
    this->enqueue(other);
}

template <class T>
void Queue<T>::swap(Queue<T> const & other)
{
    if(this == &other)
        return;

    std::swap(this->m_front, other.m_front);
    std::swap(this->m_back, other.m_back);
    std::swap(this->m_size, other.m_size);
    std::swap(this->m_cap, other.m_cap);
}

Спасибо:)

1 Ответ

2 голосов
/ 03 апреля 2019

Вместо copy метода вы должны вместо этого реализовать конструктор копирования. Было бы странно, чтобы конструктор копирования передавал свой экземпляр. Если вы настаиваете на проверке, вы можете использовать утверждение.

template <class T>
Queue<T>::Queue(Queue<T> const & other)
    : m_cap(other.m_cap), m_size(0), m_front(), m_back()
{
    assert(&other != this);
    enqueue(other);
}

Ваш copy метод на самом деле является заданием. Более естественно реализовать оператор присваивания. Этого можно достичь, следуя идиоме подкачки копии.

template <class T>
Queue<T> & Queue<T>::operator = (Queue<T> other)
{
    swap(*this, other);
    return *this;
}

Существует также идиоматический способ реализации swap (научил меня Мунинг Дак давным-давно):

template <class T>
class Queue {
//...
    friend void swap(Queue &a, Queue &b) {
        using std::swap;
        swap(a.m_front, b.m_front);
        swap(a.m_back, b.m_back);
        swap(a.m_size, b.m_size);
        swap(a.m_cap, b.m_cap);
    }
};

Таким образом, вы можете использовать зависимый от аргумента поиск (ADL), чтобы выбрать специфичную для типа реализацию swap, если она доступна. И теперь Queue сама имеет такую ​​реализацию, которая используется оператором присваивания. Но это также может быть использовано в случае, если Queue помещен внутри объекта, который хочет реализовать swap для себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...