Делаю перегрузку конструктора копировщика и оператора присваивания для связного списка
По сути в копировщике определил всё как в операторе присваивания, при этом оператор работает, а копировщик нет, подскажите в чём дело?
Реализован следующий подход: при копировании копируются данные, а не указатели, чтобы при удалении объекта не получить указатели на мусор
Код:
// linklist
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
struct link{ // один элемент списка
int data; // некоторые данные
link* next; // указатель на следующую структуру
};
///////////////////////////////////////////////////////////
class linklist{ // список
private:
link* first;
public:
linklist(){ first = NULL; } // конструктор без параметров, первого элемента пока нет
explicit linklist(const linklist&); // overload copy-constructor
~linklist();
void additem(int d); // добавление элемента
void display(); // показ данных
linklist operator = (linklist&);
};
linklist::linklist(const linklist& lnk){ // copy-constructor
first=NULL;
link* current=lnk.first;
if(current!=NULL){
link* newlink=new link;
newlink->data=current->data;
newlink->next=first;
first=newlink;
current=current->next;
}
}
linklist linklist::operator = (linklist& lnk){
link* current=first; // clear current list
delete first;
while(current!=NULL){
first=current->next;
current=first->next;
delete first;
}
first=NULL;
if(lnk.first!=NULL){ // check for emptyness of lnk
// now equalize
current=lnk.first;
while(current!=NULL){
link* newlink = new link; // выделяем память
newlink->data = current->data; // запоминаем данные
newlink->next = first; // запоминаем значение first
first = newlink; // first теперь указывает на новый элемент
current=current->next;
}
}
// if lnk's empty then do nothing
}
linklist::~linklist(){
link* current=first;
delete first;
// cout<<"Deleting a member"<<endl;
while(current!=NULL){
first=current->next;
current=first->next;
delete first;
// cout<<"Deleting a member"<<endl;
}
first=NULL;
}
void linklist::additem(int d){ // добавление элемента
link* newlink = new link; // выделяем память
newlink->data = d; // запоминаем данные
newlink->next = first; // запоминаем значение first
first = newlink; // first теперь указывает на новый элемент
}
void linklist::display(){
link* current = first; // начинаем с первого элемента
while(current){ // пока есть данные
cout << current->data << endl; // печатаем данные
current = current->next; // двигаемся к следующему элементу
}
}
///////////////////////////////////////////////////////////
int main(){
linklist l1,l2;
l1.additem(1);
l1.additem(2);
l1.display();
l2=l1;
cout<<endl;
l2.display();
cout<<endl;
linklist l3(l1);
l3.display();
cout<<endl;
system("pause");
return 0;
}
Реализован следующий подход: при копировании копируются данные, а не указатели, чтобы при удалении объекта не получить указатели на мусор