Wie am besten machen?



  • Hi, ich hoffe diese Frage wurde nicht schonmal gestellt, aber an dem threadnamen kann man ableiten, dass ich nicht genau weiß wie ich die Frage beschreiben soll.

    Es geht um folgendes:

    ich habe ein Spiel mit einigen kleinen unterspielen. Nun wollte ich eine Hauptklasse CGame sowie für jedes Spiel eine eigene Klasse machen. Jede klasse soll eine update() und display() funktion haben. In der hauptklasse CGame soll zuerst das menue (welches bei jedem spiel gleich ist) gestartet, und dann in jedem frame einmal die update() und einmal die display() funktion fuer das jeweils gestartete spiel aufgerufen werden.
    Jetzt könnte man der Basisklasse natürlich eine Instanz von jeder spiele-klasse spendieren, und dann gucken welches spiel gerade läuft und die funktionen der jeweiligen klasse aufrufen. Jedoch geht das bestimmt auch einfacher, oder? also ich bräuchte sozusagen einen Pointer den ich auf jede beliege Klasse zeigen lassen kann...

    bin für jede hilfe dankbar,
    mfg DasPinsch



  • DasPinsch schrieb:

    also ich bräuchte sozusagen einen Pointer den ich auf jede beliege Klasse zeigen lassen kann...

    abstrakte Basisklasse Game
    davon leiten alle anderen Game Klassen ab. die funktionalitaet wird mittels virtual methodem implementiert.

    dann kannst du
    Game* game=new SomeGame;
    game->do_something();
    machen - und der compiler uebernimmt die arbeit das passend do_something() zu finden.

    meinst du das? ich hab nicht ganz verstanden, was du willst.

    PS: C als prefix fuer klassen ist boese.



  • Shade Of Mine schrieb:

    abstrakte Basisklasse Game
    davon leiten alle anderen Game Klassen ab. die funktionalitaet wird mittels virtual methodem implementiert.

    dann kannst du
    Game* game=new SomeGame;
    game->do_something();
    machen - und der compiler uebernimmt die arbeit das passend do_something() zu finden.

    meinst du das? ich hab nicht ganz verstanden, was du willst.

    meinte zwar nicht genau das, wird aber so (denk ich mal) gehen 🙂 danke!

    Shade Of Mine schrieb:

    PS: C als prefix fuer klassen ist boese.

    wieso?



  • DasPinsch schrieb:

    Shade Of Mine schrieb:

    PS: C als prefix fuer klassen ist boese.

    wieso?

    C als prefix wurde von MS erfunden um der MFC einen eigenen namespace zu erschaffen (damals gabs noch keine namespace)

    folglich gehoert der "namespace" C der MFC.
    wenn du nun eine klasse CList schreibst, kennt sich niemand mehr aus.
    ist es jetzt CList von der MFC, oder ist es dasPinsch::CList?

    deshalb sollte man C nicht als prefix fuer klassen verwenden.

    dass man sowieso keine prefixe fuer klassen verwenden sollte, ist ein anderes kapitel.



  • Sieht mir nach einer schönen Anwendung des State-Pattern aus...

    class SubGame
    {
    public:
       virtual ~SubGame() {};
       virtual void menu() = 0;
       virtual void playSeGame() = 0;
    };
    class HauDenLukas : public SubGame
    {
    public:
       virtual void menu() {/* */};
       virtual void playSeGame() {/* */};
    };
    class Schafkopf : public SubGame, public IchkommehaltausBayernundkannkeinSkat
    {
    public:
       virtual void menu() {/* */};
       virtual void playSeGame() {/* */};
    };
    

    Darum bauen wir uns einen Wrapper:

    class GameWrapper
    {
    public:
       GameWrapper() : m_seGame(0) {}
       ~GameWrapper() {delete m_seGame;}
       void menu() {m_seGame->menu();}
       void playSeGame() {m_seGame->playSeGame();}
       void selectGame() {delete m_seGame;
                          m_seGame = (rand() % 2) ? new HauDenLukas() : new Schafkopf();}
    private:
       SubGame* m_seGame;  
    };
    

    Schön daran ist, daß Du nun nur mit einem Game-Objekt arbeitest:

    int main()
    {
       GameWrapper game;
       for (;;)
       {
          game.selectGame();
          game.menu();
          game.playSeGame();
       }
       return 0; // hm... sieht nach akuter Spielsucht aus
    }
    

    und trotzdem schaltet sich im Inneren das Spiel um. Daher State-Pattern - der Zustand [State] des Objekts (hier GameWrapper) ändert sich.



  • @all: danke !

    @marc++us: das ist doch im prinzip das was shade gesagt hat + wrapper, oder?



  • Ja.

    Nur der zusätzliche Trick ist hier, daß sich der Verwender (hier main) nicht darum kümmern muß die Objekte aktiv zu verwalten (d.h. main besitzt keinen Zeiger auf eine abstrakte Basisklasse), sondern daß die Verwaltung noch einmal gekapselt wird.

    Das ist einfach eine zusätzliche Abstraktionsstufe, die aber häufig hilfreich ist.


Anmelden zum Antworten