Я начинаю изучать C++ и, как упражнение, решает реализовать простой класс LinkedList
(Ниже приведена часть кода). У меня возник вопрос о том, как должен быть реализован конструктор копирования, и наилучшим образом получить доступ к данным на исходном LinkedList
.Подробности реализации конструктора ссылок LinkedList
template <typename T>
class LinkedList {
struct Node {
T data;
Node *next;
Node(T t, Node *n) : data(t), next(n) {};
};
public:
LinkedList();
LinkedList(const LinkedList&);
~LinkedList();
//member functions
int size() const; //done
bool empty() const; //done
void append(const T&); //done
void prepend(const T&); //done
void insert(const T&, int i);
bool contains(const T&) const; //done
bool removeOne(const T&); //done
int removeAll(const T&); //done
void clear(); //done
T& last(); //done
const T& last() const; //done
T& first(); //done
const T& first() const; //done
void removeFirst(); //done
T takeFirst(); //done
void removeLast();
T takeLast();
//delete when finished
void print();
//end delete
//operators
bool operator ==(const LinkedList<T> &other) const; //done
bool operator !=(const LinkedList<T> &other) const; //done
LinkedList<T>& operator =(const LinkedList<T> &other); //done
private:
Node* m_head;
Node* m_tail;
int m_size;
};
template<typename T>
LinkedList<T>::LinkedList() : m_head(0), m_tail(0), m_size(0) {
}
...
В случае, если моя копия доступа конструктора данных на каждом узле исходного LinkedList
напрямую?
template<typename T>
LinkedList<T>::LinkedList(const LinkedList& l) {
m_head = 0;
m_tail = 0;
m_size = 0;
Node *n = l.m_head;
// construct list from given list
while(n) {
append(n->data);
n = n->next;
}
}
Должен ли я получить доступ к данным через соответствующий аксессор? (Я знаю, что у меня нет определенных аксессуаров).
Кроме того, я намерен создать пользовательский итератор, чтобы можно было выполнить итерацию по LinkedList
. Должен ли я использовать в конструкторе копирования доступ к данным на каждом узле?
Другой вопрос (полностью вне темы, я знаю), когда и/или почему мы должны объявить указатель на LinkedList
LinkedList<int> *l = new LinkedList<int>();
вместо
LinkedList<int> l;
спасибо! :) – bruno