2015-04-11 3 views
0

Я использую Visual Studio 2013, и я хочу создать свой собственный конструктор копий для односвязного кругового списка. Вот мой код для конструктора.C++ - конструктор копирования для односвязного кругового списка

CCircularList::CCircularList(CCircularList& srcList) // Copy Constructor 
{ 
    Node* sPtr = srcList.top; // source pointer, top points to first entry in the list 
    Node* dPtr = top = new Node(*sPtr); // dPtr is destination pointer, 
    sPtr = sPtr->next; 

    while (sPtr != srcList.top) 
    { 
     dPtr->next = new Node(*sPtr); 
     sPtr = sPtr->next; 
     dPtr = dPtr->next; 
    } 
    setPosition(srcList.getPosition()); 
    dPtr->next = top; 

} 

Это не работает должным образом. После инициализации списка с использованием конструктора копирования я получаю эту ошибку, когда пытаюсь ее отобразить.

Необработанное исключение в 0x011F3C99 в Circular List.exe: 0xC0000005: Место чтения нарушения доступа 0x00000000.

Вот экземпляр конструктора класса Node.

Node::Node(Node& newNode) // Copy constructor 
{ 
    nData = newNode.nData; // Visual studio points to this line when giving error 
    next = newNode.next; 
} 

Заранее спасибо.

+0

вы должны сделать проверку нулевого указателя – benlong

+1

Я думаю, что этот вопрос трудно получить; Мы не знаем весь код CCircularList, что делает функция setPosition/getPosition и конструктор копирования класса Node правильно (нечего делать, когда вы хотите сделать список мелких копий) ... –

+1

Я согласен с @benlong. Ваше «нарушение прав доступа» может происходить во второй строке этой функции, когда вы используете sPtr. Я не удивлюсь, если эта копия ctor будет запущена в ближайшее время. (Также: где ваши инициализаторы?) – benschumacher

ответ

0

Код не заполнен. Сначала вы должны убедиться, что CCircularList & srcList правильно построен. Кроме того, конструктор узла кажется немного неправильным представлением, так как вы копируете данные опорный узел и следующий адрес. Я думаю, что более правильными могут быть некоторые из них:

Node::Node(const Node& oldNode) 
: nData(oldNode.nData) 
, next(nullptr) 
{;} 

Сообщается, что ошибка в том, что какой-либо sPtr, который вы передаете, имеет значение null. Вы можете проверить с помощью assert do

CCircularList::CCircularList(CCircularList& srcList) // Copy Constructor 
{ 
    Node* sPtr = srcList.top; // source pointer, top points to first entry in the list 
    assert(sPtr); 
    Node* dPtr = top = new Node(*sPtr); // dPtr is destination pointer, 
    sPtr = sPtr->next; 

    while (sPtr != srcList.top) 
    { 
     assert(sPtr); 
     dPtr->next = new Node(*sPtr); 
     sPtr = sPtr->next; 
     dPtr = dPtr->next; 
    } 
    setPosition(srcList.getPosition()); 
    dPtr->next = top; 
} 
Смежные вопросы