Класс Stack и его конструктор копирования.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Не могу понять КАК работает конструктор копирования в классе Stack.

Код: Выделить всё

struct StackFrame
{
      char data;
      StackFrame *link;
};
typedef StackFrame* StackFramePtr;

class Stack
{
      public:
         Stack();

         Stack(const Stack& a_stack);
         ....

      private:
         StackFramePtr top;
};

//Определение конструктора копирования
Stack::Stack(const Stack& a_stack)
    {
        if(a_stack.top == NULL)
            top = NULL;
        else
        {
            StackFramePtr temp = a_stack.top;
            StackFramePtr end;

            end = new StackFrame;
            end->data = temp->data;
            top = end;
          
            temp = temp->link;

            while(temp != NULL)
            {
                end->link = new StackFrame;
                end = end->link;
                end->data = temp->data;
                temp = temp->link;
            }
            end->link = NULL;
        }
    }
Разрисовал пошагово в виде схемы каждую строку (updated: как оказалось ошибочно), но истина пока не проникла в мозг
А конкретно:
- если использовать вместо указателя end, указатель из класса top, то результатом копирования будет только 1 символ (ответ логичен: т.к. копию списка делаем вначале, а не в конце - top = end).
- отсюда вытекает следующее: если мы делаем копию вначале, а в конце имеем список end идентичный списку a_stack.top. В top эта информация не попадает, но результатом конструктора является точная копия списка a_stack.top. Как так получается? Где я не так понял суть?

updated
Все понял, осознал. Вложения можно удалить, а то стыд и срам :)
Вложения
list2.jpg
list1.jpg
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Почему в top эта информация не попадает? Изначально top и end смотрят на один и тот же адрес в памяти. В процессе копирования стека end уезжает в конец, копируя элементы исходного списка. Но top при этом никуда не уезжает и по прежнему указывает на начало.

В рисунках у тебя тоже ошибки. temp = temp->link; - это перемещение temp'а на следующий элемент a_stack.top'а. А ты что нарисовал? Дальше даже не смотрел.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Понял свою ошибку.

Вот указатели:

Код: Выделить всё

int a = 1, b = 2;
int *p;
int *q;
p = &a; //*p == 1, p == 0x111111
q = &b; //*q == 2, q == 0x222222

*p = *q; // *p == 2, p == 0x1111111
p = q; // *p ==2, p == 0x222222

(*p)++; // *p == 3, *q == 3
typedef int* IntPtr - упрощает объявление указателей, не более. А мне чего-то лишнего надумалось.... напрмиер, что top = end равносильно *top = *end.
Тогда да, top = end - top указывает на начало списка, а end в цикле спускается вниз и строит его копию с a_stack.top.
Ответить