Zugriffsrechte



  • (D)Evil schrieb:

    usw ... ^^

    Und inwiefern beantwortet das Strombergs letzte Frage?
    Davon ab dass Dein operator= defekt ist.



  • @(D)Evil
    dei operator= hat ein Speicherleck (kein delete) und ist nicht exceptionsicher.
    @Stromberg
    Der operator= sollte etwas zurückgeben, damit man ihn verketten kann (a = b = c = 0).
    Der Sinn des swap-Idioms besteht darin, den operator= exceptionsicher und leichter wartbar zu machen.
    Exceptionsicher ist er deshalb, weil bei einer exception im operator (z.Bsp. beim new) der Zustand des Objektes erhalten bleibt. Das ist weder bei deinem noch bei (D)Evils Variante der Fall.
    Die wartbarkeit ist besser, weil du den ganzen Kopiercode nur einmal (nämlich im CopyCTor) hast und so bei Änderungen an der Klasse auch nur ihn ändern mußt.



  • Aber was ich an dem "swap" noch merkwürdig finde, eigentlich werden da doch zwei Täusche (gibts des Wort?) durchgeführt.
    1mal von klass A -> B, und dann noch mal von Klasse B -> A. Aber es reicht doch einer von den beiden, den anderen braucht man doch nicht und ist zeitverschwendung?! Oder versteh ich da wieder was falsch? Vll. sollt man einen Tausch machen der nur von der einen Klasse in die andere schreibt?

    MfG
    Stromberg



  • Wo wird da zweimal getauscht? Ich sehe nur einen Copykonstruktoraufruf und ein swap.



  • Stromberg schrieb:

    Aber was ich an dem "swap" noch merkwürdig finde, eigentlich werden da doch zwei Täusche (gibts des Wort?) durchgeführt.
    1mal von klass A -> B, und dann noch mal von Klasse B -> A. Aber es reicht doch einer von den beiden, den anderen braucht man doch nicht und ist zeitverschwendung?! Oder versteh ich da wieder was falsch? Vll. sollt man einen Tausch machen der nur von der einen Klasse in die andere schreibt?

    Das Wort "tausche" impliziert, dass A hinterher den Inhalt von B und B den Inhalt von A hat. Sonst hieße es "kopiere" 😃

    Der Sinn des ganzen ist, dass eins der beiden getauschten Objekte das temporäre Objekt ist, welches unmittelbar nach dem Tausch gelöscht wird. Damit räumt der Destruktor von temp automatisch die Daten ab, die sich zuvor noch in *this befunden haben. Du machst quasi:

    1. Erzeuge temp. Objekt als Kopie von der Quelle (erzeugen eines neuen Array mit bereits existierenden Funktionen)
    2. Tausche Inhalt von temp. Objekt mit Inhalt von *this (das geht sehr schnell und danach beinhaltet *this eine Kopie der Quelle, und das temp. Objekt den Müll der vorher in *this stand)
    3. Lösche temp. Objekt (damit wird der Müll, der vorher in *this stand, ordentlich abgebaut)



  • Aso, jetzt hab ichs gecheckt, weil meine Verwunderung war genau wie du gesagt hast:

    LordJaxom schrieb:

    ...und das temp. Objekt den Müll der vorher in *this stand...

    und da hab ich mir gedacht, es reicht doch wenn man das Zeug von "temp" einfach in *this reinstecken....ist ja nur Zeit verschwendung das alte Zeug von "*this" in temp zu haun!
    Aber das hier erklärt dann wieder alles:

    LordJaxom schrieb:

    3. Lösche temp. Objekt (damit wird der Müll, der vorher in *this stand, ordentlich abgebaut)

    Also ist es doch sinvoll 2 mal zu tauschen einmal von temp nach *this und umgekehrt.
    Dankeschön.

    MfG
    Stromberg



  • Äh udn noch was, bei den Zeigern, da tauscht swap doch einfach nur die Adressen oder?

    MfG
    Stromberg



  • Stromberg schrieb:

    Äh udn noch was, bei den Zeigern, da tauscht swap doch einfach nur die Adressen oder?

    Gehen wir nochmal in das Detail. Swap dient dazu Exceptionneutral zu sein. Das bedeutet das ein Objekt entweder ganz oder garnicht kopiert wird und in einen konsistenten Zustand bleibt (Sprich im Fehlerfall DARF kein inkonsistenter Zwischenstand eintreten).

    Dies kannst du nicht bei einer direkten Zuweisung garantieren, da beim Aufruf des Zuweisungsoperators eine Exception eintreten kann, und das Objekt dann ggf. schon in Teilen überschrieben ist.

    Bei einem Tausch von Zeigern kann aber keine Exception eintreten. Daher diese drei Schritte (Wenn ein Fehler bei der Anlage eintritt, bleibt der alte Stand erhalten, und es tritt kein inkonsistenter Zwischenstand ein...).

    cu André



  • Außerdem würde es doch viel zu viel Zeit kosten wenn man es nicht über den Adressen Tausch machen würde? Sondern neu Speicher reservieren müsste bei jedem Zeiger, für die jeweilige größe, die alten Werte zwischenspeichern mit ner for schleife einlesen......wäre doch Zeitverschwendung?

    MfG
    Stromberg



  • Nochmal zu den Zugriffsrechten, kann ich folgende Regel aufstellen:

    Innerhalb der Methoden eines Objekts hat man Zugriff auf private Elemente von anderen Objekten und oder *this. Innerhalb einer Klasse hat man ebenso Zugriff auf private Elemente. Nur außerhalb einer Klasse oder eines Objekts hat man nur Zugriff auf öffentliche (public) Elemente.

    Oder kann man da noch an der Formulierung feilen???

    MfG
    Stromberg



  • Die Zugriffsrechte sind bezogen auf Klassen, nicht auf Objekten, d.h. jede Klassenmethode hat Zugriff auf alle (auch private) Elemente derselben Klasse (egal ob 'this' oder ein anderes Klassenobjekt).

    Du hast es also bei deiner Formulierung irgendwie "doppel gemoppelt" beschrieben.



  • Braunstein schrieb:

    Hallo,

    private bedeutet das die dort deklarierten Member nach außen hin nicht sichtbar sind....[edit]

    Das ist bestimmt richtig gemeint, führt aber leider auf die falsche Fährte, denn sichtbar sind auch private-Member ... aber eben nicht zugreifbar.
    Die Sichbarkeit kann z.B. zu Problemen mit "ungewollten Overloads" führen...

    Gruß,

    Simon2.


Anmelden zum Antworten