Klassen wie Arrays benutzen? + Problem mit "enum"



  • Moin,

    ich habe vor Kurzem angefangen, mich in C++ einzuarbeiten, und bin nun dabei, ein Kartenspiel (bzw. erstmal das Grundgerüst) zu bauen, wobei ich jetzt zwei Probleme habe.
    Ich hoffe, kein überflüssiges Thema erstellt zu haben... jedenfalls bin ich mit der Suchfunktion nicht weitergekommen.

    1. Ich habe Wert und Farbe der Karte mit enum definiert:

    enum Farbe {Kreuz, Pik, Herz, Karo};
    enum Wert {Sieben, Acht, Neun, Dame, Koenig, Zehn, As, Bube};

    Nun erzeugt rand()%8 bzw. ~%4 entsprechende Zufallszahlen für jede Karte.
    Wenn ich diese nun Wert oder Farbe zuordne und abfrage, gibt er mir nur den Integer-Wert zurück (z.B. "0" statt "Kreuz").
    Das ganze lässt sich zur Not mit einer extra Funktion lösen, aber gibt es da nicht auch einen eleganteren Weg?
    Muss ich das irgendwie anders definieren?

    2. Um den einzelnen Karten Werte und Farben zuzuordnen, und vor allem, um sie später im Spiel abhängig von den Benutzereingaben anzusprechen, habe ich probiert, diese als Array oder wie ein Array zu erzeugen.
    Ungefähr so:

    class Karte
    {(...)};
    Karte Karte[32]

    Statt der gewünschten zweiunddreißig Karten bekomme ich auf dem Weg aber nur eine Fehlermeldung des Compilers.

    Wie kann ich das Problem lösen?
    Ich möchte die Karte (und deren Memberfunktionen) später im Spiel mal mit Karte[n] und Karte[n].blablabla ansprechen können.

    Irgendwie so.
    Wichtig ist halt, dass die Klasse über eine varaible angesprochen werden kann.

    Vielen Dank schonmal im Voraus,

    Sinthoras



  • Vielleicht gibst du deinem Array mal einen anderen Namen als Karte, den du schon für die Klasse verwendet hast.



  • Danke für den Tipp, aber es geht (jetzt) auch, wenn die Karte einfach Karte[32] heißt.

    Fragt mich nicht, woran es davor gelegen hat.

    Jedenfalls hat mir ein (anscheinend mäßig kompetenter) Informatiklehrer gesagt, es sein nicht möglich, Klassen so anzusprechen.
    Daher habe ich den Programmfehler wohl fälschlicherweise darauf zurückgeführt.

    Kann mir jemand bei dem anderen Problem helfen?

    Falls es etwas ungenau beschrieben war:

    Ich möchte, dass, wenn ich Wert wert die Integerzehl 0 zuordne, er "Kreuz" als wert ausgibt.
    Kann ich das irgendwie über die Definition machen oder brauche ich immer eine extra Funktion für sowas?



  • Sinthoras schrieb:

    Danke für den Tipp, aber es geht (jetzt) auch, wenn die Karte einfach Karte[32] heißt.

    Fragt mich nicht, woran es davor gelegen hat.

    Jedenfalls hat mir ein (anscheinend mäßig kompetenter) Informatiklehrer gesagt, es sein nicht möglich, Klassen so anzusprechen.
    Daher habe ich den Programmfehler wohl fälschlicherweise darauf zurückgeführt.

    Namen müssen eindeutig sein - also solltest du für die Variable (Array) einen anderen Namen verwenden als für die Klasse (Datentyp), z.B. Karte Karten[32];

    Ich möchte, dass, wenn ich Wert wert die Integerzehl 0 zuordne, er "Kreuz" als wert ausgibt.
    Kann ich das irgendwie über die Definition machen oder brauche ich immer eine extra Funktion für sowas?

    Von alleine macht dir das der Compiler nicht - der wandelt enum-Variablen in int's um, wenn er sie ausgeben soll. Aber du kannst dir gerne eine eigene Ausgabefunktion anlegen (afair könntest du auch op<< überladen, aber da bin ich nicht 100% sicher):

    void print(ostream& out,Farbe f)
    {
      static string Namen[] = {"Kreuz","Pik","Herz","Karo"};
      if(f<4) out<<Namen[f];
      else    out<<"Fehler";
    }
    


  • Ok, danke;
    dann mache ich das mal irgendwie so.

    P.S.: Karte Karte[32] geht auch - besser ist es natürlich mit anderem Namen.


Log in to reply