2 Design Fragen



  • Hallo,

    hätte da mal zwei Design Fragen an euch, ne Antwort wäre nett! 😉

    Also ich code ein Spiel, habe verschiedene Headerdateien:

    World.h
    JumpAndRun.h <- die Haupt Header Datei, die alle anderen Header Dateien included

    Nun include ich in World.h JumpAndRun.h weil in JumpAndRun.h alle wichtigen Definitionen und alle anderen Dateien schon included sind. In JumpAndRun include ich World.h weil die Klasse JumpAndRun eine Instanz von World enthält

    So:

    JumpAndRun.h:

    #include "Tile.h" // Alles auch von World.h gebraucht
    #include "TileSky.h"
    #include "TileGrass.h"
    #include "World.h"
    
    class JumpAndRun
    {
    ..
    	World world;
    ..
    };
    

    World.h:

    #include "JumpAndRun.h"
    

    Natürlich alles mit include guards. Nun kriege ich aber komische Compile Fehler:

    1>i:\programmierung\jump n run\jumpandrun.h(22): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'world'
    1>i:\programmierung\jump n run\jumpandrun.h(22): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
    1>i:\programmierung\jump n run\jumpandrun.h(22): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.

    Kommt doch von header dateien die sich gegenseitig includen oder? Wie würdet ihr das machen?

    Die Welt besteht aus einzelnen "tiles", das sind die Blöcke aus denen die Welt besteht, sind auch in einer Klasse gekapselt. Sind in nem Array in World:

    Tile* Tiles[tileX][tileY];
    

    Wenn diese Tiles jetzt aber Zugriff auf dieses Array brauchen, zum Beispiel um zu erfahren was eine Art Tile unter ihnen liegt, wie macht ihr das? Weil World is ja in der Klasse JumpAndRun definiert und JumpAndRun in main(), also soll ich Tile die World mitgeben, zu der sie gehören und dann mit get() und set() methoden kommunizieren oder soll ich die die Instanz von JumpAndRun global anlegen sodass alle anderen Klassen wenn sie was brauchen darüber Zugriff haben?



    Dieses Design solltest du nochmal überdenken und nur die Header einbinden, die an der jeweiligen Stelle tatsächlich gebraucht werden - abgesehen davon, daß du dir solche Problem damit ersparst, reduzierst du damit die Abhängigkeiten zwischen den Modulen (d.h. du mußt nur die Klassen neu übersetzn, die von den Code-Änderungen auch betroffen sind.
    Für die Fälle, wo zwei Klassen sich gegenseitig kennen müssen, benötigst du auf einer der Seiten eine Forward-Deklaration.

    zu Teil 2 kann ich jetzt nichts sagen.



  • Vielleicht kannst du dein Problem mit Vorwärtsdeklaration lösen. Wenn nicht, musst du deine Header umstrukturieren. Auf jeden Fall darf ein gegenseitiges Einbinden der beiden Header nicht vorkommen.

    http://www.c-plusplus.net/forum/p1993089#1993089



  • Ok das erste Problem habe ich mit forward Deklarationen in den Griff bekommen, einer ne Idee zum zweiten? 🙂

    Und danke für den Tipp!



  • Da gibt es verschiedene Möglichkeiten:

    1. Design ändern -> Die Funktionen, die mehrere Tiles brauchen, werden von World erledigt
    2. Array im Konstruktor mitgeben
    3. Array global zugänglich machen (nicht so gut)

    Außerdem würde ich einen std::vector<std::vector<shared_ptr<Tile> > > oder so nehmen.


Anmelden zum Antworten