2016-05-18 11 views
0

Ich brauche einen Kopierkonstruktor für meine Klasse Immagine wie diese zu machen:C++: Copykonstruktor, die eine Funktion mit nicht-const verwendet Parameter

Immagine::Immagine(Immagine& i) 
{ 
    ... 
} 

obviusly, wenn ich versuche, es zu nennen, ich habe so etwas wie : error: invalid initialization of non-const reference of type ‘Immagine&’ from an rvalue of type ‘Immagine’ weil ich es als erklären würde:

Immagine::Immagine(const Immagine& i) 
{ 
    ... 
} 

aber ich kann es nicht tun, weil, ein Immagine Mitglied Objekt iniatialize, verwende ich eine Funktion

Immagine::Immagine(const Immagine& i) 
{ 
    dlib::array2d<dlib::rgb_pixel>& r=i.v; //v is a member of type dlib::array2d<dlib::rgb_pixel> 
    dlib::assign_image(this->dlib_immagine,r); 
} 

Funktion dlib::assign_image(dst,src) ist eine Paket-Funktion und Kopien src in dst aber ohne const bei src Parametern deklariert, also wenn ich i als const erklären bekomme ich einen Fehler ... Wie kann ich dieses Problem lösen?

+1

Ich sehe Sie nicht mit 'i' ... – vu1p3n0x

+1

Sie fügen eine' ... etwas ... 'Blackbox in Ihrem Beispiel, die es unmöglich macht, etwas abzuleiten. Ich bezweifle, dass Sie einen Fehler bei "assign_image" bekommen. 'r' ist bereits eine nicht-konstante Referenz. – luk32

+1

bist du sicher? ihre Quelle zeigt 'dlib :: assign_image()' nimmt einen konstanten 'src_img' Parameter. http://dlib.net/dlib/image_transforms/assign_image_abstract.h.html#assign_image oder verwenden Sie eine ältere Version – vu1p3n0x

Antwort

5

Unter der Annahme, dass Sie nicht dlib::assign_image() ein const Immagine nehmen ändern können, und Sie sind sicher, dass es nicht wirklich etwas ändern wird, dann würde ich ein const_cast verwenden, um die const-ness von i zu entfernen.

Im Allgemeinen ist es am besten, const_cast nicht zu verwenden, wenn Sie eine andere Option haben, aber IMO const_cast wird am besten verwendet, wenn Legacy-Code aufgerufen wird, der nicht const korrekt ist, aber Ihr Code ist.

+0

const_cast scheint nur mit Zeigern zu arbeiten ... – volperossa

+1

@volperossa Ich habe es nicht versucht, aber ich nehme an, es würde auch mit Referenzen arbeiten. Ich kann jedoch sehen, dass es nicht mit Instanzen funktioniert (da dies eine Objektkopie verursachen würde). – Andy