Demigodd
@Demigodd

Как правильно создать Copy Constructor для Class Queue and Double List?

Queue::Queue(const Queue &obj) {
arr = obj.arr;
maxCount = obj.maxCount;
count = obj.count;
}

List::Double_List(): first(nullptr), current(nullptr), last(nullptr), count(0) { }
//Это эквивалентно

List::Double_List() {
first = nullptr;
current = nulltpr;
last = nullptr;
count = 0;
}


Как тут правильно создать Copy Constructor ?
Queue::Queue(const Queue &obj) {
arr = obj.arr;
maxCount = obj.maxCount;
count = obj.count;
std::copy(obj.arr, obj.arr + count, arr);
}

Можно вот так ? Только тут вроде как я не определил новый массив, то есть он всегда копирует значение в тот же массив или нет?

Но вот с double list проблемы, вообще не знаю как это реализовать
Copy Constructor для Single Line
List::List(const List& list): head(nullptr), tail(nullptr), count(0) 
{
    for(int i = 0; i < list.getCount(); ++i) 
    {
        Node* temp = new Node();
        temp->data = list[i];
        if(tail == nullptr) {
            head = temp;
        } else {
            tail->next = temp;
        }
        tail = temp;
        count++;
    }
}

Может поможет чем)
  • Вопрос задан
  • 412 просмотров
Решения вопроса 1
@sddvxd
Явные конструкторы копирования объявляются лишь в тех случаях, когда функционала неявного недостаточно, то-есть, например, Queue динамически выделяет память:

class Queue{ 
public:
    char * name;
    Queue(const * char ch){
        name = new char[strlen(ch)+1];
        memcpy(name, ch, strlen(ch)+1); 
    };
    ~Queue(){
        delete [] name;
    };
}


В таком случае нам понадобится определять явный конструктор копирования и перегружать оператор =.
Конструктор копирования по умолчанию, как и неявный оператор присваивания выполняет почленное копирование, а значит если мы все не сделаем как надо - будут повреждения и утечки памяти:

Queue * q1 = new Queue("test");
Queue q2(*q1);
delete q1;
std::cout<<q2.name; //Утечка памяти


Давайте же сделаем правильно:
Queue::Queue(const Queue & rq){
    delete [] name;
    name = new char[strlen(rq)+1];
    memcpy(name,rq,strlen(rq)+1);
}
Queue & Queue::operator=(const Queue & rq){
    if(this==&rq)return *this;
    delete [] name;
    name = new char[strlen(rq)+1];
    memcpy(name,rq,strlen(rq)+1);
    return *this;
}


Теперь получаем:

Queue * q1 = new Queue("test");
Queue q2(*q1);
delete q1;
std::cout<<q2.name; //test
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы