Fehlermeldung

HolgerX

Mitglied
Ach, wie war die Welt doch einfach, als ich noch mit Java programmieren durfte und mir da abundzu mal eine NullPointerException entgegen sprang, aber bei C++ unter Visual Studio ...
Code:
error C2664: 'Colormapped2Grayscale' : Konvertierung des Parameters 1 von 'class CDib' in 'class CDib' nicht moeglich
        Kein Kopierkonstruktor fuer class 'CDib' verfuegbar

Hallo Computer, ich will doch gar nichts konvertieren!
Was ist bitte ein Kopierkonstruktor?
 
Code:
	CBMPDoc* pDoc = (CBMPDoc*) GetDocument();
	CColorProcessing cp;
	cp.Colormapped2Grayscale(pDoc->m_Dib);

Hmm, ich habe mich gerade ein wenig über den Kopierkonstruktor informiert.
Das Problem ist, dass ich da keinen von angelegt habe (wusste ja vorher gar nicht, das so etwas existiert).
Denn m_Dib ist vom Typ CDib und der hat als Membervariablen auch Pointer, und das wird dann zum Problem. :mad:


Nur habe ich keine Ahnung, was ich alles in den Kopierkonstruktor reinschreiben muss, und wie!
 
Zuletzt bearbeitet:
Kopierkonsturktoren sind unter Umständen eine wichtige Sache, aber kann es sein, dass du hier gar keinen brauchst? Was sind das für Funktionen, an die du m_Dib übergeben willst? Sind die von dir? Dann wäre es eventuell sinnvoll, sie dahingehend zu ändern, dass sie eine (konstante) Refernenz statt einer Kopie erwarten, so wie in void my_func( int& ein_int ); anstelle von void my_func( int ein_int ); . Mangels Informationen kann ich dir nicht mehr Hilfestellung leisten.
 
Jo, das funktioniert! :)

Jetzt habe ich aber mal wieder ein anderes Problem.
Code:
error C2582: 'CDib' : 'Operator =' ist nicht verfuegbar

Ich will einer Instanz von CDib den Wert einer anderen Instanz von CDib zuweisen. Aber wieso geht das nicht mit = ?

Wie soll ich das denn sonst machen
 
Naja, der Compiler weiß halt nicht, was du genau mit dem "=" meinst. Du musst den Operator neu definieren (überladen). Also:

Code:
CDib &CDib::operator = (CDib &zukopieren)
{
...//Anweisungen zum kopieren
}

(Hoffe war kein Fehler, beim Operatorüberladen "vermache" ich mich manchmal :))
 
Nee, schon grösstenteils richtig. Der Zuweisungsoperator bekommt aber eine konstante Referenz, weil er das Quellobjekt ja nicht ändert.

Ansonsten ist der Rumpf nahezu identisch mit dem Kopierkonstruktor:
Code:
CDib& CDib::operator=( const CDib& zukopieren )
{
  if ( this != &zukopieren ) // Selbstzuweisung nach Möglichkeit vermeiden
  {
    // ... Anweisungen zum Kopieren
    // dingsda = zukopieren.dingsda; //usw.
  }  
  
  return *this; // Referenz auf mich zurückgeben analog zu 
                // "=" für eingebaute Datentypen
}
 

Neue Beiträge

Zurück