Schreib/Lese-Zugriffsklassen



  • Hi,

    ich habe eine Klasse mit Daten, die in einer bestimmten Form vorliegen, die erstmal funktioniert.

    Jetzt möchte ich gerne eine andere Klasse Accessor definieren, welche Schreib/Lesezugriffe auf diese Klasse über ein bestimmtes Format gewährleistet. Das ist also eine Art Wrapper, der auf der Klasse aufsetzt.

    Mein Problem: Diese Klasse hat Schreibe- und Lesezugriffe. Die Schreibzugriffe funktionieren aber natürlich nur mit einem nicht-konstanten Datenobjekt. Wie löse ich es, dass jetzt je nach Paramertyp beides geht? Oder soll ich zwei Klassen machen und das vererbungstechnisch aufbauen wie iostream?

    Hier etwas Code:

    class DataObject
    {
        // ...
    };
    
    class Accessor
    {
    public:
        Accessor(DataObject& object);
    
        void WriteViaFormat(const std::string& message);
        std::string ReadInFormat() const;
    
    private:
        DataObject* object;
    };
    
    int main()
    {
        const DataObject a;
        DataObject b;
    
        Accessor accessorA(a);
        std::string message1 = a.ReadViaFormat(); // soll gehen
        a.WriteViaFormat("<tag>Message</tag>"); // das soll natürlich Kompilierfehler geben
    
        // der Accessor auf b angewandt soll jedoch ReadViaFormat und WriteViaFormat akzeptieren
    }
    

    Wie löst man so was? Zwei Accessoren draus machen (ReadAccessor, WriteAccessor) und dann einen WriteReadAccessor von beiden erben lassen?

    Besten Gruß und vielen Dank,
    Eisflamme



  • Ich würde tatsächlich zwei verschiedene Interfaces definieren ( Accessor und Manipulator ). Ein Accessor hört sich nach meinem Verständnis nach etwas an, das nur lesend auf etwas zugreifen möchte. Möglicherweise ergibt es sogar Sinn, Manipulator von Accessor erben zu lassen, da er über die gleichen Zugriffsrechte wie ein Accessor verfügt, aber zusätzlich das Objekt sogar ändern darf. Geht natürlich nicht, wenn in deinem Szenario ein Manipulator ein Objekt verändern, aber nicht lesen darf.



  • Stimmt, das ergibt Sinn. Hm, aber mir ist Accessor als Leser noch nicht klar genug, ich finde, das kann man auch missverstehen. Vll. einfach Reader und Writer? Wobei das ein wenig sehr nach "Text" klingt. Ich will noch andere Reader/Write schreiben, welche aber ein anderes Format (nicht Text) haben, da fände ich irgendeinen Oberbegriff fein. Oder ist read/write eigentlich doch eindeutig?

    Edit: Obwohl, eigentlich Accessor vs. Manipulator doch recht üblich, jedenfalls ergab das eine kurze Googlesuche. Dann mache ich das Mal so. 🙂



  • Wo ist da genau der Vorteil gegenüber freien Funktionen?

    void WriteViaFormat(DataObject& d, const std::string& message);
    std::string ReadInFormat(DataObject const& d);
    


  • Die Klassen können einen Zustand haben und können beispielsweise Caching unterstützen.


Log in to reply