Datankapselung als Stolperstein



  • Hallo,

    ich habe eine Klasse nach folgendem Muster

    class B
    {
      private:
    
        double test;
    
      public:
    
        void SetTest(double test);
        double GetTest();
    }
    
    class A
    {
      private:
    
        B testb;
    
      public:
    
        B GetB() const;
        SetB(const &B test);
    }
    

    Datenkapselung schön und gut.. bei mir kommt es aber vor dass ich von außen über A test setzen möchte...

    Entweder implementiere ich mir in A ein

    B &SetB()
    

    was dann im Zugriff total hässlich aussieht:

    objectA.SetB().SetTest(1234.0);
    

    oder ich muss mir jede Methode einzeln kapseln.. was auch nicht sein sollte.

    Sobald A von B ableite und das private in B in protected umbenenne, bekomme ich ein problem mit Basisklassen. A und B sind abgeleitete Klassen von C... Compiler meldet mehrdeutige Elemente und ich habs dann gelassen.

    Gibt es ein Vorgehen um so etwas schön zu konstruieren?



  • class A
    {
    public:
        B& GetB();  // gib mir dein B und lass es mich verändert (so wie ich will)
        SetTest(double test);  // who the f*ck is B??
        SetB(const B& b);  // nimm dies
    };
    

    Sinnvoll kann man das nur entscheiden, wenn man weiß was A, B und C ist. Aber eine Vererbung einzubauen, um das zu ermöglichen ist mit Sicherheit der schlechteste Weg.



  • Du meintest es gäbe Probleme mit Mehrdeutigkeiten wenn du A von B ableiten lässt, da beides Unterklassen von C sind. Doch wieso lässt du A denn überhaupt weiterhin von C ableiten, wenn du das alles über B bekommst? Lässt du A von B ableiten, brauchst du A doch nicht nochmal von C ableiten lassen.

    Falls das nicht geht weil A zu einer Hierarchie gehört deren Basis von C Ableitet und du das nicht ändern darfst, könntest du ja mal ein wenig nach "virtueller Vererbung" googlen. Vielleicht bekommst du ja so den kram mit den Mehrdeutigkeiten in den Griff

    cu


Anmelden zum Antworten