2013-04-20 3 views
0

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

linklist::linklist() 
    :firstNode(NULL), 
    lastNode(NULL), 
    nodeCount(0) {} 

linklist::~linklist()// destructor 
{ 
    node* current = firstNode; 
    while(current != 0) { 
     node* temp = current->getNextNode(); 
     delete current; 
     current = temp; 
    } 
    firstNode = 0; 
} 

linklist::linklist(linklist &L)// copy constructor 
{ 
    firstNode = NULL; 
    nodeCount = 0; 
    node* temp = L.firstNode; 
    for(int i = 0; i < L.getNodeCount(); i++) 
    { 
     push_back(temp); 
     temp = temp->getNextNode(); 
    } 
} 

linklist& linklist::operator=(const linklist& L)// overloading assignemnt operator 
{ 
    linklist* LL; 
    node* temp = L.firstNode; 
    while(temp != NULL) { 
     LL->getLast(); 
     temp = temp -> getNextNode(); 
    } 
    return *LL; 
} 
+0

ошибка компиляции? seg fault? неправильное поведение? пожалуйста, уточните, что не работает, и включите код, в котором произошла ошибка. – yngccc

+0

Да, это ошибка компиляции и ничего не отображает! – Mido

ответ

1

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

Разница заключается в том, что вы назначили clear, что это в списке (перед началом копирования) (другой).

И тогда он должен вернуть ссылку на себя. return *this. Так что назначения могут быть связаны цепями.

linklist& linklist::operator=(const linklist& L)// overloading assignemnt operator 
{ 
    // Check if self assignment 
    if (&L == this) 
     return *this; 

    // clear myself. 
    // copy other. 
    return *this; 
} 
+0

В начале вы должны добавить чек, чтобы убедиться, что вы не назначаете одни и те же RHS для LHS (то есть 'if (& L == this), а затем верните * this;'). Это может быть непреднамеренно в случае ссылок. –

+0

@EdHeal Спасибо исправлено. – stardust

+0

Спасибо, ребята, я над этим работаю и посмотрим, как это будет работать! – Mido

0

У вас, кажется, две проблемы. Во-первых, деструктор удаляет все структуры узлов. Любой новый связанный список, скопированный с использованием конструктора копирования, будет иметь неправильные данные после уничтожения оригинала. Во-вторых, вероятно, лучше, если вы скопировали структуру узла, используя его конструктор копирования. Трудно сказать, без точной информации, но ваш связанный список может выглядеть т е р что-то вроде:

firstNode = NULL; 
nodeCount = 0; 
node* temp = L.firstNode; 
for(int i = 0; i < L.getNodeCount(); i++) 
{ 
    push_back(new node(*temp)); 
    temp = temp->getNextNode(); 
} 

Таким образом, новый связанный список имеет свою собственную копию узлов.

+0

спасибо, я сделал это, но все же есть что-то не так, все еще пытаясь выяснить! – Mido