operatoren + * = ueberladen



  • Hallo,
    ich wuerde gerne eine Art lineare-algebra vektor-klasse schreiben. Mit den instanzen dieser klasse sollte man rechnen koennen, ich wuerde also gerne diese myVector (nenne ich nun so, weil die klasse so heisst) addieren koennen, etc etc. Folgendes sollte also moegloch sein:

    myVector x,y,z; 
    //initialize vectors here... 
    x = y+z;
    

    Wenn ich also nichts falsch verstanden habe sollte dies moeglich sein indem ich die operatoren 0, +, * etc ueberlade und mit Vektor-Semantik fuelle.
    Hier starten nun also meine Probleme: Meine implementation sieht bisher also so aus:

    myVector myVector::operator +(myVector val){ 
             myVector result; 
             //hier wird herumgerechnet
             return result; 
    }
    

    Nun habe ich also folgendes probiert (in der Hoffnung es wuerde klappen):

    myVector y,x;
    //y und x werden initialisiert
    myVector x = y+z;
    

    ...und bekomme diesen Fehler hier:

    error:
    main.cpp:123: error: no matching function for call to `myVector::
    myVector(myVector)'
    myVector.h:26: error: candidates are:
    myVectorr::myVector(myVector&)

    Was mache ich falsch? Liegt der Fehler im copy constructor? Dieser sieht so aus (der code an sich stimmt, pFeatVec ist ein array in myVector, dimension seine groesse):

    myVector::myVector(myVector& copy) {
    	dimension = copy.size();
            pFeatVec = new float[dimension];
    	for(int i=0;i<dimension;i++)
    	    pFeatVec[i] = copy[i];
    }
    

    Schonmal 1000 Dank, ich weiss hier einfach nicht weiter ...
    Gruesse
    Tim

    PS: Ich bin mir auch noch ueber die implementation des = operators uneinig.. sollte der void sein? Diese frage ist aber im moment absolut unwichtig im vergleich zum rest ...



  • myVector myVector::operator +(const myVector& val)
    

    (und eigentlich sollte operator+ ein freier Operator sein, kein Member, aber das ist ein anderes Thema).

    myVector::myVector(const myVector& copy)
    

    Edit: Nicht mehr ganz so sicher, ob das wirklich die Ursache für dein Problem ist. Aber es sollte trotzdem so aussehen wie ich es hier geschrieben habe. Ansonsten gilt, mal ein Bißchen mehr Code zeigen.



  • timOS schrieb:

    myVector y,x;
    //y und x werden initialisiert
    myVector x = y+z;
    

    Wo kommt hier z her? Ganz oben stehts noch drin...

    Edit: Defaultkonstruktor definiert?



  • @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...


  • Mod

    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>


  • Mod

    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 😉


Anmelden zum Antworten