const correctness & member Referenzen
-
Hallo zusammen,
wie löst man folgendes:
Ein Objekt muss mit anderen Objekten zusammenarbeiten und hält sich dazu Referenzen auf diese Objekte.
Wenn das Hauptobjekt const ist, soll es die anderen Objekte nicht modifizieren dürfen und bei der Initialisierung somit auch mit konstanten Referenzen zurechtkommen.Konkret habe ich eine Klasse Punkt und eine Klasse Liniensegment.
Die Klasse Liniensegment enthält zwei Referenzen auf Start und Endpunkt.
Jetzt hätte ich das gerne const correct, in dem Sinn, dass ein konstantes Liniensegment Start- bzw. Endpunkt nicht modifizieren darf.Es hapert an dem auskommentierten Konstruktor, da const qualifier da leider nicht erlaubt sind.
class point { // ... }; class line_segment { public: line_segment(point& a, point& b) : _a(a), _b(b) {} /* line_segment(const point& a, const point& b) const : _a(a), _b(b) {} */ // ... point& get_a() { return _a; } const point& get_a() const { return _a; } private: point& _a; point& _b; }; void foo(const point& a, const point& b) { const line_segment segment(a,b); // work with segment } int main() { point a, b; foo(a, b); }
-
Du kannst das nicht in einem Typen unterbringen. Wie willst du verhindern, da die non-
const-Variante vonget_a()aufgerufen wird, wenn die Instanz mitconst-Referenzen initialisiert wurde?Dasselbe Problem gibt es ja bei Iteratoren, und deshalb gibt es auch immer einen
iteratorund einenconst_iterator.
-
Ich verstehe das Problem nicht so ganz:
Ein konstantes Linien-Segment ist dochpoint a; point b; line_segment const ls(a, b);und auf dem lassen sich nur konstante Methoden aufrufen?!
ls.get_a gibt Dir also die konstante Zugriffsmethode und entsprechend eine konstante Referenz zurück.
-
Ich verstehe das Problem nicht so ganz:
const point a; bekommst du aber trotzdem nicht durch den ctor - und er scheint eben schon eine solchen irgendwo in den haenden zu haben - aber manchmal will er auch einen non-const verwenden
passt nicht in eine klasse - am besten machst du dir eine const_line und eine line oder sowas - kannst ja mit template als Basis arbeiten