Referenz statt Zeiger als Klassenattribut



  • Hi,

    Mir kam nur gerade ganz kontextfrei ein wenig die Idee auf, dass man in Klassen ja häufiger Mal Referenzen statt Zeiger verwenden könnte. Der Nachteil liegt auf der Hand, man kann die Referenz nachher nicht mehr ändern.

    Jetzt stellen sich mir so verschiedene Fragen:
    - Kann man die Referenz wirklich nicht mehr ändern? 😉
    - Nützt einem diese Fixierung etwas wie z.B., dass man ggü. einem Zeiger die Indirektion spart?
    - Geht Polymorphie mit Referenz auf Basisklasse immer noch? Gehen Referenzen auf abstrakte Basisklassen?

    Irgendwie sehe ich Referenzen in Klassen nie. Liegt wohl an der Fixierung. Andererseits ist es ja oft so, dass man in einer Klasse etwas fixiert und später nicht mehr verändert. Zeiger sind eben flexibler.



  • Eisflamme schrieb:

    - Kann man die Referenz wirklich nicht mehr ändern? 😉

    Wenn Dich die "Unveränderlichkeit der Referenz" stört, dann hast Du etwas falsch gemacht, sprich, eine Referenz genommen, was ein Zeiger hätte sein sollen.

    Eisflamme schrieb:

    - Nützt einem diese Fixierung etwas wie z.B., dass man ggü. einem Zeiger die Indirektion spart?

    Man kann dadurch verhindern, dass der Compiler einen Zuweisungsoperator selbst erzeugt.

    Eisflamme schrieb:

    - Geht Polymorphie mit Referenz auf Basisklasse immer noch? Gehen Referenzen auf abstrakte Basisklassen?

    Ja.

    Eisflamme schrieb:

    Irgendwie sehe ich Referenzen in Klassen nie.

    Och, wenn man Referenz-ähnliche Klassen schreiben will, kann man die schon benutzen. zB

    class bit_reference_proxy
    {
      unsigned char &ref;
      unsigned char mask;
    public:
      bit_reference_proxy(unsigned char* ptr, unsigned char mask)
      : ref(*ptr), mask(mask)
      {}
    
      operator bool() const {return ref & mask;}
    
      bit_reference_proxy& operator=(bool b) const
      {
        if (b) ref |= mask; else ref &= ~mask;
        return *this;
      }
    };
    

    kk


Anmelden zum Antworten