OOP - Wert ändert ... aber auch nicht
-
Hallo liebe Community,
ich habe heute meine erste Klasse geschrieben! Leider funktioniert sie nicht richtig.
Hier der Code:
#include <iostream> #include <cstring> #include <conio.h> using namespace std; class Krieger { private: char Name [20]; long int Leben, Staerke; public: char * init(char *, long int, long int); void angreifen (Krieger); void Verletzung (long int); long int leben (void); char * gib_name (void); bool lebendig (void); }; int main (void) { Krieger K1, K2; K1.init("Krieger 1", 10, 3); K2.init("Krieger 2", 10, 4); while (K1.lebendig() && K2.lebendig()) { K1.angreifen(K2); K2.angreifen(K1); cout << K1.gib_name() << ": " << K1.leben() << endl; cout << K2.gib_name() << ": " << K2.leben() << endl; getch(); } getch(); return 0; } char * Krieger::init (char * str, long int Leb, long int St) { Leben = Leb; Staerke = St; return strncpy(Name, str, sizeof(Name)); } void Krieger::angreifen(Krieger K) { K.Verletzung(Staerke); } void Krieger::Verletzung (long int St) { Leben -= St; } long int Krieger::leben (void) { return Leben; } char * Krieger::gib_name(void) { return Name; } bool Krieger::lebendig (void) { return (Leben > 0); }Edit: geändert dumme Fehler
Irgendwie ändert der Wert von Leben nicht in der Funktion Krieger::Verletzung(). Seht am besten selbst.Mfg MisterVista
-
MisterVista schrieb:
Irgendwie ändert der Wert von Leben nicht in der Funktion Krieger::wunde(). Seht am besten selbst.
das wundert mich nicht. weils die funktion nicht gibt.
-
Zum einen, was du da machst ist absolut reudig. Du mixt C und C++.
Zum zweiten, mit der Funktion "Krieger::wunde()" meinst du sicherlich "Krieger::Verletzung" ? oder? Naja wie soll sich der Wert ändern, wenn du die Funktionen nirgends in der Main aufrufst?
-
Tschuldigung *schämen* Trotzdem Fehler bleibt
-
Das Objekt wird kopiert. Übergib es bei "angreifen()" einfach als Referenz
void Krieger::angreifen(Krieger& K);
-
Logisch bleibt dein Fehler du hast ja auch nichts am Code geändert
Oder doch?Wenn ja, dann zeig es uns mal.
-
Zeile 25 und 26
-
Ganz einfach, der Post von issen1 erklärt warum diese Verhalten auftritt, ändere es und du wirst sehen es wird funktionieren.
Und weiterhin versuch dich an eine Sprache zu halten solche C/C++ Mixe werden hier nicht gerne gesehen.Weil du dich aktuell im C++-Forum befindest
-
naja - da sich niemand anders erbarmt, dir zu sagen, was alles hässlich ist, versuch ich das mal:
/*Krieger.h*/ //include-guards: #ifndef KRIEGER_H_INCLUDED #define KRIEGER_H_INCLUDED #include <string> //std::string class Krieger { public: typedef unsigned long int Tleben; typedef unsigned long int Tstaerke; //ein paar typedefs können nicht schaden... typedef Tstaerke Tdamage; private: std::string Name; //ist komfortabler, sicherer und auch schneller, als du es mit char* schaffst :P Tleben Leben; //variablen-deklarationen sollten immer in eine extra zeile Tstaerke Staerke; public: Krieger (const std::string& name, Tleben leben, Tstaerke staerke); const std::string& GetName() const {return Name;} void SetName(const std::string &val) {Name = val;} TLeben GetLeben() const {return Leben;} bool IsAlive () const {return static_cast <bool> (Leben);} //0 -> tot, rest ist lebendig Tdamage GetDamage() const {return Staerke;} void TakeDamage(const Tdamage& dmg); /*brauchen wir nicht (mehr), wir haben einen konstruktor: char * init(char *, long int, long int); */ }; namespace fight /*könnte man ggf. noch in einen anderen header verlagern*/ { void attack (Krieger& lhs, const Krieger& rhs); } #endif //#ifndef KRIEGER_H_INCLUDED/*Krieger.cpp*/ #include "Krieger.h" Krieger::Krieger(const std::string& name, Krieger::Tleben leben, Krieger::Tstaerke staerke) : Name(name), Staerke(staerke), Leben(leben) {} void Krieger::TakeDamage(const Krieger::Tdamage& dmg) { if(Leben < dmg) { Leben = 0; } else { Leben -= dmg; } } void fight::attack(Krieger& lhs, const Krieger& rhs) { lhs.TakeDamage ( rhs.GetDamage() ); }/*main.cpp*/ #include <iostream> #include <cstdlib> #include "Krieger.h" #include <conio.h> int main () //void schreibt man in C++ nicht mehr in die Parameter-Liste { Krieger K1 ("Krieger 1", 10, 3); Krieger K2 ("Krieger 1", 10, 4); while (K1.IsAlive() && K2.IsAlive()) { fight::attack (K1, K2); fight::attack (K2, K1); std::cout << K1.GetName() << ": " << K1.GetLeben() << std::endl; std::cout << K2.Getname() << ": " << K2.GetLeben() << std::endl; } getch(); return EXIT_SUCCESS; }ich hoffe, es hilft dir ein wenig, du änderst es und vor allem: du verstehst es ^^
bb