Objekte: Komm nicht drauf...



  • Hallo,

    Ich habe eine Funktion die eigentlich gar nicht in meiner Klasse eingebettet sein brauch, dennoch brauche ich diverse Variablen aus dieser Klasse. Die Variablen sind im geschützten Bereich der Klasse deklariert, wie kann ich ohne die Klasse zu instantiieren auf die Variablen zugreifen ? Die Klasse und die Funktion sind dabei in der gleichen Datei, muß doch irgendwie gehen, ohne das ich eine GetMethode schreiben muß bzw. die Klasse instantiieren muß, oder 😕

    Winn



  • wenn du auf die variablen zugreifen willst ohne ein
    objekt der klasse zu erstellen, dann musst du die
    variablen statisch machen.



  • Du meinst statisch ausserhalb oder innerhalb der Klasse ? Heißt statisch eigentlich auch, daß sie konstant sind ? Das dürfen sie aber zumindest bei der Initialisierung nicht sein...



  • class x
    {
       private:
          static int i;
          static const int CI;
    };
    
    // statische attribute initialisieren
    int x::i = 1;
    const int x::CI = 3;
    
    spaeterer zugriff mit:
    x::i = 123;
    

    [ Dieser Beitrag wurde am 05.06.2003 um 13:44 Uhr von entelechie editiert. ]



  • class X
    {
    private:
     int i;
    friend int foo(const X&);
    };
    
    int foo(const X& x)
    {
      return x.i;
    }
    

    wobei du dir da ueberlegen solltest ob das wirklich noetig ist, denn friend ist eine _sehr_ starke bindung und sollten (wenn moeglich) vermieden werden.



  • Geht nich, "Illegal Access"

    #include <stdio.h>
    
    class moep
        {
            private:
                static int Number;
            public:
                void SetNumber(int i);
        };
    
    void moep::SetNumber(int i)
        {
            Number=i;
        }
    
    int main()
    {
        moep x;
        x.SetNumber(4);
    
        printf("Number %d\n", moep::Number); 
        return 0;
    }
    

    In meinem Fall, muß ich das Objekt aus dem Hauptprogramm initialisieren, aber in dem Header File, wo ich diese Funktion bislang platziert habe (in diesem Fall ist es das printf) muß ich auf Number zugreifen, und nu 😕

    Winn



  • #include <cstdio>
    
    class moep
        {
            private: //wenn Number privat ist, wie willst du in der main Funktion darauf zugreifen?
                static int Number;
            public:
                void SetNumber(int i);
        };
    
    int moep::Number; //Speicherplatz für die statische Variable nicht vergessen!
    //- wird standardmäßig mit 0 initialisiert
    
    void moep::SetNumber(int i)
        {
            Number=i;
        }
    
    int main()
    {
        moep x;
        x.SetNumber(4);
    
        std::printf("Number %d\n", moep::Number); 
        return 0;
    }
    

    außerdem hast du so nur ein "Number" für alle Instanzen. Bist du dir dessen bewusst?



  • Funktioniert leider auch nicht 😞

    Error : illegal access from 'moep' to protected/private member 'moep::a'
    Some Trials.c line 41 tmp1=moep::a;

    Error : illegal access from 'moep' to protected/private member 'moep::b'
    Some Trials.c line 42 tmp2=moep::b;

    Winn

    Vom Aussehen ähnelt es mehr diesem:

    #include <stdio.h>
    
    class moep
        {
            private:
                static int a;
                static int b;
            public:
                void SetA(int i);
                void SetB(int i);
        };
    
    int moep::a;
    int moep::b;
    
    void moep::SetA(int i)
        {
            a=i;
        }
    
    void moep::SetB(int i)
        {
            b=i;
        }
    
    int produkt();
    
    int main()
    {
        moep x;
        x.SetA(4);
        x.SetA(3);
    
        printf("Produkt %d\n", produkt); 
        return 0;
    }
    
    int produkt()
        {
            int tmp1, tmp2;
            tmp1=moep::a; // Line 41
            tmp2=moep::b; // Line 42
            return tmp1*tmp2;       
        }
    


  • lies dir nochmal alles, was du über c++ hast, durch.
    moep::a und moep::b sind !private! auf die kannst du außerhalb der klasse nicht zugreifen!
    mach sie public oder implementiere get-Methoden

    ach - moment, ich hab gerade dein OP gelesen (Original Posting).

    zwei regeln:

    1. Wenn du eine Klasse nicht instanziieren willst, um auf Variablen (oder Funktionen) zuzugreifen, mach die Variablen (oder Funktionen) static. Das bedeutet, diese Variablen sind für alle Instanzen dieselben!

    2. Wenn du außerhalb einer Klasse auf geschützte (= private oder protected) Variablen zugreifen willst, musst du die Funktionen, die dies tun sollen, in der Klasse als "friend" deklarieren.

    ps: so kannst du mit printf nicht arbeiten, denn printf ruft keine funktionen auf.



  • Okay, also die Friend Variante funktioniert, aber möchte halt nicht jede Funktion, die Variablen aus der Klasse braucht, dort als Friend deklarieren. Und für die Static Variante bin ich wohl zu dusselig, die spuckt mir stets "Illegal Access" aus. Die Bücher die ich hab, sind wohl alle für die Katz, die schreiben 3-6 Zeilen und das wars dann... das Tut vom Peter Thömmes machts genau, wie ich, wie ihr, oder... - Was ist falsch oder was fehlt in meinem letzten SourceCode Example ?

    Winn 😕



  • class moep {
      public:
        static int a;
        static int b;
    //...
    

    dann gehts. aber nun ist nichts mehr geschützt.
    beides gleichzeitig geht nicht! geschützt und zugriff von außen ist ein widerspruch in sich, weil geschützt ja bedeutet: kein zugriff von außen.



  • logisch gibts da was - is "idotensicher":

    entweder: global oder statisch ( wenn du das nicht checkst würd ich mal die grundlagen von c/c++ noch mal überdenken, und ob raph siegle nextes jahr wieder für uns ins rennen gehen soll )

    ich persönlich bevorzuge statische members, weil dadurch die objektorientierung erhalten bleibt.

    aber.... geschmackssache.... happy coding !



  • Wohl wahr ! Wollte wohl die EierlegendeWollMilchSau... Dachte, wenn ich schon in einem HeaderFile bzw. seinem C Pedant die Klasse deklariere und dort Funktionen aufbaue, die der Klasse dienen, dann sollte es wohl solch eine Möglichkeit geben... quasi innerhalb der File.h und File.c offen, aber außerhalb geschützt... - werde wohl diese Werte nun als Parameter der Funktion übergeben - ...

    Besten Dank !! Winn



  • Original erstellt von <->:
    **ich persönlich bevorzuge statische members, weil dadurch die objektorientierung erhalten bleibt.
    **

    😕

    --> ahso. Weil Klassen dabei sind, richtig? 😉


Anmelden zum Antworten