Stilfrage Pointer vs. Referenz im Objekt speichern



  • Guten Morgen,

    angenommen man hat eine Klasse, die einen Pointer auf ein anderes Objekt hält. Der Pointer darf nicht 0 sein, und soll nach dem Erstellen auch nicht mehr verändert werden, also könnte man eigentlich eine Referenz nutzen. Nur sind Referenzen irgendwie so vorbelastet. (Damit, dass sie nicht gehalten und später genutzt werden.) Ich schreibe einfach mal Beispielcode, dann wird klarer was ich möchte:

    Möglichkeit 1:

    class A
    {
      const B *b_;
    public:
      A(const B *b)
        : b_(b)
      {}
    };
    

    Möglichkeit 2:

    class A
    {
      const B &b_;
    public:
      A(const B &b)
        : b_(b)
      {}
    };
    

    Wie macht man also möglichst elegant klar, dass die Referenz/der Pointer in der Klasse gespeichert und später genutzt wird?



  • Wenn, wie du sagst, der Pointer nie NULL sein darf und nicht verändert werden darf, bedeutet das zusammen genommen, dass das Objekt, auf das verwiesen wird, eine längere Lebensdauer haben muss als das Objekt, das die Referenz/Pointer hält. Andernfalls hast du sowohl beim Pointer als auch bei der Referenz das gleiche Problem, nämlich dass sie ins Nirvana verweisen.
    Wenn das mit der Lebenszeit gegeben ist, würde ich eine Referenz nehmen. Andernfalls würde ich einen weak_ptr in Betracht ziehen.



  • Wenn der Besitz des Objekts ganz klar ausserhalb dieser Klasse festgelegt ist, mach ich das meist so

    class A
    {
      const B* b_;
    public:
      A(const B& b)
        : b_(&b)
      {}
    };
    


  • Die Diskussion gabs schon etliche Male, im Prinzip gibt es zwei Lager:

    Hauptsächlich Verwendung von Zeigern

    • T, const T& : Lesezugriff
    • T* : Schreibzugriff, Adresse speichern
    • const T* : Adresse speichern

    Vorteil: Veränderung/Speicherung im Aufrufcode sichtbar
    Nachteil: Kein Einsatzgebiet für Non-Const-Referenzen, ständige Dereferenzierung notwendig

    Hauptsächlich Verwendung von Referenzen

    • T, const T& : Lesezugriff
    • T& : Schreibzugriff, Adresse speichern
    • T* : Schreibzugriff ( NULL erlaubt), Adresse speichern
    • const T* : Lesezugriff ( NULL erlaubt), Adresse speichern

    Vorteil: Schnittstelle gibt Auskunft darüber, ob Nullzeiger erlaubt sind
    Nachteil: Im Aufrufcode ist Schreibzugriff/Speicherung nicht direkt erkennbar


Anmelden zum Antworten