C ++ - Функция перегрузки оператора связанного списка - PullRequest
2 голосов
/ 01 ноября 2010

В настоящее время я работаю над стеком, который реализует связанный список.У меня проблемы с перегрузкой оператора "=".Я очень не знаю, что делать.Если бы кто-нибудь мог указать мне правильное направление, которое было бы удивительным.

//operator overload
template <class S>
const Stack<S>::operator=( const Stack& s )
{

    if (s.isEmpty())
        theFront = theTop = 0
    else
    {
        NodePointer temp = q->theFront;

        while(temp != 0)
        {
            push(temp->data);
            temp = temp->next;
        }
    }

    return *this;
}

Я также получаю эту ошибку: Stack, std :: allocator>> :: Node :: Node (std :: basic_string,ссылка на std :: allocator>) 'из C: \ USERS \ JOHNNY \ DESKTOP \ STACK \ INFIX_TO_RPN.OBJ

Может ли это быть исправлено моей функцией перегрузки оператора?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2010

Вам необходимо очистить текущий стек, прежде чем помещать в него данные. Вы должны добавить функцию removeAll и вызывать ее в верхней части назначения (после проверки на самостоятельное назначение, что тоже хорошая идея). В противном случае это выглядит правильно. Итак, конечный результат будет:

//operator overload 
template <class S> 
const Stack<S>::operator=( const Stack& s ) 
{ 
    // Check for self assignment
    if (&s==this)
        return *this;

    // Clear the current stack
    removeAll();

    // Copy all data from stack s
    if (!s.isEmpty())
    { 
        NodePointer temp = q->theFront; 

        while(temp != 0) 
        { 
            push(temp->data); 
            temp = temp->next; 
        } 
    } 

    return *this; 
} 

Вот пример функции removeAll:

template <class S> 
void Stack<S>::removeAll()    
{ 
    while (s.theFront)
    {
        NodePointer p = s.theFront;

        s.theFront = s.theFront->next;
        delete p;
    }

    s.theTop = s.theFront;
}
1 голос
/ 01 ноября 2010

Вместо того, чтобы вручную реализовывать оператор присваивания для вашего класса, используйте идиома копирования и обмена .

После того, как вы реализовали функцию swap() для вашего класса (статья, на которую я ссылался выше, дает отличное описание того, как это сделать), перегрузка operator= становится короткой и простой:

Stack& operator=(Stack rhs)
{
    swap(rhs);
    return *this;
}
...