2015-06-12 2 views
1

У меня ужасное время выяснить, как написать конструктор копирования. Как вы можете видеть ниже, у нас есть класс со структурой, вложенной внутри него, чтобы связанные узлы содержали данные. Я не могу использовать членское назначение для копирования DynIntStack, потому что указатели в структуре StackNode просто указывают на один и тот же объект.Установить переменную struct, вложенную внутри класса в конструктор копирования

К сожалению, я не могу понять, как написать конструктор таким образом, чтобы значение внутри нового StackNode было равно значению StackNode внутри DynIntStack. Я передаю конструктор.

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

class DynIntStack 
{ 
private: 
    // Structure for stack nodes 
    struct StackNode 
    { 
     int value;  // Value in the node 
     StackNode *next; // Pointer to the next node 
    }; 

    StackNode *top;  // Pointer to the stack top 

public: 
    // Constructor 
    DynIntStack() 
    { 
     top = NULL; 
    } 
    // copy constructor 
    DynIntStack(DynIntStack &obj) 
    { 
     DynIntStack::StackNode value = obj::StackNode.value; 
     DynIntStack::StackNode next = new StackNode; 
    } 
+0

Есть так много [вопрос в SO на связанном списке] (http://stackoverflow.com/search?q=%5Bc%2B%2B%5D+linked+list). Возможно, один или несколько из них будут полезны. –

ответ

0

Попробуйте следующее

DynIntStack(DynIntStack &obj) : top(nullptr) 
{ 
    StackNode **last = ⊤ 

    for (StackNode *current = obj.top; current; current = current->next) 
    { 
     *last = new StackNode { current->value, nullptr }; 
     last = &(*last)->next; 
    } 
} 

Если ваш компилятор не поддерживает эту форму нового оператора

*last = new StackNode { current->value, nullptr }; 

, когда вы можете заменить его заявления

*last = new StackNode; 
(*last)->value = current->value; 
(*last)->next = nullptr; // or NULL 
+0

Я думаю, что это должно работать, единственная проблема заключается в том, что компилятор не любит last = & last-> next; и говорит, что это должен быть тип указателя на класс. – Pstanton

+0

@Pstanton Я думаю, вы сделали опечатку. Проверьте это утверждение StackNode ** last = ⊤ –

+0

Хм, нет, у меня есть эта строка правильно. Не уверен, почему он не работает. – Pstanton

0

Вы делаете это неправильно. Вы должны fully implement свой linked list класс, а затем в копировании конструктор DynIntStack он стал бы:

DynIntStack(DynIntStack &obj) : top(obj.top) {} 

Что бы еще лучше просто использовать std::list и не беспокоиться об этом.

0

Проблема I см. здесь value и next в конструкторе копирования , Вы указали тип для каждого, поэтому компилятор выделяет локальные переменные для каждого, отдельных объектов из данных члена с теми же именами. Неправильные вещи устанавливаются, не используются и освобождаются при выходе из сферы действия.

Смежные вопросы