Mit dem Zeh (plus plus) auf dem Schlauch Stehender schrieb im Beitrag
#1738878:
> Jetzt bekomme ich vom Compiler die Fehlermeldung:
> error: passing `const IntVector' as `this' argument of `unsigned int
> IntVector::size()' discards qualifiers
Dein Compiler teilt dir mit, dass du die Memberfunktion size nicht
aufrufen darfst.
In deinem Copy Contructor hast du mit dem const in der Argumentliste dem
Aufrufer gegenüber die Zusicherung gemacht, dass du das Argument nicht
verändern wirst.
Nur: die Memberfunktion size() macht diese Zusicherung nicht! D.h. aus
Sicht des Aufrufers: er muss damit rechnen, dass sich das Objekt durch
Aufruf der Funktion size() verändern wird.
Das passt jetzt aber nicht zusammen: Auf der einen Seite macht der Copy
Constructor die Zusicherung: Ich ändere das Objekt nicht, auf der
anderen Seite möchte er eine Funktion aufrufen die nicht garantiert, das
das Objekt nicht verändert wird.
Lösung des Dilemmas:
Da size() das Objekt ja nicht verändern braucht, machen wir die Funktion
einfach const. Dann sind alle glücklich
1 | class IntVector {
|
2 |
|
3 | ...
|
4 | unsigned int size() const;
|
5 | ...
|
6 | };
|
und natürlich auch in der Implementierung das const noch anfügen
1 | unsigned int IntVector::size() const
|
2 | {
|
3 | return len;
|
4 | }
|
PS:
Auch im Op= ist das Argument eine const Referenz.
1 | IntVector& IntVector::operator=(const IntVector& ivec)
|
Das man einen Op= so nicht schreibt, weil er nicht exception safe ist,
lass ich erst mal unkommentiert. Das wird zuviel auf einmal.