2 beinahe gleiche Klassen, wie umsetzen?



  • TMeier schrieb:

    Die Basics verstehe ich schon, nur war mir der Virtual nicht bekannt^^

    Und damit ist der Satz schon in sich falsch. Grundlagen sollten schon die C++ Schlüsselwörter und zumindest ein paar Teile der Standardbibliothek umfassen. Jedes einigermaßen sinnvolle Grundlagenbuch deckt dies ab. Dann, und wirklich erst dann, solltest du dich an einem solchen Projekt versuchen.

    Zudem:
    a) "unterschied" ist kein sinnvoller Variablenname. Du solltest Namen so wählen, das du auch ein halbes Jahr später noch den Code verstehst. Gute Namen sind wichtig.

    b) Völlig egal wie du benennst und einrückst: ABER sei einheitlich. Einmal eine Klasse "monster" und dann eine "Charakter" zu nennen ist nicht gut. Entweder schreibst du Klassen mit einem Großbuchstaben zu beginn oder nicht. Aber sei einheitlich.

    c) Du hast einige Designansätze die nicht unbedingt ideal sind. Sie können vielleicht für dich ausreichen, sind aber nicht unbedingt "wartbar" (bzw. Änderungen lassen sich nur schwer implementieren).

    Beispielsweise:

    TMeier schrieb:

    class Charakter : public monster
    {
        int HelmWert, BrustWert, HandWert, ArmWert, HoseWert, GurtWert, SchuheWert, Schildwert;
        string HelmName, BrustName, HandName, ArmName, HoseName, GurtName, SchuheName, SchildName;
    };
    

    Fällt dir hier nicht bereits etwas auf? Du hast hier sehr viele Codeduplikate (xxxWert <-> xxxName). Was ist wenn später auch noch ein Haltbarkeitswert etc. dazu kommen soll?

    Zudem: Ist ein Charakter ein Monster? Ich gebe dir den guten Rat nach Möglichkeit nur von Klassen abzuleiten wo du wirklich sagen kannst "Ist ein" (ansonsten sollte es zumindest keine "public"-Vererbung sein).

    Ich würde hier nochmals trennen. Dabei gibt es mehrere Ansätze, einer wäre z.B die Rüstungsteile auch nochmals zu trennen.



  • asc schrieb:

    TMeier schrieb:

    Die Basics verstehe ich schon, nur war mir der Virtual nicht bekannt^^

    Und damit ist der Satz schon in sich falsch. Grundlagen sollten schon die C++ Schlüsselwörter und zumindest ein paar Teile der Standardbibliothek umfassen. Jedes einigermaßen sinnvolle Grundlagenbuch deckt dies ab. Dann, und wirklich erst dann, solltest du dich an einem solchen Projekt versuchen.

    Zudem:
    a) "unterschied" ist kein sinnvoller Variablenname. Du solltest Namen so wählen, das du auch ein halbes Jahr später noch den Code verstehst. Gute Namen sind wichtig.

    b) Völlig egal wie du benennst und einrückst: ABER sei einheitlich. Einmal eine Klasse "monster" und dann eine "Charakter" zu nennen ist nicht gut. Entweder schreibst du Klassen mit einem Großbuchstaben zu beginn oder nicht. Aber sei einheitlich.

    c) Du hast einige Designansätze die nicht unbedingt ideal sind. Sie können vielleicht für dich ausreichen, sind aber nicht unbedingt "wartbar" (bzw. Änderungen lassen sich nur schwer implementieren).

    Beispielsweise:

    TMeier schrieb:

    class Charakter : public monster
    {
        int HelmWert, BrustWert, HandWert, ArmWert, HoseWert, GurtWert, SchuheWert, Schildwert;
        string HelmName, BrustName, HandName, ArmName, HoseName, GurtName, SchuheName, SchildName;
    };
    

    Fällt dir hier nicht bereits etwas auf? Du hast hier sehr viele Codeduplikate (xxxWert <-> xxxName). Was ist wenn später auch noch ein Haltbarkeitswert etc. dazu kommen soll?

    Zudem: Ist ein Charakter ein Monster? Ich gebe dir den guten Rat nach Möglichkeit nur von Klassen abzuleiten wo du wirklich sagen kannst "Ist ein" (ansonsten sollte es zumindest keine "public"-Vererbung sein).

    Ich würde hier nochmals trennen. Dabei gibt es mehrere Ansätze, einer wäre z.B die Rüstungsteile auch nochmals zu trennen.

    Ja das mit dem Namen Unterschied war ja nur ein Beispiel 😃
    Und die Namensumsetzung ziehe ich Natürlich konsequent durch.

    Den rest hast du eindeutig richtig erkannt 🙂

    Das mit dem XXName XXWert ist mit auch aufgefallen jedoch ist mir bis jetzt kein Weg bekannt wie ich das umgehen könnte.

    Gruss,

    TMeier



  • Hehe sehen lustig aus die Bezeichner, schöner wäre noch ArmWertInEinerCppVariabelDesTypsInt^^

    Aber du machst was, das ist gut. Nur durch Fehler lernt der Mensch. Fehler machen ist also was gutes, das vergessen viele heutzutage einfach.



  • TMeier schrieb:

    Das mit dem XXName XXWert ist mit auch aufgefallen jedoch ist mir bis jetzt kein Weg bekannt wie ich das umgehen könnte.

    Teile und Herrsche...

    Eine Möglichkeit (und etwas weiter gesponnen):

    enum ERuestungspostion
    {
        postion_helm,
        //...
        postion_schild
    };
    
    class Ruestungsteil
    {
        //...
        ERuestungspostion Position;
        std::string Name;
        int Ruestungswert;
        int HaltbarkeitMax;
        int HaltbarkeitAktuell;
        //...
    };
    


  • Butterbrot schrieb:

    Hehe sehen lustig aus die Bezeichner, schöner wäre noch ArmWertInEinerCppVariabelDesTypsInt^^

    Aber du machst was, das ist gut. Nur durch Fehler lernt der Mensch. Fehler machen ist also was gutes, das vergessen viele heutzutage einfach.

    Haha der VarName ist ja mal hammer xD

    Ja ich bin froh das einem hier so gut geholfen wird.
    Ich versuche jetzt möglichst schnell wieder an meine C++ Bücher zu kommen (sind bei Freunden) und werde mich in den Ferien (ab heute Abend 17:00) damit Beschäftigen udn wie gesagt ein Projekt eröffnen damit alle sehen was ich mache 😃

    Kennst du eine Seite auf welcher ich das am besten machen kann? (hier?)

    Gruss und Danke,

    TMeier



  • asc schrieb:

    TMeier schrieb:

    Das mit dem XXName XXWert ist mit auch aufgefallen jedoch ist mir bis jetzt kein Weg bekannt wie ich das umgehen könnte.

    Teile und Herrsche...

    Eine Möglichkeit (und etwas weiter gesponnen):

    enum ERuestungspostion
    {
        postion_helm,
        //...
        postion_schild
    };
    
    class Ruestungsteil
    {
        //...
        ERuestungspostion Position;
        std::string Name;
        int Ruestungswert;
        int HaltbarkeitMax;
        int HaltbarkeitAktuell;
        //...
    };
    

    Sprich zuerst per enum die Aufzählung machen der typen (richtig verstanden?)
    danach eine Klasse per ERuestungposition mit enum verknüpfen?

    (Was beduetet hier ERuestungspostion Position;)

    Gruss,

    TMeier



  • TMeier schrieb:

    Sprich zuerst per enum die Aufzählung machen der typen (richtig verstanden?)

    Nenn es Typ, ich nenne es Postion (wo wird dieser Rüstungsteil getragen)? Die Trennung ist zwar nicht nötig, erlaubt aber später z.B. eine Aufteilung von Läden etc. nach dem Typ.

    TMeier schrieb:

    (Was beduetet hier ERuestungspostion Position;)

    Ein enum definiert einen (ganzzahligen) Datentyp, ähnlich wie ein int. Nur das dieser halt nur die Werte die man im enum definiert hat verwenden kann - und das diese keine Zahlenwerte sondern für den Programmierer "verständliche" Werte sind (position_schild ist lesbarer als eine Zahl wo man erst die Bedeutung suchen muss).

    Ich lege hier also eine Variable an, der einen Wert des enums aufnehmen kann. Ein Rüstungsteil kann (zumindest nach diesem Ansatz) an genau einer Position getragen werden.



  • asc schrieb:

    TMeier schrieb:

    Sprich zuerst per enum die Aufzählung machen der typen (richtig verstanden?)

    Nenn es Typ, ich nenne es Postion (wo wird dieser Rüstungsteil getragen)? Die Trennung ist zwar nicht nötig, erlaubt aber später z.B. eine Aufteilung von Läden etc. nach dem Typ.

    TMeier schrieb:

    (Was beduetet hier ERuestungspostion Position;)

    Ein enum definiert einen (ganzzahligen) Datentyp, ähnlich wie ein int. Nur das dieser halt nur die Werte die man im enum definiert hat verwenden kann - und das diese keine Zahlenwerte sondern für den Programmierer "verständliche" Werte sind (position_schild ist lesbarer als eine Zahl wo man erst die Bedeutung suchen muss).

    Ich lege hier also eine Variable an, der einen Wert des enums aufnehmen kann. Ein Rüstungsteil kann (zumindest nach diesem Ansatz) an genau einer Position getragen werden.

    Danke schön jetzt verstehe ich das ganze und habe mich angemeldet, und das Projekt mal deponiert 😃

    Werde nun fleissig weiter lernen und lesen und Stück für Stück das RPG aufbauen.

    Danke euch 🙂



  • Hab noch schnell eine Frage:

    Ich habe 2 Klassen:

    class Mensch
    {
    //Eigenschaften und Methoden ink. Zuweisung Parameter zu Membervariablen

    }

    class Mann : public Mensch
    {
    //Eigenschaften und Methoden ink. Zuweisung Parameter zu Membervariablen
    }

    Wie kann ich nun ein Objekt erstellen?

    Bei einer Klasse kontne ich früher einfach folgendes eingeben:

    Mann Hans("Hans",Alter,Groesse);

    wenn ich das jetzt mache, kann ich nur die Werte des Mannes festlegen was ja soweit so gut ist, jedoch muss ich die Werte für die Klasse Mensch auch noch festlegen.

    Gruss & Danke,

    TMeier



  • google mal nach "Initialisierungsliste Basisklasse". 😉



  • out schrieb:

    google mal nach "Initialisierungsliste Basisklasse". 😉

    Wenn ich es richtig in errinerung habe ist dies doch richtig?

    class Mensch
    { 
    	public: 
    	int Alter, Gender, Groesse;
    	string Name;
    	Mensch()
    		: Name(""),
    		Alter(0), 
    		Gender(0), 
    		Groesse(0)
    
    	{
    		//Konstruktorrumpf
    	}
    
    	Mensch( //Konstruktor mit Parametern
    	 string const & Name, 
    	 int Alter, 
    	 int Gender,
              int Groesse)
    	 :  Name(Name),	//Zuweisung Parameter zur Membervariablen
    		Alter(Alter), 
    		Gender(Gender), 
    		Groesse(Groesse)
    	{
    	}
    
    	void Unterhaltung()
    	{
    		//Unterhaltung
    	}
    
    	~Mensch()
    	{
    		//Destruktor
    	}
    }; 
    
    class Mann: public Mensch
    { 
    	public:
    	int Maennlichkeit; 
    	Mann()
    	: 	Maennlichkeit("")
    
    	{
    		//Konstruktorrumpf
    	}
    
    	Mann( //Konstruktor mit Parametern 
    	 int Maennlichkeit)
    	 :  Maennlichkeit(Maennlichkeit)//Zuweis. Parameter zu Membervariablen
    	{
    
    	}
    
    	~Mann() 
    	{
    		// Destruktor 
    	}
    };
    

    Danach möchte ich ein Objekt erstellen:

    Mann Hans(**"Hans",18,M,180,**Maenlichkeit);

    Alles was Fett ist kann ich nicht eingeben zur Zeit.

    Gruss,

    TMeier



  • 1. Standardkonstruktor weglassen (sowie Destruktoren)
    2. Deine Formatierung ist nicht schön
    3. Sinnfreie Kommentare, die selbsterklärend sind

    So und jetzt zu deinem Problem:

    class A
    {
    	private:
    		int c, d;
    	public:
    		A(int cc,int dd)
    			:c(cc), d(dd)	{}
    
    };
    
    class B : public A
    {
    	private:
    		int a, b;
    	public:
    		B(int cc, int dd, int aa, int bb)
    			:A(cc, dd), a(aa), b(bb)	{}
    
    };
    

    gruß
    syntax



  • TMeier schrieb:

    ...

    Bitte tue uns den gefallen und lese zumindest ein Grundlagenbuch bis zum Ende, zumindest ein paar Fragen wären dann unnötig.

    Davon abgesehen aber noch ein paar andere Anmerkungen:
    1. Ich würde nicht Deutsch/Englisch wild mischen, da du scheinbar überwiegend deutsch programmierst, passt ein Eigenschaftsname wie "Gender" nicht wirklich (Geschlecht wäre treffender).

    2. Wenn eine Variable nur begrenzte Werte annehmen kann, sollte man überlegen ob ein enum nicht manchmal lesbarer/passender ist. Das Geschlecht wäre in einem enum sicherlich "lesbarer" als in einem int-Wert, wo man dann immer wieder überlegen muss, wofür ein Wert steht.

    Was liest sich wohl besser:

    if(Geschlecht = 1)
      ...
    if(Geschlecht = weiblich)
      ...
    

    3. Meinst du deine Eigenschaften wie "Maennlichkeit" wirklich ernst? Zudem: Müssen es wirklich verschiedene Klassen für Männer und Frauen sein? Sind die Unterschiede in deinem RPG wirklich so entscheidend, das keine Unterscheidung wie die Variable Geschlecht ausreicht?

    Es kommt mir so vor das du zumindest teilweise Vererbung einsetzt, wo ein paar Variablen reichen würden.

    4. Dies ist nicht ganz so wichtig, manchmal kann "int" auch einfach Absicht sein. Aber bei Werten wie Alter sollte man sich zumindest überlegen ob man nicht unsinged-Typen verwendet.

    5. Verwende NIEMALS "using namespace" im Header. Dein Code deutet zumindest darauf hin das du es tust (string statt std::string in der Klassendeklaration). Wenn man using namespace verwendet, immer nur im Source und nach allen Includes.

    6. Was soll eine Methode wie Unterhaltung() bitte bewirken? Vermeide auch immer UI-Abhängiges (Als UI kann auch die Konsole gelten) in Klassen zu verwenden, die UI unabhängig sind. Ansonsten erschwerst du dir eine spätere Portierung massiv.



  • Syntax_error schrieb:

    1. Standardkonstruktor weglassen (sowie Destruktoren)
    2. Deine Formatierung ist nicht schön
    3. Sinnfreie Kommentare, die selbsterklärend sind

    So und jetzt zu deinem Problem:

    class A
    {
    	private:
    		int c, d;
    	public:
    		A(int cc,int dd)
    			:c(cc), d(dd)	{}
    
    };
    
    class B : public A
    {
    	private:
    		int a, b;
    	public:
    		B(int cc, int dd, int aa, int bb)
    			:A(cc, dd), a(aa), b(bb)	{}
    
    };
    

    gruß
    syntax

    Sprich:

    class Mensch 
    { 
        private:
           int Alter, Gender, Groesse;
           string Name; 
        public: 
            Mensch(int MenschAlter, int MenschGender, int MenschGroesse, string MenschName) 
            :Alter(MenschAlter), Gender(MenschGender), 
            Groesse(MenschGroesse), Name(MenschName) 
            {
            }
    }; 
    
    class Mann: public Mensch 
    { 
        private:
             int MannMaenlichkeit
        public: 
       Mann(int MenschAlter, int MenschGender, int MenschGroesse, string MenschName)
        :Mensch(MenschAlter, MenschGender, MenschGroesse, MenschName), MannMaenlichkeit(Maenlichkeit) 
       {
       } 
    };
    

    Wenn ich das richtig verstehe "schiebe ich alle Eigenschafte der Klasse Mensch in die Klasse Mann, in dem man ":Mensch(EIGENSCHAFTEN MENSCH)," EIGENSCHAFTEN MANN

    Gurss & Danke



  • asc schrieb:

    TMeier schrieb:

    ...

    Bitte tue uns den gefallen und lese zumindest ein Grundlagenbuch bis zum Ende, zumindest ein paar Fragen wären dann unnötig.

    Davon abgesehen aber noch ein paar andere Anmerkungen:
    1. Ich würde nicht Deutsch/Englisch wild mischen, da du scheinbar überwiegend deutsch programmierst, passt ein Eigenschaftsname wie "Gender" nicht wirklich (Geschlecht wäre treffender).

    2. Wenn eine Variable nur begrenzte Werte annehmen kann, sollte man überlegen ob ein enum nicht manchmal lesbarer/passender ist. Das Geschlecht wäre in einem enum sicherlich "lesbarer" als in einem int-Wert, wo man dann immer wieder überlegen muss, wofür ein Wert steht.

    Was liest sich wohl besser:

    if(Geschlecht = 1)
      ...
    if(Geschlecht = weiblich)
      ...
    

    3. Meinst du deine Eigenschaften wie "Maennlichkeit" wirklich ernst? Zudem: Müssen es wirklich verschiedene Klassen für Männer und Frauen sein? Sind die Unterschiede in deinem RPG wirklich so entscheidend, das keine Unterscheidung wie die Variable Geschlecht ausreicht?

    Es kommt mir so vor das du zumindest teilweise Vererbung einsetzt, wo ein paar Variablen reichen würden.

    4. Dies ist nicht ganz so wichtig, manchmal kann "int" auch einfach Absicht sein. Aber bei Werten wie Alter sollte man sich zumindest überlegen ob man nicht unsinged-Typen verwendet.

    5. Verwende NIEMALS "using namespace" im Header. Dein Code deutet zumindest darauf hin das du es tust (string statt std::string in der Klassendeklaration). Wenn man using namespace verwendet, immer nur im Source und nach allen Includes.

    6. Was soll eine Methode wie Unterhaltung() bitte bewirken? Vermeide auch immer UI-Abhängiges (Als UI kann auch die Konsole gelten) in Klassen zu verwenden, die UI unabhängig sind. Ansonsten erschwerst du dir eine spätere Portierung massiv.

    Danke für deine Tipps das mit Sprache mischen ist mir bekannt und das soll ja auch nur ein Beispiel sein 😃
    Genau so mit der Maennlichkeit xD
    Die Unterhaltugn ist auch nur ein Beispiel.
    Mit dem Dateityp hast du natürlich recht, wo bei dies natürlich ein Besipiel war, jedoch hätte ich das auch sonst so gemacht :S

    Das mit dem Using Namespace stimme ich dir zu und bekenne mich Schuldig.
    Ich werde mich gleich bei Google erkundigen warum das so ist.



  • Dragon4411 schrieb:

    Ich werde mich gleich bei Google erkundigen warum das so ist.

    Da wirst du bereits im Forum fündig.

    Wenn du wirklich mal sinnvoll Geld investieren willst: Kauf dir "Effektiv C++ programmieren" (Bitte in der neusten Auflage). Auch wenn ich das Buch erst nach dem ersten Grundlagenbuch als wichtig ansehe...



  • Wobei, wenn du mit English kein Problem hast, sicherlich die Originalversion zu empfehlen wäre. Und ja, das Buch ist Pflicht für jeden C++ Programmierer...


Anmelden zum Antworten