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.