Bei Programmneustart Codes nicht erneut ausführen
-
Hallo erstmal,
ich habe ein Problem bei meinem Programm: Das Programm wird immer wieder von vorne aufgerufen (beabsichtigt). Jetzt will ich aber, dass ein bestimmter Teil des main Bereiches nur EINMAL ausgeführt wird. Alle meine Versuche mit Variablen und Funktionien sind fehlgeschlagen. Hier mein Programm:
#include <cstdlib> #include <iostream> #include <windows.h> #include "mensch.h" // void submis1 (void); using namespace std; int main() { Mensch player; Mensch gorn; player.erzeuge( "Ich" , 100 ); gorn.erzeuge( "Feind" , 100 ); cout<<"Bitte geben sie einen zu wirkenden Zauber an!\n"; string y; cin>>y; cout<<"\nBitte geben sie ein Ziel fuer den Zauber an.\n"; string c; cin>>c; if (c == "Feind") { player.zaubern( y , c ); gorn.dellife ( y ); } cout<<"\n\n\n"; Sleep(500); main(); }Die Klasse 'Mensch' und alle dazugehörigen Funktionen sind in der mensch.h . Ich will, dass die Deklarationen und Erzeugungen der Klassen nur beim ersten Start ausgeführt werden. Sprich: Die ersten 4 Codes sollen nur einmal ausgeführt werden.
Ich hoffe auf schnelle Hilfe.
mfG Alemarius Nexus
-
Hallo,
du musst nicht alles in die main packen. Die ersten vier Codezeilen könntest du theoretisch global deklarieren. (Also einfach auserhalb der main), wobei das trotzdem der falsche Lösungsansatz ist. Solche Dinge löst man mit Schleifen. Den abzuarbeitenden Code packst du einfach in eine while-Schleife. Beispiel:
// #include <cstdlib> -> unnötig... #include <iostream> #include <windows.h> #include "mensch.h" // void submis1 (void); using namespace std; int main() { Mensch player; Mensch gorn; while (true) // Erzeugt eine Endlosschleife { player.erzeuge( "Ich" , 100 ); gorn.erzeuge( "Feind" , 100 ); cout<<"Bitte geben sie einen zu wirkenden Zauber an!\n"; string y; cin>>y; cout<<"\nBitte geben sie ein Ziel fuer den Zauber an.\n"; string c; cin>>c; if (c == "Feind") { player.zaubern( y , c ); gorn.dellife ( y ); cout<<"\n\n\n"; Sleep(500); } }Weitere Infos zu Schleifen findest du z.B. in diesem Tutorial:
http://www.volkard.de/vcppkold/inhalt.html
-
Erstmal danke für die schnelle Hilfe.
So wie dus gemacht hat klappts (hast nen kleinen Fehler, ans Ende muss noch eine }
). Aber mit dem außerhalb von main() definieren hab ichs auch versucht, dann wird aber direkt beim player.erzeuge (auch außerhalb von main) player nicht mehr erkannt.
-
Alemarius Nexus schrieb:
So wie dus gemacht hat klappts (hast nen kleinen Fehler, ans Ende muss noch eine }
). Aber mit dem außerhalb von main() definieren hab ichs auch versucht, dann wird aber direkt beim player.erzeuge (auch außerhalb von main) player nicht mehr erkannt.Man darf auch keine Methoden meines Wissens nach im globalen Bereich aufrufen (ausgenommen natürlich Konstruktoren). Du solltest dir vielleicht auch überlegen, ob es nicht sinnvoll wäre, einen Konstruktor für deine Klasse "Mensch" zu definieren, der das gleiche macht, wie die Methode erzeuge() . Falls du dich mit Konstruktoren nicht auskennen solltest, hat dir Mikey ja schon nen Link gegeben, wo du dich informieren kannst.
Warum ich aber überhaupt diesen Beitrag schreibe, weil ich Mikey noch umbedingt ergänzen muss:
Wie er schon richtig erwähnte, sollte man für dein Problem auf jeden Fall Schleifen benutzen. Das Problem ist nämlich, wenn du am Ende der Funktion main() immer wieder main() aufrufst, dann wird das Programm nicht nur immer wieder von Vorne aufgerufen, sondern auch die Objekte
Mensch player; Mensch gorn;werden immer wieder neu erzeugt, ohne, dass die alten Objekte aus dem Speicher gelöscht werden (weil du nie zum return-Befehl gelangst). Dadurch verbraucht dein Programm auf Dauer immer mehr Speicher, bis der Speicher voll ist und dein Programm abstürzen würde.
-
...sondern auch die Objekte
C/C++ Code:
Mensch player;
Mensch gorn;
C/C++ Code:
Mensch player;
Mensch gorn;
C/C++ Code:
Mensch player;
Mensch gorn;werden immer wieder neu erzeugt, ohne, dass die alten Objekte aus dem Speicher gelöscht werden...
Das war doch meine Frage
. Ich wollte, dass eben diese Befehle nicht nochmal aufgerufen werden.
-
Das Problem wär einfach nur gewesen, dass du, wenn du jetzt nur die ersten vier code-zeilen irgendwie aus der main() herausgenommen hättest, dann wär das Problem mit dem ständigen Speicherzuwachs trotzdem gegeben gewesen, weil du ja auch ständig neue String-Objekte erzeugst...
Deshalb dachte ich, du wüsstest nicht, dass dein Programm immer mehr Speicher verbraucht (durch den Aufruf von main() in main()).Allerdings hast du recht, dass ich mich lieber auf die Strings hätte beziehen sollen, anstatt auf die Sachen die du nur einmal ausführen lassen wolltest.
-
es produziert undefiniertes verhalten, main rekursiv aufzurufen.
von daher musst du auf schleifen wechseln (so schön rekursion auch sein mag).wenn es erlaubt wäre, hättest du allerdings deine instanzen als
staticdeklarieren können und logischerweise die funktion "erzeuge" nicht implementiert, sondern die arbeit einem passenden konstruktor überlassen (das solltest du, wie schon gesagt wurde, sowieso tun).