Quantcast
Channel: Форум программистов и сисадминов Киберфорум
Viewing all articles
Browse latest Browse all 516746

Перегрузка конструктора копировщика связного списка - С++ для начинающих

$
0
0
Делаю перегрузку конструктора копировщика и оператора присваивания для связного списка

Код:

// 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;
}

По сути в копировщике определил всё как в операторе присваивания, при этом оператор работает, а копировщик нет, подскажите в чём дело?

Реализован следующий подход: при копировании копируются данные, а не указатели, чтобы при удалении объекта не получить указатели на мусор

Viewing all articles
Browse latest Browse all 516746

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>