GUI-Klasse (Ableitung/Rein Virtuelle Funktionen!)



  • Hallo
    Ich programmiere gerade an einer GUI Klasse für ein kleines Spiel.
    Ich hab mir bereits Gedanken darüber gemacht, aber wollte nur mal die C++ Experten ob man das OOP mässig genehmigen kann bzw ob da jemand Verbesserungsvorschläge hat!
    Also die Basisklasse ist:

    class CElement{
    public:
    CElement();
    ~CElement();
    virtual int GetClassType()=0;
    virtual void OnMouse(MouseEvent)=0;
    virtual void OnKeyboard(KeyboardEvent)=0;
    Vec2D GetSize();
    Vec2D GetPos();
    };
    

    Es geht weiter 🙂
    Jetzt leite ich die Button klasse davon ab

    class CButton: public CElement{
    public:
    CButton();
    ~CButton();
    virtual int GetClassType();  //gebe KlassenID zurück
    virtual void OnMouse(MouseEvent); //was macht CButton mit der Maus
    virtual void OnKeyboard(KeyboardEvent); //was macht CButton mit dem Keyboard
    };
    

    Außer CButton gibt es noch viele andere Klassen.
    Jetzt Hab ich in meinem CWindow ne Liste mit CElement.
    Erst hol ich mir das CElement:

    CElement *myEle=&myButton; //hab erstmal die Grundfunktionen
    if(myEle->GetClassType()==CBUTTONCLASSTYPE)
    //führe Funktionen für diese Klasse aus etc..
    myButton.foo();
    

    Stimmt das so vom vorgehen aus. Kann man was verbessern oder hab ich irgendwelche C++ Spezifischen Sachen vergessen.
    Der Code soll übrigens C++ ISO Standard sein. Also bitte keine MS Compiler sachen posten 🙂
    Danke im voraus
    stealth00



  • ich schätze statt des 'GetClassType()' kannst du auch 'rtti' (typeid, typeinfo) verwenden. das hat c++ schon eingebaut und muss man nicht selber programmieren. ansonsten finde ich das mit der virtuellen basisklasse für alle gui-klassen ok. aber warte besser bis die richtigen c++ spezis hier was dazu sagen 😉



  • finger weg von RTTI wenn du ein game-codest! RTTI ist mega lam



  • --- schrieb:

    finger weg von RTTI wenn du ein game-codest! RTTI ist mega lam

    sicher? und wenn wie mal nicht an dynamic_cast oder typeid(x).name() denken, sondern an den op== auf typeids? würde mich wundern, wenn de rlahm wäre. er bräuchte doch bloß die beiden vptrs zu vergleichen.



  • warum nicht gleich der basisklasse ne virtuelle methode geben, die button-sachen machen kann, aber nix macht. und in buttonklassen wird sie redefiniert, so daß sie was macht.
    dann kannste diese methode auf jedem element einfach aufrufen. ist das element ein button, tut er das richtige, ist er kein button, tut er nix.



  • volkard schrieb:

    warum nicht gleich der basisklasse ne virtuelle methode geben, die button-sachen machen kann, aber nix macht. und in buttonklassen wird sie redefiniert, so daß sie was macht.
    dann kannste diese methode auf jedem element einfach aufrufen. ist das element ein button, tut er das richtige, ist er kein button, tut er nix.

    Irgendwie hört sich das falsch an. Mir fällt jetzt leider kein gutes Beispiel ein,
    um dieses falsch zu beschreiben.
    Ich würde eher vorschlagen von CElement (wofür steht das C?) eine weitere
    Klasse z.B. abstractButton abzuleiten, und von dieser dann die verschiedenen
    Buttons abzuleiten.


Anmelden zum Antworten