Я немного запутался в реализации двусвязного списка, в котором данные в списке являются указателями.
Частная часть моего класса связанного списка выглядит так:
private:
struct node {
node* next;
node* prev;
T* o;
};
node* first; // The pointer to the first node (NULL if none)
node* last; // The pointer to the last node (NULL if none)
unsigned int size_;
Как видите, список полон указателей на объекты, а не просто старых объектов, что немного сбивает меня с толку.
Ниже приводится описание в спецификации:
Обратите внимание, что хотя этот список шаблонен для содержащегося в нем типа T, он вставляет и удаляет только указатели на T, а не экземпляры T. Это гарантирует, что реализация Dlist знает, что ей принадлежат вставленные объекты, и отвечает за их копирование. если список копируется, и он должен уничтожить их, если список будет уничтожен.
Вот моя текущая реализация insertFront (T * o):
void Dlist::insertFront(T* o) {
node* insert = new node();
insert->o = new T(*o);
insert->next = first;
insert->prev = last;
first = insert;
}
Хотя это кажется неправильным. Что, если у T нет конструктора копирования? И как это обеспечивает единоличное владение объектом в списке?
Могу я просто сделать:
insert->o = o;
Похоже, это небезопасно, потому что если бы у вас были:
Object* item = new Object();
dlist.insertFront(item);
delete item;
Тогда элемент также будет уничтожен для списка. Это верно? Мое понимание где-нибудь нет?
Спасибо за прочтение.
Примечание. Хотя это похоже на домашнее задание, это не так. На самом деле я java-разработчик, просто оттачивающий свои навыки работы с указателем, выполняя старый школьный проект.