Objekt einer Klasse wird außerhalb von main() nicht mehr erkannt
-
Hallo erstmal,
schon wieder habe ich ein Problem mit meinem Programm: Ein erzeugter Mensch wird außerhalb von main() nicht mehr erkannt. Mein Programm:
#include <cstdlib> #include <iostream> #include <windows.h> #include "mensch.h" using namespace std; int main() { Mensch nexus; Mensch gorn; nexus.erzeuge("Nexus",250,50); gorn.erzeuge("Gorn",250,50); while (true) { /********************Abfragebereich von Aktion und target**************************/ /* int b; while (b != 1) { */ cout<<"Bitte gebe an, welche Aktion du diese Runde ausführen möchtest (Fuer eine komplette Liste, bitte -a schreiben):\n"; string action; getline ( cin , action ); if (action == "Trank") { cout<<"\n\nBitte gebe an, welchen Trank du trinken willst (Für eine volle Liste aller deiner Tränke bitte -p schreiben):\n"; string pot; int sore; getline ( cin , pot ); sore = nexus.drinkpotion(pot); if (sore == 1) { cout<<"Du besitzt diesen Trank nicht!"; } else { if (pot == "Lebenspunkte 1" || pot == "Lebenspunkte 2" || pot == "Lebenspunkte 3") { cout<<"Nexus heilt sich um "<<sore<<" Lebenspunkte!"; } else if (pot == "Mana 1" || pot == "Mana 2" || pot == "Mana 3") { cout<<"Nexus erhöht sein Mana um "<<sore<<" Punkte!\n\n\n\n"; } } } else if (action == "Zauber") { cout<<"Bitte gebe an, welchen Zauber du wirken willst (Fuer eine volle Liste aller erlernten Zauber, bitte -s schreiben):\n"; string spl; getline(cin,spl); int rest; rest = checkspell(spl); if (rest != 1) { cout<<"Zauber existiert nicht!\n\n"; continue; } int c; while (c != 1) { cout<<"Bitte gebe an, auf wen du den Zauber wirken willst (Fuer eine volle Liste von Gegnern und ihren Werten, bitte -v schreiben)\n"; string tgt; getline(cin,tgt); int resth; nexus.castspell("Feuerball","Gorn"); /* resth = checkenemy(tgt); if (resth != 1) { cout<<"Ziel existiert nicht!\n\n"; continue; }*/ c = 1; } } } } int Mensch::castspell (const string spell , const string target) { int dmg; int mnm; if (spell == "Feuerball") { dmg = 20; mnm = 10; } else if (spell == "Feuerpfeil") { dmg = 10; mnm = 5; } else if (spell == "Eispfeil") { dmg = 15; mnm = 7; } else { return 0; } cout<<name<<" wirkt den Zauber "<<spell<<" auf "<<target<<"!\n\n"; mana -= mnm; if (target == "Gorn") { gorn.life -= dmg; } }es ist noch nicht fertig, also nicht wundern wenns noch größere Lücken enthält!
Der Compiler gibt mir in Zeile 95 den Fehler aus, gorn sei undeklariert. gorn wurde aber im main Bereich deklariert. Ich nehme an, in der Funktion ist das nicht mehr sichtbar, denn im main Bereich funktioniert das ganze wunderbar. Meine Frage:
Wie kriege ich es hin, dass gorn auch in dieser Funktion mit korrekten Werten noch deklariert ist? Geht das auch in einer anderen Datei (mensch.h, dort wo ich auch die anderen Funktionen habe)?P.S.: Die angebliche 'Funktion' gorn.life -= dmg; ist garkeine Funktion. In der Klasse von gorn ist ein Wert 'life' definiert. Dieser soll hier heruntergesetzt werden.
-
Wenn du etwas in main erstellst, warum sollte es dann ausserhalb von main bekannt sein?
-
Wie wäre es, wenn du das Ziel nicht als String, sondern gleich als Mensch& übergibst? Dann könntest du dir auch dieses if-else-Geraffel schenken und sofort target.life -= dmg; schreiben.
Außerdem wäre eine Spell-Klasse toll. Würde nämlich auch den Code stark vereinfachen.
Und lass den Quatsch mit "erzeuge". Dafür gibt's Konstruktoren.
-
Wenn du etwas in main erstellst, warum sollte es dann ausserhalb von main bekannt sein?
Ich wollte ja auch wissen, wie man es trotzdem außerhalb von main aufrufen (z.B. an Funktion übergeben) kann

Wie wäre es, wenn du das Ziel nicht als String, sondern gleich als Mensch& übergibst?
Könntest du das mal als Beispiel (auch mit Klassen, wenn möglich) machen? Ich weiß nicht, wie man das richtig an eine Funktion übergibt und ob man gorn oder Mensch oder was auch immer als Referenz benutzt. Und wie muss die Deklaration der Funktion dann aussehen?
Danke für die Hilfe
-
Alemarius Nexus schrieb:
Wenn du etwas in main erstellst, warum sollte es dann ausserhalb von main bekannt sein?
Ich wollte ja auch wissen, wie man es trotzdem außerhalb von main aufrufen (z.B. an Funktion übergeben) kann

na bitte. da hast du doch schon eine loesung

die andere waere, das objekt nicht in main zu erstellen sondern ein level darueber: als vor main.
-
Kurz OT:
Darf ich fragen was das wird? Sieht aus wie ein Textbasiertes Rollenspiel finde ich
-
#include <cstdlib> #include <iostream> #include <windows.h> #include "mensch.h" using namespace std; Mensch nexus; Mensch gorn; nexus.erzeuge("Nexus",250,50); gorn.erzeuge("Gorn",250,50); int main() { while (true) { /********************Abfragebereich von Aktion und target**************************/ /* int b; while (b != 1) { */ cout<<"Bitte gebe an, welche Aktion du diese Runde ausführen möchtest (Fuer eine komplette Liste, bitte -a schreiben):\n"; string action; getline ( cin , action ); if (action == "Trank") ... ... ...Wenn ich das so kompiliere kommt der Fehler: expected constructor, destructor or type conversion before '.' token in den Zeilen 11 und 12 (auch ein paar andere Fehler, das sind aber wahrscheinlich Folgefeher daraus).
Darf ich fragen was das wird? Sieht aus wie ein Textbasiertes Rollenspiel finde ich
Ja sowas ähnliches, wird aber nur zum lernen, was daraus wird weiß ich selber noch nicht (bin noch Anfänger).
-
Hallo,
nexus.erzeuge("Nexus",250,50); gorn.erzeuge("Gorn",250,50);wieder schön in die main-Funktion!

int Mensch::castspell (const string spell , Mensch *target) { int dmg; int mnm; if (spell == "Feuerball") { dmg = 20; mnm = 10; } else if (spell == "Feuerpfeil") { dmg = 10; mnm = 5; } else if (spell == "Eispfeil") { dmg = 15; mnm = 7; } else { return 0; } cout<<name<<" wirkt den Zauber "<<spell<<" auf "<< target.getName() <<"!\n\n"; mana -= mnm; if ( !strcpy( target.getName(), "Gorn" ) ) { target.life -= dmg; } }Hab den Code jetzt nicht geprüft!

Gruß
tHOMY
-
nene, nich strcpy
strcmp 
-
wieder schön in die main-Funktion!

Ahh klappt jetzt, danke.
Hab den Code jetzt nicht geprüft!

benutze ich jetzt nicht, klappt ja so eh, trotzdem danke.
OT: [Schleim]Ich wundere mich, wie gut mir hier geholfen wird. In anderen Foren bekäme ich keine solche Antwort und vor allem nicht so schnell. Großes Lob an euch!
[/Schleim]