class.method has not been declared
-
Hallo,
ich bin ziemlicher C++-Noob und komm bei folgendem Problem nicht weiter.
Ich hab diese Klasse:class turm { int *pturm; // Zeiger auf turm-Objekt int index; // turmindex, oberste Scheibe int hoehe; // turmgrösse public: bool push(const int val); // Schreibe auf Turm ablegen int poppen(); // Scheibe vom turm holen void druck(void); // Methode zur Ausgabe des Turms turm(int s=4); // Konstruktor, Standard-Turmgrösse 4 ~turm(); // Destruktor (Speicher freigeben) };Die Methode pop habe ich wie folgt implementiert:
int turm::pop() { int retval = 0; // Fehlerrückgabe, falls Turm leer if (index>0) // prüft ob Turm voll ist { index--; // Index verringern retval = pturm[index]; // Scheibengröße zurückgeben } return retval; // Ergebnis zurück geben }Ich möchte diese Methode jetzt aufrufen:
void schiebe_scheibe(turm *start, turm *ziel) { int i; i=start.pop(); }Der Compiler gibt mir dabei folgenden Fehler:
main.cpp `pop' has not been declaredKann mir jemand nen Hinweis geben bitte?

-
Du hast deine Methode poppen genannt. Warst wohl gerade mit anderen Gedanken beschäftigt.

-
314159265358979 schrieb:
Du hast deine Methode poppen genannt. Warst wohl gerade mit anderen Gedanken beschäftigt.

Ich frag mich sowieso, was ihr hier eigentlich mit dieser komischen C++ Sprache macht, ständig geht um so Sachen wie string, remove, insert, pop_back, pop_front und was mit resize gemeint ist...

-
6experte schrieb:
314159265358979 schrieb:
Du hast deine Methode poppen genannt. Warst wohl gerade mit anderen Gedanken beschäftigt.

Ich frag mich sowieso, was ihr hier eigentlich mit dieser komischen C++ Sprache macht, ständig geht um so Sachen wie string, remove, insert, pop_back, pop_front und was mit resize gemeint ist...

Edit: sry! Hab ich nich' verstanden.
@Mephi:
Du hast in deiner Klassendefinition eine Methode poppen deklariert, allerdings eine scheinbar existierende Methode pop außerhalb der Klasse definiert. 'S passt n'türlich nicht zusammen. 'void' ist bei Funktionen ohne Übergabeparameter zwischen den Klammern übrigens unnötig.
-
@OP: Ist das jetzt ein Scherz (Deklaration von poppen <-> Definition von pop) oder gibt es wirklich noch ein Problem?
Willst Du absichtlich einen "Stapel" selbst stricken oder hast Du nur std::stack übersehen?
-
6experte schrieb:
und was mit resize gemeint ist...

Das nutzen wir ja auch seltener, manuelle Manipulationen sind oft die falsche Lösung.
-
Hacker schrieb:
6experte schrieb:
314159265358979 schrieb:
Du hast deine Methode poppen genannt. Warst wohl gerade mit anderen Gedanken beschäftigt.

Ich frag mich sowieso, was ihr hier eigentlich mit dieser komischen C++ Sprache macht, ständig geht um so Sachen wie string, remove, insert, pop_back, pop_front und was mit resize gemeint ist...

Wenn du kein Englisch kannst, dann geh lieber weg, man. Das wird noch peinlich.
Wenn du nicht mal ein minimales Gespür für Sarkasmus hast, dann geh lieber weg, man. Das wird noch peinlich.
-
Selbst nachdem das mit dem poppen und pop geklärt ist, muss es so sein:
void schiebe_scheibe(turm *start, turm *ziel) { int i; i=start->pop(); }
-
Ethon schrieb:
Hacker schrieb:
6experte schrieb:
314159265358979 schrieb:
Du hast deine Methode poppen genannt. Warst wohl gerade mit anderen Gedanken beschäftigt.

Ich frag mich sowieso, was ihr hier eigentlich mit dieser komischen C++ Sprache macht, ständig geht um so Sachen wie string, remove, insert, pop_back, pop_front und was mit resize gemeint ist...

Wenn du kein Englisch kannst, dann geh lieber weg, man. Das wird noch peinlich.
Wenn du nicht mal ein minimales Gespür für Sarkasmus hast, dann geh lieber weg, man. Das wird noch peinlich.
Nein, ich hab erst jetzt gemerkt, dass der TE nicht 6experte ist...

-
Hallo,
ich freu mich, dass es hier so viele Antworten gibt. Das mit dem poppen() ... naja meine Freundin meinte ich sollte die Funktion einfach mal umbenennen und guckn ob sich die Fehlermeldung ändert ... fand ich naheliegend.

Die Lösung war wirklich start->pop().
DAnke für eure Hilfe, es ist so kacke wenn man keine Ahnung von ner Sprache hat, aber ich lern das schon noch.

-
Leider funktioniert der Mist immer noch nicht ...
bool turm::push(int val) { bool retval = false; // Fehlerrückgabe, falls Turm voll cout << "Hoehe: " << hoehe << "\nIndex: " << index << endl; if (index < hoehe) // prüft ob Turm voll ist { pturm[index] = val; // neue Scheibe auf Turm legen cout << "pturm[index]= "<<pturm[index]<<endl; index++; // Index erhöhen retval = true; // Aktion erfolgreich } return retval; // Ergebnis zurück geben }Wenn ich diese Funktion aufrufen möchte, bricht das Programm einfach ab. (Keiner fehlermeldung beim compilieren.) system("PAUSE"); wird ignoriert. Die Konsole geht einfach zu.

int main() { turm t1,t2,t3; // Typdeklaration der Türme int anzahl; cout << "** Turm von Hanoi **" << endl; cout << "Hoehe der Turms: "; cin >> anzahl; t1=turm(anzahl); // initialisieren von Turm1 t2=turm(anzahl); // initialisieren von Turm2 t3=turm(anzahl); // initialisieren von Turm3 t1.push(4); system("PAUSE"); return EXIT_SUCCESS; }Ich muss den Stack selber implementieren. Ich weiß, dass es das schon fertig gibt, aber das hilft mir leider nicht.
-
Ein paar kleinere praktische Tipps:
Verwende einfach den Debugger um zu sehen was passiert. Damit lernt man zwar keine Konzepte, aber man sieht meistens was funktioniert und was nicht.
Wenn Du am Ende noch eine weitere (sinnlose) Eingabe einbaust, wartet er, bevor er das Programm beendet.
Wenn Du Dein Programm aus einer offenen Konsole startest und nicht per Doppelklick bleibt das Fenster hinterher auch stehen und Du kannst in Ruhe schauen welche Ausgaben das Programm erzeugt hat.
Protokolausgaben (per trace oder als konsolenausgaben) sind auch ein gutes Mittel um Fehler zu finden. Schreibe eine kleine Methode, um den Zustand Deiner Klasse auszugeben und rufe diese an den kritischen Stellen auf, um zu schauen, ob alles ok ist. Damit kann man den Fehler dann einkreisen.