Ich fange an, C++ zu lernen, und beschließe als Übung, eine einfache LinkedList
Klasse (unten finden Sie einen Teil des Codes). Ich habe eine Frage bezüglich der Art und Weise der Kopie Konstruktor implementiert werden sollte und der beste Weg, die Daten auf dem ursprünglichen LinkedList
zugegriffen werden sollte.
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) {
}
...
Soll mein Kopierkonstruktor auf die Daten jedes Knotens der ursprünglichen LinkedList
direkt?
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;
}
}
Oder sollte ich auf die Daten über den entsprechenden Accessor zugreifen? (Ich weiß, dass ich den/die Accessor(s) nicht definiert habe).
Außerdem beabsichtige ich, einen benutzerdefinierten Iterator zu erstellen, so dass es möglich sein kann, über die LinkedList
. Sollte ich in der Kopie Konstruktor verwenden, um die Daten auf jedem Knoten zugreifen?
Eine andere Frage (völlig off-topic, ich weiß), wann und/oder warum sollten wir einen Zeiger auf eine LinkedList
LinkedList<int> *l = new LinkedList<int>();
anstelle von
LinkedList<int> l;