Initialisierung einer const-Referenz

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Initialisierung einer const-Referenz

Beitrag von Glocke » Fr Apr 26, 2013 10:46 pm

Hi, ich habe ein Problem beim Initialisieren einer Referenz aus einer Basisklasse durch eine abgeleitete Klasse:

Code: Alles auswählen

#include <iostream>

class Typ {};

class Base {
    protected:
        Typ& ref;
    public:
        Base(Typ const & ref)
            : ref(ref) {}
};

class Derived: public Base {
    public:
        Derived(Typ const & ref)
            : Base(ref) {}
};

int main() {
    Typ t;
    Derived d(t);
}
GCC 4.6.4 meldet mir:
main.cpp: In Konstruktor »Base::Base(const Typ&)«:
main.cpp:10:22: Fehler: ungültige Initialisierung einer Referenz des Typs »Typ&« von Ausdruck des Typs »const Typ«
Ohne const (in Typ const &) funktioniert es. Allerdings weiß ich nich wie ich es zum Laufen bekomme, wenn ich explizit eine Referenz auf eine Konstante haben möchte.

LG Glocke :)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Initialisierung einer const-Referenz

Beitrag von Xin » Sa Apr 27, 2013 8:11 am

Glocke hat geschrieben:Hi, ich habe ein Problem beim Initialisieren einer Referenz aus einer Basisklasse durch eine abgeleitete Klasse:

GCC 4.6.4 meldet mir:
main.cpp: In Konstruktor »Base::Base(const Typ&)«:
main.cpp:10:22: Fehler: ungültige Initialisierung einer Referenz des Typs »Typ&« von Ausdruck des Typs »const Typ«
Ohne const (in Typ const &) funktioniert es. Allerdings weiß ich nich wie ich es zum Laufen bekomme, wenn ich explizit eine Referenz auf eine Konstante haben möchte.
Compilermeldung lesen ^^

Code: Alles auswählen


[code]#include <iostream>

class Typ {};

class Base {
    protected:
        Typ& ref;        // <- ref muss Typ const & sein
    public:
        Base(Typ const & ref)
            : ref(ref) {}     // <- Ahhhja... ;-)
};
Wenn Du eine (Typ &) mit einem (Typ const &) beschreiben könntest, könntest Du mit (Typ &) den referenzierten Datensatz verändern. Mit (Typ const &) hast Du zuvor garantiert, dass Du ihn nicht veränderst. Du müsstest also das Garantieversprechen brechen. Und der Compiler spielt da so nicht mit. Daher die Fehlermeldung.

Das ist genau das, wo Dich C++ mit Const-Correctness vor schlechten Ideen beschützen kann. :-)
In Java und C# kannst Du Const gemeint haben, aber Du kannst es eben nicht verlangen. Und der Compiler sagt auch nix, wenn aus const gemeint versehentlich wieder mutable wird.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Initialisierung einer const-Referenz

Beitrag von Glocke » Sa Apr 27, 2013 9:19 am

Xin hat geschrieben:Wenn Du eine (Typ &) mit einem (Typ const &) beschreiben könntest, könntest Du mit (Typ &) den referenzierten Datensatz verändern. Mit (Typ const &) hast Du zuvor garantiert, dass Du ihn nicht veränderst. Du müsstest also das Garantieversprechen brechen. Und der Compiler spielt da so nicht mit. Daher die Fehlermeldung.
Ah ok :lol: Das war mir irgendwie nicht bewusst - rückblickend aber klar :D

Danke :)

Antworten