operatoren + * = ueberladen
-
@Z2:
wenn ich den code so aendere bekomme ich leider folgenden Fehler:In copy constructor
myVector::myVector(const myVector&)': myVector.cpp:34: error: passing \const myVector' as `this' argument of `int myVector::size()' discards qualifiers...nur leider kann ich damit ebensowenig anfangen

@Newow:
Sorry, das sollte natuerlich myVector y,x,z; heissen und es werden auch alle drei initialisiert...
-
Z2 schrieb:
Nicht mehr ganz so sicher, ob das wirklich die Ursache für dein Problem ist.
ja, ist es. das funktionsergebnis des +operators ist ein rvalue und kann folglich nur an referenzen auf const gebunden werden.
-
<edit> Defaultkonstruktor gibt es nicht, weil jeder Vector mit einer groesse/dimension erstellt wird... Diese wird an den Konstruktor uebergeben..
</edit>
-
die size memberfunktion ist vermutlich nicht const und kann dann nur auf nicht-const objekte (also nicht auf dem argument des korrigierten copy-ctors) aufgerufen werden. zeig doch mal die definition dre klasse.
-
TimOS schrieb:
<edit> Defaultkonstruktor gibt es nicht, weil jeder Vector mit einer groesse/dimension erstellt wird... Diese wird an den Konstruktor uebergeben..
</edit>Laut deinem Code müsste es aber einen geben.
Und zwar dafür:myVector myVector::operator +(myVector val){ myVector result; //hier wird herumgerechnet return result; }Edit(mal wieder): Also prinzipiell sollte dein Code compilierbar gewesen sein, zumindest das was hier zu sehen war. Zumindest ist mein Comipler so gnädig. Ist natürlich noch lange kein grund die Vorschläge weiter oben zu ignorieren, da du einige unnötige Kopieraktionen drin hast. Wenn die bisherigen Vorschläge nichts helfen, brauchts wirklich mehr Code hier.
-
camper schrieb:
Z2 schrieb:
Nicht mehr ganz so sicher, ob das wirklich die Ursache für dein Problem ist.
ja, ist es. das funktionsergebnis des +operators ist ein rvalue und kann folglich nur an referenzen auf const gebunden werden.
Ups. Hab übersehen, daß da der Copy-Konstruktor aufgerufen wird. Du hast natürlich Recht.
-
Sorry dass ich mich erst jetzt wieder melde, aber ich war gestern unterwegs..
Die jedenfalls voruebergehende Loesung fuer das Problem war die Methode size() auch als const zu definieren, nun kommt hierfuer kein Compilerfehler mehr.. Es stimmte also dass ich im copy-construktor auf eine nicht-const funktion des const-objektes zugegriffen habe und das war natuerlich quatsch. Ich habe nun also alle Member-Methoden die das Objekt nicht veraendern const gemacht. das war doch im Grunde richtig so oder nicht?
Seitdem ich aber die size-methode zu const definiert habe, habe ich die Probleme an anderer stelle. Ich hatte geohoffe, dass const als solches nicht die anderen aufrufe stoeren sollte.. leider etwas voreilig.
Seitdem size() (eine Methode die nur die derzeitige Groesse zurueckgibt) nun als const definiert ist bekomme ich fehler fuer alle anderen Verwendungen dieser Methode z.B.
Metric.o(.text+0x231):/home_stud/06/Metric.cpp:39: undefined reference to `FeatureVector::size()'
//und diese Fehlermeldung natuerlich fuer alle nun const-Methoden..Wie kann das kommen? Ich dachte const wuerde nur zeigen dass durch diese Methode das Objekt nict veraendert wird.. Muss ich solche Methoden nun anders aufrufen?
Vielen Dank fuer eure Hilfe,..
Tim
-
TimOS schrieb:
Ich habe nun also alle Member-Methoden die das Objekt nicht veraendern const gemacht. das war doch im Grunde richtig so oder nicht?
Ja, das ist richtig so.
Seitdem size() (eine Methode die nur die derzeitige Groesse zurueckgibt) nun als const definiert ist bekomme ich fehler fuer alle anderen Verwendungen dieser Methode z.B.
Metric.o(.text+0x231):/home_stud/06/Metric.cpp:39: undefined reference to `FeatureVector::size()'
//und diese Fehlermeldung natuerlich fuer alle nun const-Methoden..Wie kann das kommen? Ich dachte const wuerde nur zeigen dass durch diese Methode das Objekt nict veraendert wird.. Muss ich solche Methoden nun anders aufrufen?
Hm, kann es sein, daß Du nur die Deklaration geändert hast, aber nicht die Definition? Die Syntax zum Aufruf ist identisch zu non-const Funktionen. Wenn Du eine Methode allerdings const deklarierst mußt Du auch in der Implementierung (die möglicherweise in der cpp-Datei steht) das const dazuschreiben, sonst sind das verschiedene Methoden.
MfG jester
-
hatte ich auch schon ueberprueft, sind aber alle identisch ...
Z.B.
deklaration:int size() const;implementation:
int FeatureVector::size() const{ return dimension; }evtl andere Vorschlaege? Oder ist hier etwas falsch?
-
hier noch der Aufruf der Methode aus einer anderen Klasse:
float Metric::test(FeatureVector* fv1, FeatureVector* fv2, FeatureVector* lambda) { for (int i=0;i<fv1->size();i++) { //do something } return 1; }PS: Diese Methoede ist nur ein test-dummy,.. also nicht ueber das return oder aehnliches aufregen

-
make clean hat es gerichtet... danke fuer eure Hilfe
