Zugriff auf private Membervariablen aus Memberobjekt?



  • Hallo,
    ich habe das Problem, dass ich von einem Memberobjekt aus auf andere private Membervariablen Zugreifen muss. Ungefähr so:

    class foo1
    {
    
    //von hier aus braucht man Zugriff auf Zahl
    
    };
    class foo2
    {
      private:
      foo1 objekt;
      int Zahl;
    
    };
    

    Ich habe das erst mit einem This Zeiger von foo2 an foo1 versucht... aber auch der erfordert, dass int Zahl public ist. Da objekt aber ein Member von foo2 ist sollte es doch auch eine Möglichkeit geben, dass irgendwie zu regeln.
    Oder geht das einfach nicht ?

    Danke



  • ist doch bescheuert was du versuchst 🙄 (sorry)

    grade dafür das man sowas nicht macht gibs doch "private"

    wenn du von anderen klassen auf ein attribut der anderen klasse zugteifen willst, würde sich imo ein public static anbieten.



  • immigrant schrieb:

    würde sich imo ein public static anbieten.

    Wieso denn ein static ??? Das hat doch hiermit gar nichts zu tun.

    Anstatt die Instanzvariable aber gleich public zu machen und dadurch
    jedem direkt zugänglich, kannst du dir noch überlegen, eine
    entsprechende getter-Methode zu schreiben.

    Soweit ich mich noch an C++ erinnere, gibt es da auch noch die Möglichkeit,
    eine Klasse(Methode?) als friend relativ zu einer anderen zu
    deklarieren und somit auch Zugriff zu erhalten. Hab aber keine Ahnung
    mehr, wie das geht.



  • Javaner schrieb:

    Wieso denn ein static ??? Das hat doch hiermit gar nichts zu tun.

    aso sorry, da hab ich wohl wieder zu viel php gefrickelt 😉

    (da muss man das static keyword benutzen damit man auf member, von außerhalb der klasse, zugreifen kann

    class foo
    {
       public static $bar = 5;
    }
    
    print foo::$bar;
    

    )

    naja wie auch immer friendships oder was du gesagt hast gibst da sowieso net :p



  • immigrant schrieb:

    ist doch bescheuert was du versuchst 🙄 (sorry)

    grade dafür das man sowas nicht macht gibs doch "private"

    Privat ist doch dafür, dass man von außerhalb der KLasse keinen Zugriff auf die entsprechenden Resourcen hat.
    Ich möchte aber, dass ein Objekt von "innerhalb" der Klasse (ist ja ein Member) Zugriff auf die Resourcen bekommt... was theorethisch doch zu schaffen sein sollte.
    Klar ist mein Beispiel etwas daneben, da man mit der Klasse foo1 auch Objekte außerhalb von foo2 erstellen könnte... aber das will ich gar nicht. Jetzt bräuchte ich halt nur den richtigen Weg, wie man das was ich möchte anstelle... man kann ja schlecht foo1 in foo2 deklarieren.. oder?



  • shlogon schrieb:

    immigrant schrieb:

    ist doch bescheuert was du versuchst 🙄 (sorry)

    grade dafür das man sowas nicht macht gibs doch "private"

    Privat ist doch dafür, dass man von außerhalb der KLasse keinen Zugriff auf die entsprechenden Resourcen hat.
    Ich möchte aber, dass ein Objekt von "innerhalb" der Klasse (ist ja ein Member) Zugriff auf die Resourcen bekommt... was theorethisch doch zu schaffen sein sollte.
    Klar ist mein Beispiel etwas daneben, da man mit der Klasse foo1 auch Objekte außerhalb von foo2 erstellen könnte... aber das will ich gar nicht. Jetzt bräuchte ich halt nur den richtigen Weg, wie man das was ich möchte anstelle... man kann ja schlecht foo1 in foo2 deklarieren.. oder?

    Kann man schon, aber ist das vermutlich nicht, was du willst. Versuch mal das hier:

    class foo2
    {
       ...
    
       friend class foo1;
    };
    


  • a) zahl bei Aufrufen übergeben
    b) getZahl() einbauen
    c) Wenn getZahl() nicht public sein soll, dann als friend deklarieren

    MfG SideWinder



  • Z2 schrieb:

    Kann man schon, aber ist das vermutlich nicht, was du willst. Versuch mal das hier:

    class foo2
    {
       ...
    
       friend class foo1;
    };
    

    Du hast recht... daswill ich wahrscheinlich nicht... die Idee an sich hört sich schon recht unübersichtlich an 🙄
    Dann werde ich mal das mit friend in Angriff nehmen.. ich stelle mir das so vor:

    class foo1
    {
    
      foo2 * mPFoo2;
      public:
      foo1(foo2 * pFoo2):mPFoo2(pFoo2);
      int Test(){return mPFoo2->Zahl};
    
    };
    class foo2
    {
      friend class foo1;  
      private:
      foo1 objekt(this);
      int Zahl;
    
    };
    

    Ist das so korrekt... bzw kann man das besser machen?
    Danke

    EDIT:@Sidewinder
    Die Zahl bei Aufrufen übergeben funktioniert nicht ganz, dasich das Objekt (welches einen Thread startet) ja immer die aktuelle Zahl holen muss.
    Eine "GetZahl" readonly Methode hört sich aber auf jeden Fall besser an.



  • shlogon schrieb:

    immigrant schrieb:

    ist doch bescheuert was du versuchst 🙄 (sorry)

    grade dafür das man sowas nicht macht gibs doch "private"

    Privat ist doch dafür, dass man von außerhalb der KLasse keinen Zugriff auf die entsprechenden Resourcen hat.
    Ich möchte aber, dass ein Objekt von "innerhalb" der Klasse (ist ja ein Member) Zugriff auf die Resourcen bekommt... was theorethisch doch zu schaffen sein sollte.

    Nein - du bist außerhalb deiner Klasse (foo1 ist komplett unabhängig von foo2)

    Klar ist mein Beispiel etwas daneben, da man mit der Klasse foo1 auch Objekte außerhalb von foo2 erstellen könnte... aber das will ich gar nicht. Jetzt bräuchte ich halt nur den richtigen Weg, wie man das was ich möchte anstelle... man kann ja schlecht foo1 in foo2 deklarieren.. oder?

    Wozu benötigst du überhaupt 2 Klassen? Pack doch alle notwendigen Arbeitsmethoden direkt in die foo2 rein, dort hast du auch vollen Zugriff auf die Elemente.



  • CStoll schrieb:

    Nein - du bist außerhalb deiner Klasse (foo1 ist komplett unabhängig von foo2)

    Es geht mir aber um das Objekt von foo1 ... und das ist eben in der Klasse!
    Das die Klasse foo1 diesbezüglich nicht ganz richtig implementiert ist haben wir ja schon weiter oben festgestellt

    Wozu benötigst du überhaupt 2 Klassen? Pack doch alle notwendigen Arbeitsmethoden direkt in die foo2 rein, dort hast du auch vollen Zugriff auf die Elemente.

    Nun ja.. foo2 ist quasi eine Verwaltungsklasse, die Daten sammelt und eine einheitlich Schnittstelle auf/für viele andere Modulklassen (unter anderem foo1... aber auch foo3 etc) darstellt.
    Da diese Module dabei auch unabhängig voneinander mit verschiedenen Algorithmen arbeiten, hielt ich eine Aufteilung in Unteklassen sehr sinnvoll.

    Nun ja...hilfreich wäre trotzdem eine Antwort, ob das von mir geschriebene Bsp (mit friend) so nun korrekt ist, danke.



  • shlogon schrieb:

    CStoll schrieb:

    Nein - du bist außerhalb deiner Klasse (foo1 ist komplett unabhängig von foo2)

    Es geht mir aber um das Objekt von foo1 ... und das ist eben in der Klasse!

    Ja, in der Klasse foo1 😉 (die defaultmäßig gar nichts mit foo2 zu tun hat).

    Wozu benötigst du überhaupt 2 Klassen? Pack doch alle notwendigen Arbeitsmethoden direkt in die foo2 rein, dort hast du auch vollen Zugriff auf die Elemente.

    Nun ja.. foo2 ist quasi eine Verwaltungsklasse, die Daten sammelt und eine einheitlich Schnittstelle auf/für viele andere Modulklassen (unter anderem foo1... aber auch foo3 etc) darstellt.
    Da diese Module dabei auch unabhängig voneinander mit verschiedenen Algorithmen arbeiten, hielt ich eine Aufteilung in Unteklassen sehr sinnvoll.

    Nun ja...hilfreich wäre trotzdem eine Antwort, ob das von mir geschriebene Bsp (mit friend) so nun korrekt ist, danke.

    Prinzipiell ja, aber wenn du noch mehrere Arbeitsklassen hast, ist das eventuell der falsche Ansatz - du müßtest für jede neue Modulklasse eine friend-Definition ergänzen. Da ist es eventuell besser, deine Sammlungsklasse irgendwo anzulegen, wo nur die Steuerklassen Zugriff haben (z.B. im protected-Bereich einer gemeinsamen Basisklasse):

    class mod_base
    {
    protected:
      struct data
      {
        ...
        //komplett public - die Klasse ist sowieso nur von mod_base und seinen Nachkommen verwendbar
      };
    };
    
    class modul1 : public mod_base
    {
      ...
    };
    


  • Danke für deinen Vorschlag... aber ich glaube ich habe ihn bezüglich meines Aufbaus nicht ganz verstanden. Bläht denn die Vererbung die einzelnen Modulklassen nicht zusätzlich auf? Und Inwiefern kann die Klasse "Mod_base" denn noch überhaupt die Objekte verwalten.. diese befinden sich ja gar nicht mehr in Mod_Base.

    Entweder fehlt mir hier allgemeines Verständniss.. oder ich habe meine Anforderung undeutlich formuliert. Zur Zeit muss ich diese eh etwas ändern, weil ich auf Grund des Threadings jetzt Probleme mit nicht MT kompatiblen Bibliotheken habe(vorher war der Output direkt in den Modulen).. so sieht mein Modell jetzt aus.. mit verstaendlicheren Namen:

    class Verwaltung
    {
    public:
      friend class ModulA;
      friendclass ModulB;
      void Update(); //schaut u.a. nach ob es bei den Modulen etwas neues gibt 
      //Input von sonstwo... wird in Daten geschrieben
      //Output wird bei den Modulen abgefragt und ggf sonstwo ausgegeben
      private:
      ModulA AObj;
      ModulB BObj;
      //etc
      struct Daten{
      //Daten auf Abruf bereit (per get Funktion) für die Module
      }
    };
    
    class ModulA
    { 
    // startet einen Arbeitsthread und holt sich Daten regelmäßig vom Verwalter (über den Pointer auf das Verwalterobjekt)
    // berechnete Daten werden für den Verwalter bereitgehalten
    };
    //analog ModulB etc
    

    Jetz weiß ich nicht ganz wo ich hier mit Vererbung ansetzen soll (mal davon abgesehen dass ich den Modulen eine Oberklasse gegeben habe, der mehr oder weniger den Schnittstellenkram und anderen allgemeinen Kram regelt ... aber das hat auf den Rest keinerlei Auswirkung, deshalb habe ich es hier jetzt rausgelassen) 😕


Log in to reply