Mitteilung an eine Klasse



  • Nein, nicht wirklich. Du darfst das Objekt nicht manuell löschen, solange es von einem der shared_ptr verwendet wird. Das reicht normalerweise aus, um zu verhindern, daß deine Bild-Objekte mit ungültigen Daten hantieren.

    Wenn du wirklich alle angeschlossenen Bild-Objekte benachrichtigen willst, wenn sich irgendwas an dem BildData ändert, mußt du vermutlich mehr Aufwand betreiben. Da hilft vermutlich so etwas.



  • Das könnte man dann mithilfe von Signals: http://www.boost.org/doc/libs/1_46_1/doc/html/signals.html realisieren, oder? Wenn BildData gelöscht wurde gibt es ein Signal aus, auf das dann das passende Bild reagiert.



  • Ja, signals eignen sich zur Umsetzung dieses Patterns hervorragend.



  • Okay, danke dann mach ich mich mal ran. Wenn weitere Fragen auftauchen poste ich hier nochmal und auch dann, wenn ichs geschafft habe.



  • Eisflamme schrieb:

    Ja, signals eignen sich zur Umsetzung dieses Patterns hervorragend.

    Da melde ich mal Zweifel an.



  • volkard schrieb:

    Eisflamme schrieb:

    Ja, signals eignen sich zur Umsetzung dieses Patterns hervorragend.

    Da melde ich mal Zweifel an.

    Und welche Alternative gäbe es da?



  • Razoron schrieb:

    Und welche Alternative gäbe es da?

    Weiß nicht. Um genau zu sein, habe ich keine Ahnung, warum man vorzeitig Löschen will. Wenn ein Fremdling noch einen smart pointer auf das Objekt hält, dann hat der auch seinen Grund dafür.
    Aber will man, daß jeder das Objekt löschen kann, gibt ihm doch ne lösch-Methode.
    Oder mach Zeiger auf smartpointers, dann jeder auf DEN smartpointer zugreigen und ihn releasen.



  • Könnte man auch über weak_ptr lösen, so wie ich das verstanden habe. 😉



  • Ich hab nur gesagt, Observer-Pattern lässt sich mit signals gut umsetzen. Ob seine Methode an sich Objekte vorher löschen zu wollen angebracht ist, ist eine andere Frage. 🙂



  • Eisflamme schrieb:

    Ich hab nur gesagt, Observer-Pattern lässt sich mit signals gut umsetzen. Ob seine Methode an sich Objekte vorher löschen zu wollen angebracht ist, ist eine andere Frage. 🙂

    Ah, ok. Hab das "Observer" total überlesen und dachte, es sei ein konkreter Tip für diese Bitmaps.



  • Irgendwie Zweifel ich ja die ganze Konstruktion etwas an. Für ein Bild sollte so etwas essentielles wie seine Bilddaten direkt bei der Konstruktion mitgegeben werden. Genauso wie man einen Konstruktor machen sollte das man BildData direkt so erstellen muss:

    BildData* data = new BildData("bild.format");
    

    Wenn Bild BildData anlegt, kann es sich entscheiden wann es das nicht mehr braucht und direkt wieder freigeben. RAII is ne tolle Sache.

    Aber prinzipiell ist der Typ mit den smart pointern wohl auch ne Lösung, je nachdem was du machen willst vielleicht sogar die Bessere...



  • Hi,

    ich habe eine Klasse namens Bild und eine Klasse namens BildData. Die Klasse Bild dient dazu, ein Bild anzuzeigen, BildData lädt/speichert Bilder und manipuliert diese. Aber was soll die Klasse Bild anzeigen? Die Daten aus der Klasse BildData. Also macht es Sinn, dass Bild von BildData erbt, das klappt auch super.

    Wenn die Klasse "Bild" ein Bild anzeigen soll, dann wäre als Name besser "BildAnzeiger" geeignet. Die Klasse BildData sollte in zwei Klassen zerlegt werden: BildLeserSchreiber und Bild. Manipulatoren sollten eigene Klassen sein, die mit Bildern arbeiten. Und - aber das ist jetzt mein persönlicher Geschmack - liest sich der Code mit englischsprachigen Bezeichnern besser.

    Ergebnis wäre etwas in der Art:

    class ImageViewer
    {
    public:
    ...
        void displayImage(Image& img);
    ...
    };
    
    class ImageReaderWriter
    {
    public:
    ...
        void writeImage(Image& img, Destination& dest);
        Image readImage(Source& src);
    ...
    };
    
    class UnaryManipulator
    {
    public:
        virtual void operator()(Image& src) = 0;
    };
    

    Es ist dann zu überlegen, ob Dein Image immer denselben Datentyp (z.B. unsigned char) verarbeitet, oder ob verschiedene vorkommen (RGB) können. Dann wäre es wahrscheinlich sinnvoll, Image als Template-Klasse zu entwerfen.

    Als Idee kannst Du mal hier: http://ltilib.sourceforge.net/doc/homepage/index.shtml nachschauen


Anmelden zum Antworten