Klasse B erbt von Klasse A. Klasse B soll auf x zugreifen aber nicht Main.



  • Hi,

    Klasse B erbt von Klasse A. Klasse B soll auf die Variable x von Klasse A zugreifen können.
    Auf die Variable x darf nicht direkt von Main aus zugegriffen werden. Wie mache ich das? Wenn ich die Variable private/protected setze, dann kann die Klasse B auch nicht mehr auf die Variable x zugreifen...



  • blume schrieb:

    Wenn ich die Variable private/protected setze, dann kann die Klasse B auch nicht mehr auf die Variable x zugreifen...

    Hast du das ausprobiert?
    Kannst du den Code mal posten?



  • #include <iostream>
    using namespace std;
    
    class Basis {
    	int var1;
    	int var2;
    	void funk1(void);
    public:
    	void funk2(void);
    };
    
    class Ableitung : public Basis {
    protected:
    	int varx;
    public:
    	void funkx(void);
    };
    
    class Test : public Ableitung {
    
    };
    
    int main() {
    	Test t;
    }
    

    Die Variable x ist hier varx. Ableitung ist Klasse A und Klasse B ist Test.



  • Test greift ja gar nicht auf varx zu?



  • oenone schrieb:

    Test greift ja gar nicht auf varx zu?

    Ja, darum geht es ja auch.



  • Dann füg es einfach hinzu:

    class Test : public Ableitung { 
    public:
        void print_varx() {
            std::cout << varx << std::endl;
        } 
    };
    

    feddisch.



  • Nein, so ist das nicht gemeint. Also:
    Ergänzen Sie den unten gegebenen Quelltext (Klassendefinition von Basis und Ableitung) so, dass folgende Zugriffe auf Elementvariablen und Funktionen in Funktion main() und Klasse Ableitung gelten: Zugriff auf var1 und var2 aus main() nicht möglich. Zugriff auf funk1() aus main() nicht möglich. Zugriff auf funk2() aus main möglich. Zugriff auf var1 und var2 aus Ableitung nicht möglich. Zugriff auf funk1() aus Ableitung möglich. Zugriff auf varx aus main nicht möglich, Zugriff auf varx aus Klasse, die von Ableitung erbt möglich. Zugriff auf funkx() aus main() möglich.

    #include <iostream>
    using namespace std;
    
    class Basis {
    	int var1;
    	int var2;
    	void funk1(void);
    	void funk2(void);
    };
    
    class Ableitung : public Basis {
    	int varx;
    	void funkx(void);
    };
    
    int main() {
    	//....
    }
    

    So habe ich das gemacht, stimmt aber nicht ganz:

    #include <iostream>
    using namespace std;
    
    class Basis {
    	int var1;
    	int var2;
    	void funk1(void);
    public:
    	void funk2(void);
    };
    
    class Ableitung : public Basis {
    	int varx;
    public:
    	void funkx(void);
    };
    
    int main() {
    }
    

    Zugriff auf funk1() aus main() nicht möglich. Zugriff auf funk1() aus Ableitung möglich. Und das mit varx...



  • Ja, das was die Kindklassen zugreifen sollen, machst du jetzt noch protected.



  • Wenn ich das mache:

    protected:
    	void funk1(void);
    

    Dann kann Ableitung auch nicht mehr drauf zugreifen.



  • blume schrieb:

    Zugriff auf var1 und var2 aus main() nicht möglich. Zugriff auf funk1() aus main() nicht möglich. Zugriff auf funk2() aus main möglich. Zugriff auf var1 und var2 aus Ableitung nicht möglich. Zugriff auf funk1() aus Ableitung möglich. Zugriff auf varx aus main nicht möglich, Zugriff auf varx aus Klasse, die von Ableitung erbt möglich. Zugriff auf funkx() aus main() möglich.

    #include <iostream>
    using namespace std;
    
    class Basis {
    private:
        int var1;
        int var2;
    protected:
        void funk1(void);
    public:
        void funk2(void);
    };
    
    class Ableitung : public Basis {
    protected:
        int varx;
    public:
        void funkx(void);
    };
    
    int main() {
        //....
    }
    

    Was hälst du denn davon?



  • blume schrieb:

    Wenn ich das mache:

    protected:
    	void funk1(void);
    

    Dann kann Ableitung auch nicht mehr drauf zugreifen.

    Doch, genau dafür ist das da.



  • out schrieb:

    Was hälst du denn davon?

    #include <iostream>
    using namespace std;
    
    class Basis {
    private:
    	int var1;
    	int var2;
    protected:
    	void funk1(void);
    public:
    	void funk2(void);
    };
    
    class Ableitung : public Basis {
    protected:
    	int varx;
    public:
    	void funkx(void);
    };
    
    class Test : public Ableitung {
    
    };
    
    int main() {
    	Ableitung a;
    	a.funk1(); // geht nicht 
    
    	Test t;
    	t.varx = 0; // geht nicht
    }
    


  • blume schrieb:

    int main() {
    	Ableitung a;
    	a.funk1(); // geht nicht 
    
    	Test t;
    	t.varx = 0; // geht nicht
    }
    

    Ähm.. Das sind beides Zugriffe von main() aus. Das soll ja auch laut Anforderung nicht gehen.



  • blume schrieb:

    out schrieb:

    Was hälst du denn davon?

    #include <iostream>
    using namespace std;
    
    class Basis {
    private:
    	int var1;
    	int var2;
    protected:
    	void funk1(void);
    public:
    	void funk2(void);
    };
    
    class Ableitung : public Basis {
    protected:
    	int varx;
    public:
    	void funkx(void);
    };
    
    class Test : public Ableitung {
    
    };
    
    int main() {
    	Ableitung a;
    	a.funk1(); // geht nicht // SO SOLL ES AUCH SEIN. ==> Zugriff auf funk1() aus main() nicht möglich.
    
    	Test t;
    	t.varx = 0; // geht nicht // SO SOLL ES AUCH SEIN. ==> Zugriff auf varx aus main nicht möglich.
    }
    

    Ich glaube du verstehst hier etwas nicht. Wenn es heißt Zugriff auf varx aus Klasse, die von Ableitung erbt möglich , dann bezieht sich das immer auf Dinge innerhalb der Klasse. Test t in deinem Beispiel ist nicht innerhalb der Klasse Ableitung. Der Satz bezieht sich auf das:

    class Test : public Ableitung {
    void wasweissich()
    {
    	Test t;
    	t.varx = 0;
    
        // oder
        varx = 0;
    }
    };
    


  • Wie greife ich dann von Ableitung auf funk1() zu?



  • Okay, jetzt habe ich es verstanden. Vielen Dank!



  • blume schrieb:

    Wie greife ich dann von Ableitung auf funk1() zu?

    Wie gesagt, es bezieht sich auf "innerhalb der Klasse". Wenn du in der main bist, bist du nicht innerhalb der Klasse.

    class Basis {
    private:
        int var1;
        int var2;
    protected:
        void funk1(void);
    public:
        void funk2(void);
    };
    
    class Ableitung : public Basis {
    protected:
        int varx;
    public:
        void funkx(void)
        {
            funk1(); // So z.B.
        }
    };
    
    class Test : public Ableitung {
    
    };
    


  • Bitte nicht

    void funk1(void);
    

    schreiben, das tut einem ja in den Augen weh. Lass das void weg.

    void funk1();
    


  • avoid void schrieb:

    Bitte nicht

    void funk1(void);
    

    schreiben, das tut einem ja in den Augen weh. Lass das void weg.

    void funk1();
    

    Das macht nicht der Schüler, sondern der Lehrer, denk ich mal.


Anmelden zum Antworten