Frage zu Variabeln in Klassenfunktionen



  • Verstehe das weiter unten folgende Programm nicht.
    Wie merken sich die Klassen die Variablen sloc und rloc?
    Sind die nicht lokal, sollten also nach dem Aufruf der jeweiligen Klassenfunktion wieder gelöscht werden?
    Oder habe ich da was grundlegendes nicht verstanden?
    Versuche mir gerade bissl C++ mit C++ from the groundup beizubringen..:)

    #include <iostream>
    using namespace std;
    
    // This creates the class queue.
    class queue {
    int q[100];
    int sloc, rloc;
    public:
    void init();
    void qput(int i);
    int qget();
    };
    
    // Initialize the queue.
    void queue::init()
    {
    rloc = sloc = 0;
    }
    
    // Put an integer into the queue.
    void queue::qput(int i)
    {
    if(sloc==100) {
    cout << "Queue is full.\n";
    return;
    }
    sloc++;
    q[sloc] = i;
    }
    
    // Get an integer from the queue.
    int queue::qget()
    {
    if(rloc == sloc) {
    cout << "Queue underflow.\n";
    return 0;
    }
    rloc++;
    return q[rloc];
    }
    
    int main()
    {
    queue a, b; // create two queue objects
    a.init();
    b.init();
    a.qput(10);
    b.qput(19);
    a.qput(20);
    b.qput(1);
    cout << "Contents of queue a: ";
    cout << a.qget() << " ";
    cout << a.qget() << "\n";
    cout << "Contents of queue b: ";
    cout << b.qget() << " ";
    cout << b.qget() << "\n";
    return 0;
    }
    

    This program displays the following output:
    Contents of queue a: 10 20
    Contents of queue b: 19 1



  • Das sind Attribute der Klasse queue welche so lange ihren Wert haben, so lange eine Instanz (Objekt) von Klasse queue existiert.
    Das sind Grundlagen, welche Du erst verstehen solltest; ja Du hast da etwas "grundlegendes nicht verstanden".



  • Zu deiner Frage:
    Das sind Klassenvariablen, die so lange bestehen bleiben wie die Instanz der Klasse besteht (Stichwort Lebenszeit von Variablen).
    Beispiel Auto:
    Stell dir vor deine Klasse entspricht einem Auto und hat als Attribut (=Klassenvariable) "Anzahl_Reifen". Im Werk wird sie auf 4 gesetzt (ein normales Auto hat ja 4 Reifen). Die Reifenanzahl ändert sich nicht, nur weil du das Auto mal 2 Tage nicht benutzt. (Ok kommt auf den Wohnort an aber grundsätzlich hat es 4 Reifen 😃 )

    Zu deinem Post ein gut gemeinter Rat:
    Der Titel ist nicht wirklich aussagekräftig. Du solltest in Zukunft bessere Titel wählen, die die Art des Problems beschreiben.
    Und nutze bitte die Code-Funktionen des Forums, das macht es erheblich einfacher den Code zu lesen 🙂

    Viele Grüße
    Cherup



  • Vielen Dank!
    Ich konnte es nicht verstehen, da es nicht vorher erklärt wurde!
    Habe gerade nochmal genau nachgelesen!
    Dabei ist das elementar wichtig...Na ja...

    Ok, gelobe in Zukunft besser gestaltete Fragen!:)



  • Irre ich mich, oder schreibt das Ding über die array Grenzen hinaus? 😞

    PS: Dein Posting oben, kannst Du noch editieren und die Code-Tags nachträglich einfügen.



  • Furble Wurble schrieb:

    Irre ich mich, oder schreibt das Ding über die array Grenzen hinaus? 😞

    In Beispiel Fall nicht, aber im allgemeinen ja.



  • Aber wenn ich richtig überlegt habe, wird der nullte Index auch nicht genutzt, weil
    sloc++;
    q[sloc] = i;
    oder?



  • Matthias2006 schrieb:

    Aber wenn ich richtig überlegt habe, wird der nullte Index auch nicht genutzt, weil
    sloc++;
    q[sloc] = i;
    oder?

    Jupp.

    Kannst ja mal spaßeshalber alle Vorkommnisse von 100 durch 2 ersetzen und das Beispiel laufen lassen.
    Bei mir überschreibt er schön sloc ... 🙂



  • Weil er genau auf 100 prüft und nicht auf grösser/gleich, gell?
    Obwohl nee, rloc dürfte eigentlich net grösser als 100 werden..
    Noch viel zu lernen es gibt...



  • Matthias2006 schrieb:

    Weil er genau auf 100 prüft und nicht auf grösser/gleich, gell?

    Warum er bei mir sloc überschreibt?
    Weil sloc das Pech hat direkt im Anschluß an das Array q zu liegen.
    Wenn jetzt qput() eins ausserhalb des Arrays schreibt geht halt irgendwas kaputt. In meinem Fall sloc ...

    Das ist ein klassischer Buffer Overflow.



  • Weil du nach dem Test den index noch erhoest.



  • 'init'-Funktionen sind übrigens auch doof, dafür gibts den Konstruktor.



  • Nicht immer 🙂
    Ich habe Klassen, die gegenseitigen Zugriff benötigen. Da kann ich schlecht dem Konstruktor einen Pointer auf die anderen Klassen übergeben, wenn sie noch nicht instanziert sind.
    Da nutze ich dann Init()-Funktionen um die Pointer zu übergeben, nachdem alle Klassen instanziert wurden.
    Aber allgemein sind init-Funktionen überflüssig, das stimmt schon 😉



  • Cherup schrieb:

    Ich habe Klassen, die gegenseitigen Zugriff benötigen.

    Das liegt wohl daran, das so ein Zugriff auch doof ist.



  • Mag sein.
    Aber wie würdest du eine Interface-Klasse zwischen GUI und Programmlogik implementieren, die zum einen auf eine bestimmte Klasse zugreifen muss und diese Klasse der Interface-Klasse wiederum zu zur Laufzeit festgelegten Zeitpunkten mitteilen muss, das etwas passiert ist? 😉



  • Cherup schrieb:

    Mag sein.
    Aber wie würdest du eine Interface-Klasse zwischen GUI und Programmlogik implementieren, die zum einen auf eine bestimmte Klasse zugreifen muss und diese Klasse der Interface-Klasse wiederum zu zur Laufzeit festgelegten Zeitpunkten mitteilen muss, das etwas passiert ist? 😉

    Warum sollte man dafür eine init-Funktion benötigen? Beide Objekte können vollständig konstruiert werden, sie müssen nur später miteinander bekannt gemacht werden.

    Gerade im GUI-Bereich wird da eine eher lose Verknüpfung mit signal/slot bzw. Observable/Observer bevorzugt.



  • manni66 schrieb:

    Beide Objekte können vollständig konstruiert werden, sie müssen nur später miteinander bekannt gemacht werden.

    Genau das mache ich mit der init-Funktion. Ich erstelle die Instanzen der Klassen und erst am Ende übergebe ich mit der Init-funktion die pointer.
    Mag auch sein, dass hier das Verständnis einer init-Funktion voneinander abweicht 🙂
    Die GUi hat mit dem Bereich der Software nicht wirklich was zu tun, sie kennt nur die Interface-Klasse.

    Ist ja auch egal, sind schon wieder weit ab vom Thema 😉


Log in to reply