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


Anmelden zum Antworten