Problem bei deque
-
Also ich habe ne Dequeklasse bebastelt, aber es tritt ein fehler auf den ich mir nicht erkären kann:
#pragma once #include <algorithm> template<class T> class MyDeque { private: class DequeElement { public: T data; DequeElement *next; DequeElement *prev; DequeElement(const T& t):data(t),next(NULL),prev(NULL) {} }; class EmptyDequeException : public std::exception { virtual const char* what() throw() {return "Deque is empty";} }; DequeElement *first; DequeElement *last; unsigned int anz_elem; public: MyDeque(); MyDeque(const MyDeque& other); ~MyDeque(); void push(const T& v); void put(const T& v); T pop(); T get(); T get_first(); T get_last(); unsigned int getAnzahlElemente(); bool is_empty(); void clear(); void swap(MyDeque& other); MyDeque<T>& operator=(const MyDeque& other); };ist die klasse, der fehler tritt bei der push methode auf:
template<class T>void MyDeque<T>::push(const T& v) { DequeElement *temp = new DequeElement(v); if(!this->first) this->last = temp; temp->next = this->first; temp->prev = NULL; this->first->prev = temp; <-- hier tritt der Fehler auf this->first = temp; ++anz_elem; }Wenn ich next anstelle von prev schreibe, kommt kein fehler nur wenn ich prev schreibe kommt der fehler...
Unhandled exception at 0x0040105e in container.exe: 0xC0000005: Access violation writing location 0x00000008.
ist die fehlermeldung
Danke im Voraus
-
Beim pushen des ersten Elements ist this->first == NULL und wird nicht initialisiert. Du versuchst aber auf this->first->prev zuzugreifen, was natürlich fehlschlägt.
Vorschlag:template<class T> void MyDeque<T>::push(const T& v) { DequeElement *temp = new DequeElement(v); if(!this->first) this->first = this->last = temp; // first und last zeigen auf das selbe Element else { temp->next = this->first; //temp->prev = NULL; durch Ctor gewährleistet this->first->prev = temp; // first wurde bereits gesetzt this->first = temp; } ++anz_elem; }
-
iup das leuchtet mir ein^^
danke für die schnelle antwort