Странный конструктор копирования для двусвязного списка

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

Привет,

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

Он предоставляет нам заголовочные файлы, для которых мы затем должны создать класс и должны идеально следовать заголовочному файлу. То, как он делает свой конструктор копирования, заключается в том, что он заставляет нас написать вспомогательную функцию, которую мы просто вызываем конструктором копирования.

Я могу сделать это легко в обычном случае, но на этот раз он дал нам очень странную подпись для вспомогательной функции:

// copys chain at oldHead to newHead.
static void copy(Elem *&newHead, const Elem *oldHead)

Это нужно для копирования цепочки структур под названием Elems:

struct Elem 
{
    Information info;
    Elem *next;
    Elem *back;
};

Я думаю, я больше всего не понимаю, что такое Elem *& бизнес, потому что, насколько я помню, & и * не компенсируют друг друга?

Спасибо, любая помощь очень ценится! Надеюсь, это поможет другим людям в моем положении в будущем :)


person Joshua    schedule 14.11.2011    source источник
comment
В C++ это ссылка на указатель.   -  person Brian Roach    schedule 14.11.2011
comment
Как вы уже знаете, в выражении & является оператором адреса. В объявлении & обозначает объявление ссылки. Эти несвязанные понятия, к сожалению, имеют один и тот же символ. Если вы можете понять этот момент, то все остальные комментарии о том, что Elem *&newHead является ссылкой на указатель на Elem, должны иметь смысл.   -  person Robᵩ    schedule 14.11.2011
comment
parashift.com/c++-faq-lite/references.html   -  person Robᵩ    schedule 14.11.2011
comment
Ваш учитель, вероятно, сделал много C.   -  person Etienne de Martel    schedule 14.11.2011


Ответы (1)


static Elem* copy(const Elem *oldHead)

Возможно, это потенциальная функция. Вы берете старую Голову и возвращаете новую клонированную Голову.

Он выбрал передачу указателя по ссылке.

Если бы это было просто

static void copy(Elem * newHead, const Elem *oldHead)
{
    newHead = new Elem();
}

что-то вроде выше. Любые изменения в newHead не видны за пределами функции.

Это то же самое ниже. x передается по значению. Любые изменения x забываются после возврата из функции Addten. Ваш x просто оказался указателем.

   void Addten( int x )
    {
       x = x + 10;
    }

    int x = 10;
    Addten( x );
person parapura rajkumar    schedule 14.11.2011
comment
Спасибо за объяснение. Это одна из тех вещей, которые настолько хорошо известны, что их невозможно легко найти в Интернете или в книге. - person Joshua; 14.11.2011
comment
если вам нравится ответ, пожалуйста, проголосуйте за него - person parapura rajkumar; 14.11.2011