interesante Dinge !



  • class K
    {
       private: double m, b;
       public:
           K(double x, double y) { m = x; b = y; }
           void geschnitt(K* g)  { g->m = 99.0; }
           double get()  { return m; }
    };
    
    int main()
    {
            K g1(2.0,3.0);
    	K g2(1.0,9.0);
    	g1.geschnitt(&g2);
    	cout<<g2.get();
    }
    

    interesante ist:

    1. class K darf ich 'K' nicht klein schreiben!
    2. private 'm' kann man zugreifen!

    hast du auch solche Dinge schon getroffen?



  • Hallo

    😕
    Wer sagt das du K generell nicht klein schreiben darfst? Welche Fehlermeldung genau?
    Wo greifst du von außerhalb auf das private Element m zu?
    Bedenke, das innerhalb einer Klasse alle Instanzen Zugriff auf die privaten Elemente andere Instanzen haben. Das ist kein Fehler sondern so gewollt.

    bis bald
    akari



  • @akari:
    Er darf K nicht klein schreiben, da sonst der Konstruktor nicht mehr funktioniert und K bei der Instanziierung als undefined identifier angezeigt wird.

    [edit]
    OK, ich weiss, das war nicht wirklich hilfreich.
    @damo: Wenn du class K in class k änderst, musst du auch die anderen K s im Quelltext mit in k ändern, sonst weiss der Compiler nicht, was du mit K meinst. Aber wenn du das so wie von mir und von 1310-Logik (unten) geschildert machst, dann kannst du natürlich alles umbenennen, das ist dein gutes Recht.
    [/edit]



  • er muss dann natürlcih alle 'K' klein schreiben 😉



  • 😃 vielen Dank 1310-Logik für Verstandnis! 😃

    ha, sorry zu alles, gerade habe ich die Codes einfach in anderer Codes eingefügt(ich benutzte .NET, so wollte nicht jedes mal project bilden), bei Original-Codes gibt es globale Variable "int k", aber die CompilerFehler lautet "Syntaxfehler: Fehlendes ';' vor Bezeichner 'g1' " warum nicht z.B. "Name-Konflikt".

    bei 2. ,akari, danke sehr, du hast recht. interesiert mich ist, was bedeutet eigentlich diese Technik?

    void geschnitt(K* g)  { g->m = 99.0; }
    

    in class 'K' wieder ein 'K' benutze, bin ich nicht 100% klar, weil ich dachte, die class K noch nicht fertig definiert, warum und wie kann man benutze?(Rekursion?) so ich habe diese Technik nie benutzt, deswegen habe ich mich sehr interessiert.
    klar, in class K, die Konstruktor benutzt 'K', return-wert von Methode kann auch 'K' sein.

    dank alles!



  • <blödrumalber>
    Du kannst K natürlich auch L nennen, oder kuhle_klasse
    </blödrumalber>



  • damo schrieb:

    akari, danke sehr, du hast recht. interesiert mich ist, was bedeutet eigentlich diese Technik?

    void geschnitt(K* g)  { g->m = 99.0; }
    

    in class 'K' wieder ein 'K' benutze, bin ich nicht 100% klar, weil ich dachte, die class K noch nicht fertig definiert, warum und wie kann man benutze?(Rekursion?) so ich habe diese Technik nie benutzt, deswegen habe ich mich sehr interessiert.
    klar, in class K, die Konstruktor benutzt 'K', return-wert von Methode kann auch 'K' sein.

    Nein das ist keine Rekursion, sondern du must einfach Klasse von Instanzen trennen.
    der Typ K ist als Klasse definiert. Für diese Klasse ist eine Methode namens geschnitt definiert, die als Parameter einen Pointer auf eine Instanz von genau der gleichen Klasse K hat.
    Das bedeutet das du bei Ausführung der Methode genau zwei verschiedene Instanzen von K hast : einmal this, in deinem Beispiel mit dem Variablennamen g1 dargestellt. Denn für g1 rufst du die Methode auf.
    Die zweite Instanz ist g2, durch das & wird die Adresse der Instanz an die Methode als Parameter übergeben.
    Um das ganze etwas greifbarer zu machen hier eine Abänderung :

    void geschnitt(K* g)  { g->m = this->m * 2; }
    

    was nichts anderes bedeutet als das der doppelte Wert von m des g1 in das m von g2 kopiert wird. g1 wird nicht verändert.

    bis bald
    akari



  • vielen vielen Dank für ausführliche Erklärung.
    bei private zugreifen:
    normaleweise schreibe ich so:
    class K
    {
    private:
    double m, b;
    public:
    K(double x, double y) { m = x; b = y; }
    void geschnitt(K* g) { g->set(99); } // g->m=99;
    double get() { return m; }
    void set(double x) { m=x; } // this->m=x;
    };
    int main()
    {
    ...... g->m=99; // falsch!!!
    }
    normaleweise schreibe ich nicht so: "g->m=99;", sondern so: "g->set(99);" das ist klar, private Element mit Methode zugreifen.
    in set-Methode:
    'm' kann man direkt zugreifen: m=x;(oder this->m=x; ) --- natürlich!

    in geschnitt-Methode:
    'm' kann man auch direkt zugreifen: g->m=99; --- 😕

    du hast schon vorgeschlagen:
    Bedenke, das innerhalb einer Klasse alle Instanzen Zugriff auf die privaten Elemente andere Instanzen haben. Das ist kein Fehler sondern so gewollt.

    ja, richtig, aber g ist Instanz von K, normalerweise darf g nicht auf 'm' zugreifen(g->m geht nicht, oder?), nur weil hier g in der Klasse K ist, oder?

    vielen Dank

    damo



  • Hallo

    ums nochmal zusammenzufassen : die Beschränkung von private und protected ist nach Klassen, nicht nach Instanzen.
    In einer methode der Klasse K kannst du also auf alle Member der Klasse K zugreifen, gleichgültig ob this oder andere Instanz.
    Erst bei Zugriff von außen (alles was nicht K:: zugeordnet ist) greift die Beschränkung von private bzw. protected.

    bis bald
    akari



  • Wao, sehr schön, alles klar! dank sehr!!! 👍


Anmelden zum Antworten