Problem mit Klassen und Methoden



  • Hallo bin gerade am Anfang mit c++ und habe folgendes Problem:
    Habe mir eine Klasse erstellt monster.h

    class Monster
    {
    public:
    	Monster();
    	int Gewandtheit;
    	int Staerke;
    	char* m_Name;
    
    	void Setwerte(int wert1, int wert2);
    	void Zeigeinfos();
    	void Setname(char* Name);
    
    };
    

    dann die dazugehörige monster.cpp

    #include"monster.h"
    #include<iostream>
    #include<string>
    
    using namespace std;
    
    Monster::Monster()
    {
    	m_Name = 0;
    
    }
    void Monster::Setwerte(int wert1, int wert2)
    {
    	Staerke = wert1;
    	Gewandtheit = wert2;
    }
    void Monster::Setname(char * Name)
    {
    	m_Name = new char[strlen(Name) + 1];
    	strcpy(m_Name, Name);
    }
    
    void Monster::Zeigeinfos()
    {
    	cout << "Kreatur     :" << m_Name << endl;
    	cout << "Staerke     :"<<Staerke << endl;
    	cout << "Gewandtheit :"<<Gewandtheit << endl<<endl;
    }
    

    und hier die main.cpp

    #include<iostream>
    #include <time.h>
    #include "spieler.h"
    #include"monster.h"
    
    using namespace std;
    void kampf();    //prototyp
    
    void Auswuerfeln();
    int random_Gewandtheit;
    int random_Staerke;
    int random_Glueck;
    int Richtung;
    
    int main()
    
    {
    	Auswuerfeln();
    
    	cout << "Deine Wahl : 1 oder 2 ";
    	cin >> Richtung;
    
    	if (Richtung == 1)
    	{
    
    		Monster Zombie;
    		Zombie.Setwerte(12, 20);
    		Zombie.Setname("Zombie");
    		Zombie.Zeigeinfos();
    		kampf();
    
    	}
    
    	else if (Richtung == 2)
    	{
    		Monster Gerippe;
    		Gerippe.Setname("Gerippe");
    		Gerippe.Setwerte(6, 5);
    		Gerippe.Zeigeinfos();
    
    		kampf();
    
    	}
    
    	return 0;
    }
    
    void kampf()             //funktion "Kampf"
    {
    	//system("cls");
    	cout << "Hier beginnt der Kampf" << endl;
    
    	getchar();
    	getchar();
    }
    
    	 void Auswuerfeln()
    	 {
    		 //Auswürfeln der Werte
    
    		 srand((unsigned)time(0));
    		 random_Gewandtheit = (rand() % 6) + 6;
    		 random_Staerke = (rand() % 12) + 12;
    		 random_Glueck = (rand() % 6) + 6;
    
    		 Spieler Roli;
    		 Roli.Setwerte(random_Gewandtheit, random_Staerke, random_Glueck);
    		 system("cls");
    		 cout << "Deine Werte :" << endl;
    		 Roli.Zeigeinfos();
             //getchar();
    	 }
    

    Alles funktionier soweit wie ich es mir vorstelle.
    Nun möchte ich in der Funktion kampf() die Werte von der Klasse monster verändern,z.B. die "Staerke" um 1 verringern bei einem Treffer.
    Dann möchte ich die Werte wieder ausgeben.aber irgendwie schaffe ich es nicht.
    Oder bin ich total auf dem Holzweg und es geht so gar nicht.
    Könnt ihr mir helfen?
    Danke 🙂



  • ok ,das mit den Werten hab ich jetzt raus 👍 🙂

    Aber wie kann ich die Methode "Zeigeinfos()" in der "Kampf" Funktion aufrufen?



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum MFC (Visual C++) in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Bevor du dich da weiter versteigerst, solltest du erst einmal deine Kenntnisse in C++ etwas verbessern und dir unbedingt angewöhnen, stets so sauber zu programmieren, wie du kannst. Wenn du dir nicht stets maximale Mühe gibst, wie soll es dann etwas werden?

    Dinge die an deinem Programm nicht C++ sind, sondern C:
    -Zeichenketten mit char-Arrays. std::string nehmen, dann entfallen sämtliche Schwierigkeiten von alleine.
    -Zufallszahlen mit rand. Entweder richtig machen (srand-Einsatz ist falsch) oder random benutzen (da kann man weniger falsch machen, aber dafür ist es schwerer zu benutzen).

    Dinge, die manche Leute als C bezeichnen würden:
    -Deine Klassen sind sehr struct-artig, d.h. völlig ohne erkennbare Kapselung. Das macht man in C für Anfänger so, aber in richtigem eigentlich auch nicht. Objektorientiertes Denken kann ich aber nicht mal eben in einem Forenbeitrag erklären, daher lass es zur Not erst einmal so.
    -Deine Funktionen sind sehr imperativ gedacht. Gleiche Kommentare wie zu Klassen.

    Dinge die unsauber sind:
    -Einrückung! Die meiste Zeit geht es, aber an manchen Stellen hast du dicke Hauer drin.
    -Formatierung: Weniger Leerzeilen, mehr Leerzeichen.
    -Globale Variablen: Der sicherste Weg zu einem nicht funktionierenden Spagetticode. Unbedingt verbessern!

    Am dringendsten davon sind std::string und die globalen Variablen. Das ist kaum Aufwand und jeweils ganz wesentliche Verbesserungen. Ich vermute auch, dass dein Problem ganz von alleine weg gehen wird, wenn du die globalen Variablen los wirst. Ich habe den Eindruck, dass du schon jetzt vollkommen den Überblick verloren hast, wo welches Objekt lebt und welches Objekt du gerade benutzt.



  • Autsch!
    Das wird wohl so nichts.
    Danke für die Hinweise.
    Gruß



  • Noch ein Tipp. Deine Funktion Setwerte ruft nach Ärger.

    Warum?

    Weil sie schwer zu lesen ist. Schaue ich mit den Header an, sehe ich nur
    void Setwerte(int wert1, int wert2);
    also dass irgendwelche 2 Werte gesetzt werden. Nur wenn ich in die Implementierung schaue, stelle ich fest, dass wert1 die Stärke und wert2 die Gewandtheit ist. Du kannst das leicht mal vertauschen.

    Noch schlimmer: dein Spieler hat auch eine Funktion Setwerte . Diese hat sogar 3 Parameter, wie wir an Roli.Setwerte(random_Gewandtheit, random_Staerke, random_Glueck); erkennen können. Die Gewandheit und Stärke sind hier auch noch in umgekehrter Reihenfolge.

    Ratschläge: 1) Benenne die Variablen vernünftig (nicht "wert1" und "wert2"), sodass man direkt an der Signatur erkennt, was da in welcher Reihenfolge rein muss. Das behebt das Problem allerdings nicht, sondern macht es nur etwas leichter nachvollziehbar, was man macht.
    2) Nimm entweder separate Funktionen für alle Eigenschaften (setStaerke, setGewandheit, ...). Oder mach dir eine Klasse oder ein Struct "Kampfwerte", in dem du alle relevanten Kampfwerte drin hast - dann kannst du mit "setKampfwerte" gleich alles setzen. Also auch allgemein: Funktionen mit weniger Parametern sind leichter zu verstehen als welche mit vielen Parametern.


Anmelden zum Antworten