E
Hi,
es geht schon automatisch, wenn du einfache Datentypen hast. z.B. long, float
double, char oder Zeiger. Doch vorsicht bei Zeigern! Es werden immer die
Adressen kopiert. D.h. wenn Du in einer Klasse einen Zeiger auf char* hast
und die Klasse kopierst, kopierst Du in der neuen Klasse die Adresse der
zu kopierenden Klasse. Das wiederum heist, wenn die Kopierte Klasse zerstört
wird, enthält die Kopie einen Zeiger auf ungültigen Speicher!
Deswegen muss man zwei Operatoren Überladen.
1. den Copy-Konstruktor
2. den Zuweisungskonstruktor
Wenn Deine Klasse die CList nicht enthalten würde, würde also alles automatisch
gehen, weil der Kompiler die beiden Operatoren automatisch erzeugt.
Jetzt zu Deiner Klasse.
Wegen der CList must du also einen Copy-Konstruktor und einen Zuweisungsoperator
schreiben.
Das sieht dann so aus:
class CTest
{
public:
double min, max;
CString str;
CList<double, double> data;
CTest() {}; // Default Constructor
CTest(const CTest& rh) // Copy-Constructor
{
*this = rh; // kann auch Zuweisung aufrufen und spart dadurch doppelten Code!
}
CTest& operator = (const CTest& rh) // Assignement
{
if ( this == &rh )
return *this; // schutz vor Selbstzuweisung!
this->max = rh.max; // copy
this->min = rh.min; // copy
this->str = rh.str; // copy
this->data.RemoveAll(); // clear array (neue Zuweisung)
this->data.AddHead(const_cast<CList<double, double>* >(&rh.data)); // special copy!
return *this;
};
};
OK, das wars auch schon.... Hexenwerk?
Nun ist also folgendes möglich:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = 1;
}
else
{
// TODO: code your application's behavior here.
}
CTest x; // Instanz erzeugen
x.max = 100;
x.min = 10;
x.str = _T("Test");
x.data.AddTail(5.0);
x.data.AddTail(7.0);
x.data.AddTail(9.0);
x.data.AddTail(3.0);
CTest y(x); // Copy-Instanz erzeugen
CTest xy = y; // Assignment-Instanz erzeugen
return nRetCode;
}
Im Debugger siehst Du nun, das alle Werte kopiert wurden und nicht einfach
Referenziert mit ausnahme des CString-Members, das liegt daran, weil CStrings
Referenz gezählt werden.
Referenzgezählte Objekte sind eine Thema für sich, aber der Rest sollte nun
klar sein.
Gruss
EB