Verstaendnisprobleme mit dynamischen Objekten :(
-
Es gelingt mir nicht jedesmal, dass ich immer etwas verstehen kann.
Ich sitze seit Stunden mit dem Skriptum und versuche verzweifelt eine Testumgebung fuer den dynamischen Stack zu erstelllen.
Es sind 2 Klassen angegeben "Element" und "IntStack".
Nun hab ich keinen Schimmer wie ich eine Testumgebung int main() von dem mache...
Also ich versuche jetzt ein Element am Stack abzulegen und weiss nicht wo mein Denkfehler ist, ich hoffe ihr koennt mir helfen, danke im voraus.deklarationen:
class Element { public: int value; Element *next; }; class IntStack { Element* head; public: IntStack(); bool push(int); int top() const; void pop(); bool isEmpty() const; };
definitionen:
#include "dynstack.h" void IntStack::pop() //oberstes Element loeschen { if(head) { Element *help=head; head=head->next; delete help; } } bool IntStack::push(int a) //Element aufstapeln { Element *help; help=new Element; if(!help) return false; help->next=head; help->value=a; head=help; return true; } bool IntStack::isEmpty() const //leerer Stack { return head==0; } int IntStack::top() const //Ausgabe des obersten Elementes { if(head) return head->value; else return -1; }
Testumgebung:
#include<iostream.h> #include "dynstack.h" int main() { char wahl, x; do { cout << "Element auf den Stack ablegen...e" << endl; cout << "oberstes Stackelement loeschen...l" << endl; cout << "oberstes Stackelement ausgeben...t" << endl; cout << "Beenden......x" << endl; cin >> wahl; switch(wahl) { case 'e': Element l; int i; // zuletzt eingelesene Zahl cin >> i; // Zahl einlesen l.push(i); // auf den Stack ablegen break; } }while(wahl!='x'); }
-
Hi,
was klappt denn nicht? Gibts ne Fehlermeldung, oder stürzt das Programm einfach ab? Wäre hilfreicher, wenn du genau beschreiben würdest, was nicht so funktioniert wie du dir das vorstellst.
-
Als Fehlermeldung kommt:
no matching function for call to `Element::push (int &)'Das Problem ist dass ich nicht soviel vom Thema dynamischen objekte verstehe...
Das bedeutet es werden Objekte im heap erzeugt die namenlos sind.
Ich schaetze so wie ichs gemacht hab funktionierts nicht oder?
Weil Element l ist ein Objekt der statisch erzeugt wurde...
-
Beispiel für Anwendung (=Testszenario)
... int main(int argc, char* argv[]) { IntStack test; test.push(3); test.push(5); test.push(2); while (!test.isEmpty()) { cout << test.top() << endl; test.pop(); } return 0; }
Übrigens solltest du bei der Konstruktion des Stacks die Initialisierung
nicht vergessen.class IntStack { Element* head; public: IntStack() : head(0) {}; bool push(int); int top() const; void pop(); bool isEmpty() const; };
-
Jetzt bin ich noch mehr verwirrt als vorhin...
Sorry fuer die Frage aber was machen die Parameter in int main(int argc, char* argv[])?
Ich kenn nur das mit den leeren Klammern.
-
Dann kuck mal in dein Buch/Tutorial.
Das ist ne andere (erlaubte) Form von main. Sie wird verwendet um
Kommandozeilen-Parameter an ein Programn zu übergeben. Ist für dein
Problem aber wohl nicht weiter wichtig, kannst du also ignorieren.
-
ok Danke, aber ich habs immer noch nicht ganz...
Das Problem ist dass es mit der switch case Anweisung nicht bei mir geht.Als Fehlermeldung kommt "jump to case label" und "crosses initialization of `class IntStack test'".
edit:
Ups erledigt hab den Fehler gefunden, war ein ziemlich bloder Fehler
-
IntStack test; // <----- switch(wahl) { case 'e': //IntStack test; // <--- die Zeile rausschmeissen ...
-
Danke hab ich auch grad entdeckt
-
Hmm haette noch paar Fragen und zwar wieso die top(), isEmpty Methoden als const definiert werden.
Was hat das fuer einen Zweck? Gibt es Faelle indem die Objekte unabsichtlich veraendert werden?Dann moechte ich noch eine Case Anweisung einbauen wo die gespeicherten Elemente aufgelistet werden, aber das gelingt mir irgendwie nicht...
Die Moeglichkeit von Chew-Z funktioniert zwar, aber es werden leider auch die Elemente beim Auflisten zerstoert.
-
Die const Definitionen sidn wie ein Vertrag mit dem du dich verpflichtest
die Objektdatem nicht zu ändern. Dadurch wird dich der Compiler bei jedem
(unabsichtlichen) Versuch darauf hinweisen.
Wenn du alle Elemente des Stacks auflisten willst musst du sie "zerstören".
Das es anders nicht geht ist das Wesen eines Stacks. Du hast nur Zugriff auf
das oberste Element. Wenn du an die darunterliegenden dran willst musst du
die darüber "entnehmen".