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 von get_a() aufgerufen wird, wenn die Instanz mit const -Referenzen initialisiert wurde?

    Dasselbe Problem gibt es ja bei Iteratoren, und deshalb gibt es auch immer einen iterator und einen const_iterator .



  • Ich verstehe das Problem nicht so ganz:
    Ein konstantes Linien-Segment ist doch

    point 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


Anmelden zum Antworten