Kein Zugriff auf Unterklasse trotz friend?



  • Hallo!

    Hab folgendes Problem und stehe grade auf dem Schlauch:

    Ich will von einer Klasse auf private Variablen einer anderen Klasse zugreifen, die aber friend ist. Funktioniert das nicht so, wie unten angedeutet?

    Ich gehe davon aus, dass sich in der Oberklasse mehr als eine Funktion auf das private Var. der unterklasse zugreift. Will auch keine get-function für die unterklasse implementieren!?

    class oberklasse
    {
    
        int i;
    
        class unterklasse
        {
            int j;
            friend class oberklasse;
        };
    
      public:
    
          /* member functions */
          int geti() const { return i; }; // i wird gelesen
          int getj() const { ??? };       // j soll gelesen werden
    
          /* friend functions */
          friend int getj2() const { ??? }; // j soll gelesen werden
    };
    

    Gibt es da nen guten Weg?
    Die "???" müssen irgendwie das j aus der unterklasse zurückgeben?

    THX@ALL



  • Das hat nichts mit friend zu tun, du hast ganz einfach keine Instanz der Unterklasse innerhalb der Oberklasse. BTW das mit getj2 wird auch nicht gehen. Nur Memberfunktionen können innerhalb der Klasse definiert werden.



  • Wieso hat das nichts mir friend-deklarationen zu tun???

    Wenn eine Klasse auf private Elemente einer anderen zugreifen dürfen soll, wie denn sonst???

    Was heisst BTW?

    Das mit der friend function in der Klasse sollte auch nur die Deklaration sein. Bei einer Definiton würde es an der Stelle auch keinen Sinn machen sie als friend zu deklarieren.



  • cbk18 schrieb:

    Was heisst BTW?

    by the way



  • Hast du es schonmal mit nem Tutorial versucht?



  • Toll, dass mir keiner helfen will. Schön, wenn ihr wisst, wie es besser, es aber nicht sagt. Ich glaubte hier Hilfe zu bekommen!

    Der einzige hilfreiche Kommentar war der von dem unregistrierten!



  • *lol* Witzbold.
    Bashar schrieb doch bereits, dass es von deiner Unterklasse keine Instanz gibt, du deswegen auch nicht auf sie zugreifen kannst!
    Also:
    Instanz anlegen und über diese auf die Variablen deiner Unterklasse zugreifen.



  • Oh man... dann will ich mal versuchen zu helfen.

    1. Unter-/Oberklasse? Die total falschen Bezeichnungen. Deine Unterklasse nennt man eigentlich Innere-Klasse. Hab bei der Überschrift an was ganz anderes gedacht.

    2. Das mit dem friend ist irgendwie fehl am Platz. Normalerweise sagt man einer total fremden Klasse, welche friend ist. Das was du machen willst, mußt du anders lösen, schon allein vom Design her. Mach doch einfach die Variable j protected! Dann ist j von Oberklasse aus zugreifbar, aber von sonst keiner anderen Klasse. Das ist meiner Meinung nach die sauberste Lösung.

    3. OK, ansonst wie von den anderen gesagt eine Instanz anlegen... allerdings sollte das selbstverständlich sein und nicht nenneswert sein.



  • Okay, danke.

    Damit kann ich schon mehr anfangen!

    Das geht mit protected? Muss ich gleich mal ausprobieren!
    Ich dachte protected hat nur mit Vererbung zu tun!

    Jetzt müsste ich nur noch wissen, was er heisst eine Instanz anzulegen. Aber ich hoffe mal in den FAQs schlauer zu werden... 🙂

    Danke nachmals.



  • Ehm, heheh, shit... protected und Vererbung. Oh man, hab ich mir jetzt selbst ein Bein gestellt? Muß ich gleich ausprobieren.

    Instanzieren:

    MyClass *myCl = new MyClass(); // Instanz erzeugen
    myCl->j = 0; // über Instanz auf Variable zugreifen
    


  • Mist, musst du public machen!

    class Aussenklasse
    {
    	class Innereklasse
    	{
    	public:
    		int j;
    	};
    
    	Innereklasse ik;
    	public:
    		void j(int j)
    		{
    			ik.j = j;	// geht
    		};
    };
    
    int main(int argc, char* argv[])
    {
    	Aussenklasse ak;
    	ak.j(1);
    	ak.ik.j = 0;	// geht nicht
    	return 0;
    }
    


  • Also heisst Instanz erzeugen, ein Objekt in einer Klassendefinition erschaffen?



  • nein, Instanz und Objekt sind synonym.



  • Artchi schrieb:

    Mist, musst du public machen!

    Da hilft doch wieder friend weiter:

    class Aussenklasse 
    { 
        class Innereklasse 
        { 
            int j;
    		friend class Aussenklasse;
        }; 
    
        Innereklasse ik; 
    public: 
        void j(int j) 
        { 
            ik.j = j;
        }; 
    };
    


  • Ahhh!
    Ich glaube nun verstehe ich es. Hab wieder was dazu gelernt! Sehr gut.

    thx


Anmelden zum Antworten