NULL-Zeiger
-
Ich hab mal wieder ein Problem:
template <class T> class Queue { public: Queue(); ~Queue(); void add(T&); int remove(); int front(T&); int length(); int empty() const{return endeWarteSchlange == 0;} //liefert 1 zurück wenn die Schlange leer ist sonst 0 private: Event* endeWarteSchlange; };
das ist meine header Datei so im Konstruktor initialisiere ich jetzt "endeWarteSchlange" mit 0
template <class T> Queue<T>::Queue() { endeWarteSchlange = 0; }
soweit so gut.
Der nächste Aufruf ist dann length():template<class T> int Queue<T>::length() { if (endeWarteSchlange == 0) return 0; else { T* search = endeWarteSchlange->next; int zaehler = 1; while(search != endeWarteSchlange) { search = search->next; zaehler++; } return zaehler; }
So hier ignoriert er jetzt aber alles was da steht er springt direkt zu return zaehler und gibt ein sch... zurück aber dass er bei der if Anweisung eigentlich return 0 zurückgeben sollte interesiert den gar nicht.
Im Debugger heißts dann:Can not access Memory at address 0x0.
Aber das ging bei mir doch sonst auch immer wenn ich einen Nullzeiger hatte!!!
Kann mir jemand sagen wo das Problem liegt?????
-
Seh ich das richtig, du machst folgendes Testprogramm:
int main() { Queue<Foo> q; cout << q.empty() << endl; cout << q.length() << endl; }
oder etwas äquivalentes? Wenns etwas komplizierter ist ... mir fällt nämlich z.B. auf, dass du keinen Kopierkonstruktor und keinen Kopierzuweisungsoperator hast.
Wenn das ein Template ist, wieso ist dann der Ende-Zeiger vom Typ Event* und nicht T*?
-
ups du hast recht das Event* sollte wirklich T* heißen aber das dürfte ja nicht stöhren.
und den Kopierkonstruktor... brauch ich momentan auch noch nicht.
Ja die main stimmt sinngemäß nach dem Konstruktor ist der nächste Aufruf aber length() und da stimmts halt nicht mehr.using namespace std; int main() { // Bedien-Schalter: const int nS = 2; // Anzahl Bank-Schalter Queue<Event> bankSchalter[2]; // Warteschlangen für Bank-Schalter // EreignisListe EventList eList; // kunden.dat ifstream fin("kunden.dat"); Event e; // Hole aus Datei erstes Ankunftsereignis // und füge es in Ereignisliste ein: e.type = 'i'; fin >> e.time; fin >> e.d; if (fin.eof()) return 0; eList.insert(e); while (eList.next(e)) { if (e.type == 'i') { ////// // e ist Ankunftsereignis: ////// // füge e in kürzeste Warteschlange ein: int min; [b]if (bankSchalter[0].length()<bankSchalter[1].length()) min = 0;[/b] else min = 1;
hier noch ein ausschnitt aus meiner main und beim markierten aufruf von length() passierts!!!!!