Programmiertechnische Frage



  • Hallo! (Hi Deus...Vorsorge ist besser als Nachsorge :))
    Also angenommen ich habe ein Programm, indem ich Objekte auswählen kann (Kreis, Rechteck, Schrift) etc...diese kann ich dann auf eine Fläche ziehen...wie man es eben von Paint zB kennt...ich dachte mir, man leitet all diese Objekte zum Beispiel von CDrawOb ab. Nun kann man ja die verschiedenen Objekte anwählen, und auf der Malfläche benutzen, indem man klickt und dann die Größe des Kreises zieht. Nun soll beim Klicken abgefragt werden, welches Objekt erstellt werden soll. Man könnte nun beim Klick auf Kreis eine globale Variabel setzen DWORD SelOb = SEL_CIRCLE; und dann
    if(SelOb = SEL_CIRCLE)
    CDrawOb *ob = new CCircle;
    jedoch will ich, dass wenn ich auf Circle klicke, direkt dem Programm gesagt wird, welche Klasse er an dieser Stelle neu erstellen muss, Pseudocode:

    class selectedclass = null;
    if(click CircleObject)
    selectedclass = CCircle
    if(click Rect)
    selectedclass = CRect

    und dann beim Erstellen eines Objektes einfach:
    CDrawOb *ob = new selectedclass;

    ist das evtl. mit Templates o.Ä. möglich?

    Danke,
    Gruß,
    Kevin!



  • Surkevin schrieb:

    class selectedclass = null;
    if(click CircleObject)
    selectedclass = CCircle
    if(click Rect)
    selectedclass = CRect
    CDrawOb *ob = new selectedclass;

    ich würd's eher so machen:
    CDrawOb *ob;
    if(click == CircleObject)
    ob = new CCircle();
    else if(click == Rect)
    ob = new CRect();
    else if (....
    ...
    ...
    ob->draw(); // polymorphie

    oder mit switch/case wenn's viele mehr sind.
    mit templates? weiss nicht, ob das was bringt. vielleicht speed?



  • Um die Abfragen kommst du wohl nicht herum. Außer, du erstellst direkt beim klicken das Objekt und setzt es dann nachträglich auf die Zeichenfläche.
    Glaube aber nicht, dass das sinnvoll, ist, bzw. ob du dann beim aufziehen wirklich auf die Typinformationen verzichten kannst.
    Und bitte lass das SCHEI** C-Präfix weg. 🙄



  • Optimizer schrieb:

    bzw. ob du dann beim aufziehen wirklich auf die Typinformationen verzichten kannst.

    hat c++ nicht sowas wie 'instanceof'?
    rtti, ne?



  • Nur ist es so, dass jedes Objekt auf der Zeichenfläche später nochmal geändert werden soll. D.h. alle Objekte haben ein zugehörige Instanz, die alle von CDrawOb (sorry für das C 😉 abgeleitet worden sind... wenn ich jetzt auf Circle klicke, könnte ich zwar direkt ein neues Objekt erstellen, und beim tatsächlichen Klicken auf die Malfläche dieses verwenden, jedoch wenn ich nochmal ein solches Objekt erstellen möchte? Markieren, dass das "alte" erstellte ungültig ist und ein neues erstellen?

    Danke,
    Gruß,
    Kevin



  • Surkevin schrieb:

    ...wenn ich jetzt auf Circle klicke, könnte ich zwar direkt ein neues Objekt erstellen, und beim tatsächlichen Klicken auf die Malfläche dieses verwenden, jedoch wenn ich nochmal ein solches Objekt erstellen möchte? Markieren, dass das "alte" erstellte ungültig ist und ein neues erstellen?

    vielleicht solltest du neu erstellte objekte in'nem container speichern, std::vector oder sowas. ich nehme mal nicht an, du brauchst nicht nur einen einzigen kreis?
    btw: wenn du die objekte in 'vector' speicherst, brauchst du dich auch nicht grossartig ums löschen zu kümmern, weil 'vector::erase' automatisch die destruktoren aufruft.


Anmelden zum Antworten