Objekt in einer Klasser erstellen, oder Vererben?



  • Hallo Leute,
    ich hoffe ich bin hier richtig, bei den ganzen Foren hier, bin ich mir nie so sicher wohin ich damit soll.

    Also zum Problem:

    Ich bin in C++ noch lange kein Spezialist, wollte aber ein kleines Testspiel das ich mit SDL gemacht habe, gerne objektorientiert machen.

    C_GameApplication::C_GameApplication ()
    {
    	C_Map Map;
    
    	windowHigh = Map->tilesize * Map->mapHigh;
    	windowWidth = Map->tilesize * Map->mapWidth;
    }
    

    Also ich denke das ist doch Möglich einfach da das Objekt zu erstellen, und es dann auch dementsprechend zu benutzen?

    Oder wäre es besser wenn man es einfach vererbt, und somit zugreifen kann?

    Fehlermeldung:

    gameApplication.cpp: In constructor »C_GameApplication::C_GameApplication()«:
    gameApplication.cpp:23: Fehler: Basisoperand von »->« hat Nicht-Zeiger-Typ »C_Map«
    gameApplication.cpp:23: Fehler: Basisoperand von »->« hat Nicht-Zeiger-Typ »C_Map«
    gameApplication.cpp:24: Fehler: Basisoperand von »->« hat Nicht-Zeiger-Typ »C_Map«
    gameApplication.cpp:24: Fehler: Basisoperand von »->« hat Nicht-Zeiger-Typ »C_Map«
    

    Zeile 23 und 24: Sind die Zeilen wo ich windowHigh und windowWidth definieren will.

    Wäre super wenn mich da jemand aufklären könnte.

    mfg Darian



  • Die Fehlermeldung besagt nur, dass es sich bei 'Map' um ein Objekt handelt, du es aber wie einen Zeiger behandelst. Das sieht man an dem '->' Operator, der bei Zeigern angewendet wird, um Zugriff auf Elmente des Objekts zu erhalten.

    Mache daraus Map.titelsize

    Merke: Verwende '.' bei Objekten, und verwende '->' bei Zeigern.

    Wenn C_Map ein Zeiger werden soll, dann erstelle es so:

    C_Map* map = new C_Map;



  • Argh stimmt, da war ich wohl mit meinen Gedanken wieder ganz wo anders. Vielen Dank für den Hinweis.

    Dann ergab sich aber ein neues Problem. Das ist etwas was ich sowieso schon einmal fragen wollte.

    Wenn ich im header eine const benutze, kommt sowas beim Kompilieren:

    Fehler: ISO-C++ verbietet Initialisierung des Elementes »mapHigh«
    map.h:45: Fehler: »mapHigh« wird statisch gemacht
    

    Also habe ich diese const einfach im Konstruktor definiert, was auch funktioniert hat.

    Dann kann ich aber nicht mehr mit Map.mapHigh darauf zugreifen, weil es dieses Element dann nicht gibt in dem Objekt.

    Wie arbeitet ihr mit const dann? Oder gibt es sowas bei Klassen nicht?

    Und wie siehst du das mit dem Objekt in der Klasse verwenden, oder Vererben?

    lg aus Guatemala, und danke für die Infos
    Darian

    Edit: Die Map ist in einem Array gespeichert: int map[mapHigh][mapWidth]; das funktioniert aber auch wieder nicht. Variable Größen können nicht initsialisiert werden?

    Wie würdet ihr das dann machen?



  • 1. Beispiel zu const:

    class TestClass
    {
    private:
    	static const int HUHU_CONST;
    };
    

    Dann folgt irgendwo im Code-File (cpp):

    #include "TestClass.h"
    const int TestClass::HUHU_CONST = 5;
    

    Bin mir da aber nicht wirklich sicher, hab's nur irgendwie
    so in Erinnerung. Gibt aber noch andere Möglichkeiten...

    2. Komposition ist der Vererbung vorzuziehen.
    Bedeutet: Meist ist es besser oder schöner, ein Objekt
    statt Vererbung zu benutzen, wenn Du Dir diese Frage stellst.
    Natürlich kommt das aber auch immer etwas darauf an,
    um was für Klassen es sich dabei handelt. 🙂

    Da hilft manchmal auch das folgende Prinzip etwas:
    Was trifft zu?
    Ein Game hat eine Map -> Komposition
    Ein Game ist eine Map -> Vererbung

    Nun kannst Du selbst entscheiden, was eher zutrifft. 😉



  • Hallo, danke dir, du hast das wirklich fein erklärt.

    Obwohl ich schon dachte ich werde verrückt, weil vorher ein bisschen was anderes gestanden ist (habe erst später gecheckt dass du editiert hast)

    Die anderen Möglichkeiten würden mich da schon noch interessieren, gibt es da vielleicht eine Übersicht irgendwo im Internet?

    Muss es denn auch static sein??
    Und muss ich in der .cpp const int noch einmal angeben? Weil das wurde ja schon im Header klar definiert?

    Kurz zum Spiel:

    Es handelt sich dabei einfach um eine kleine Map, man mit einem Smily alle Kristalle einsammelt. In der Map gibt es Mauern und Gänge.

    Ich wollte als Übungszweck das ganze für OOP umbauen, und dann vielleicht noch mehr ausbauen, sehen wir dann noch was. 🙂

    map.h ...hier wird Map generiert und Grafiken dafür eingelesen
    player.h ... hier wird player Status und Player Bewegung gemacht
    GameApplication ... dachte hier an den GameLoop

    Tja, recht viel mehr kann ich mir wegen Mangel an Erfahrung noch nicht darunter vorstellen, darum muss ich einfach mal darauf los Coden.

    Aber ich denke mit Komposition in die GameApplication passt das schon.

    lg aus Guatemala
    Darian



  • Obwohl ich schon dachte ich werde verrückt, weil vorher ein bisschen was anderes gestanden ist (habe erst später gecheckt dass du editiert hast)

    Jopp, habe zuerst etwas falsches geschrieben und dann erst gemerkt. Sorry. 😉

    Die anderen Möglichkeiten würden mich da schon noch interessieren, gibt es da vielleicht eine Übersicht irgendwo im Internet?

    Such einfach mal in Google nach c++ Konstanten (in Klassen).
    Da solltest Du recht schnell auf einige Möglichkeiten stossen.

    Und muss ich in der .cpp const int noch einmal angeben? Weil das wurde ja schon im Header klar definiert?

    Im Header ist es deklariert, aber nicht definiert.
    Wenn die Konstante in einer Klasse ist, darf sie nicht direkt
    in der Klassendeklaration definiert werden. ^^

    Zum Spiel:
    Jopp, sollte passen. 🙂
    Überlege halt immer, was für Dinge es in dem Spiel gibt
    und wie sie zu einander stehen. (Ist-ein, Hat-ein)

    Ansonsten empfehle ich das openbook von Galileo, falls Du es noch nicht kennst:
    http://www.galileocomputing.de/openbook/oo/



  • Hi,

    ok passt, werde suchen, weil irgendwo kompiliert die Möglichkeit von dir nicht richtig bei mir. Vielleicht liegt es daran weil ich unter Linux arbeite, und mit gcc arbeite.

    Werde aber mal googeln, und da komme ich sicher auf Ergebnisse.

    Feine Sache, das Buch kannte ich nämlich noch nicht, ich denke das wird so ein Fall vollständigen lesen.

    Und bezüglich deklarieren und definieren, habe ich verwechselt 😉

    Jedenfalls danke dir, ich denke jetzt dürfte ich wieder einen gewaltigen Schritt weiter kommen.

    lg aus Guatemala
    Darian



  • Hallo Leute,

    jetzt funktioniert es, aber eben mit einer anderen Möglichkeit.

    Header:

    class TestClass {
    	public:
    		const int KONST;
    		const int KONST2;
    		TestClass();
    
    };
    

    cpp Datei

    #include "class.h"
    #include <iostream>
    
    TestClass::TestClass() : KONST(5), KONST2(15)
    {
    
    	std::cout << KONST;
    	std::cout << KONST2;
    
    }
    

    Danke dann für eure Hilfe.

    lg aus Guatemala
    Darian



  • Hallo Leute,

    ich dachte da dieses Thema doch hier noch anknüpft, schreibe ich es hier.

    Ich möchte jetzt gerne einen Array für die Map benutzen, nur weiß ich jetzt noch nicht wie.

    Header Datei:

    const int mapHigh, mapWidth;
    int map[mapHigh][mapWidth];
    

    Das geht leider nicht, weil die Konstanten mapHigh und mapWidth erst in der Definition einen Wert erhält.

    C_Map::C_Map () : mapHigh(10), mapWidth(10)

    Wie würdet ihr das machen, int map[][] funktioniert auch nicht, wie kann ich das richtig deklarieren bzw. dann definieren?

    Würde mich um Infos freuen.

    mfg Darian


Anmelden zum Antworten