2012-04-10 2 views
1

Ich mache ein Programm, und so weit so gut, wenn es um die Implementierung geht, aber jetzt bin ich mit trivialen Problem stecken, aber ich bin nicht in der Lage, eine Lösung dafür zu finden. Das Problem ist in diesem Teil des Codes, und sagt, esFehler C2662 Ausgabe

Fehler 1 Fehler C2662: 'Smetler :: action': nicht konvertieren kann 'diesen' Zeiger von 'const Smetler' auf 'Smetler &'

Wer weiß, was das Problem hier ist, da ich sicher bin, dass ich alles angewendet habe, was es gesagt wurde.

virtual void action() 
    { 
    std::cout << "I'm a copy" << copy() << ". Doing observations." << std::endl; 
    }  
    Smetler* copy() const { return new Smetler (*this); }  
    private: 
    void writeDown(ostream& wd) const        
    { 
     wd << Worker::getOccupation() << " " << Worker::getName() << ',' << Worker::getPosition() << action(); 
    } 
    }; 

Vielen Dank im Voraus.

+0

Zunächst einmal Sie zu schreiben bedeutete 'return new Smetler (* Dies); 'Dies ist auch kein guter Programmierstil. Sicherlich werden Sie früher oder später Speicherlecks bekommen. Verwenden Sie intelligente Zeiger! –

+0

Sie haben auch kein relevantes Stück Code geliefert. –

+0

Ja, es war ein Fehler beim Schreiben hier gemacht. Es sind ungefähr 3000 Zeilen Code, die Sache ist, dass er hier weint, also habe ich diesen Teil des Codes gepostet. –

Antwort

5

Sie haben dies:

Smetler* copy() const { return new Smetler* (*this); }  

Dies weist kein Smetler Objekt. Es weist einen Zeiger vom Typ Smetler zu. Sie versuchen, ein const Smetler& (das ist der Typ von *this in const Funktionen) zu einem Smetler* zu konvertieren, was natürlich nicht viel Sinn macht.

Was möchten Sie wahrscheinlich ist dies:

Smetler* copy() const { return new Smetler(*this); } 

Die oben wird eine neue Smetler auf dem freien Speicher und kopiert das this Objekt in den neuen Raum zuzuordnen. Sie müssen den zurückgegebenen Zeiger schließlich delete, um Speicherverluste zu vermeiden.

Was Sie wirklich wollen, ist ein intelligenter Zeiger verwenden, so dass Sie sich keine Gedanken darüber machen müssen, um delete den zurückgegebenen Zeiger von copy() -Ing. In C++ 03, können Sie std::auto_ptr verwenden (obwohl es veraltet ist, da sie aus Versehen in einer unsicheren Situation verwendet werden können, zB Sie nicht auto_ptr s in Behältern wie std::vector verwenden):

std::auto_ptr<Smetler> copy() const 
{ 
    return std::auto_ptr<Smetler>(new Smetler(*this)); 
} 

Oder, wenn Sie können C++ 11 verwenden, verwenden Sie die viel bessere std::unique_ptr, die keine auto_ptr Probleme hat.

std::unique_ptr<Smetler> copy() const 
{ 
    return std::unique_ptr<Smetler>(new Smetler(*this)); 
} 

Beide oben genannten Code-Schnipsel wird mit dem Verhindern von Speicherlecks einen langen Weg helfen (und nicht mit über sie in erster Linie sorgen!)

+0

Ja, es war falsch geschrieben, während ich hier schreibe, das habe ich wirklich geschrieben. Die Sache mit dem intelligenten Zeiger ist nett, also werde ich es versuchen. :) –

+0

Danke, das ist genau das, was ich gesucht habe. :) –