Poczytaj o konstruktorze kopiującym, i operatorze przypisania. Jeżeli w klasie masz jakieś wskaźniki, albo tworzysz dynamiczne tablice (jakby nie patrzeć tez wskaźniki), to nie powinieneś przypisywać obiektu do innego obiektu. Chodzi o to że obiekty standardowo są kopiowane wartość po wartości. Zobacz na ten przykład:
#include <iostream>
using namespace std;
struct jakas_klasa
{
int *tablica;
jakas_klasa (int rozmiar)
{
tablica = new int [rozmiar];
}
~jakas_klasa ()
{
delete tablica;
tablica = 0;
}
};
int main ()
{
jakas_klasa jakis_obiekt_pierwszy(20), jakis_obiekt_drugi(10);
cout<<jakis_obiekt_pierwszy.tablica<<'\n';
cout<<jakis_obiekt_drugi.tablica<<"\n\n";
jakis_obiekt_drugi = jakis_obiekt_pierwszy;
cout<<jakis_obiekt_pierwszy.tablica<<'\n';
cout<<jakis_obiekt_drugi.tablica;
return 0;
}
U mnie ten program dał takie wyniki:
adres tablicy z pierwszego obiektu: 0x8e1038
adres tablicy z drugiego obiektu: 0x8e1090
adres tablicy z pierwszego obiektu: 0x8e1038
adres tablicy z drugiego obiektu: 0x8e1038
Jak widzisz w obu obiektach wskaźnik tablica wskazuje na ten sam obszar w pamieci. jeżeli teraz jeden z tych obiektow przestałby istnieć (np wyszedł poza zakres) i wywołałby swój destruktor, to drugi wskazywałby ciągle w to samo miejsce przez co stałby się bezużyteczny i mogłby doprowadzić do wysypania sie programu. Można temu zaradzić tworząc odpowiedni konstruktor kopiujący i operator przypisania. Po modyfikacji ta klasa wygląda tak:
struct jakas_klasa
{
int *tablica;
int rozmiar;
jakas_klasa (int r) // zwykly konstruktor
{
rozmiar = r;
tablica = new int [rozmiar];
}
jakas_klasa (const jakas_klasa& temp) //konstruktor kopiujacy
{
delete tablica; // trzeba usunac stara tablice
tablica = 0;
rozmiar = temp.rozmiar; //kopia ma byc tego samego rozmiaru co oryginal
tablica = new int [rozmiar]; //tworze nowa tablice
for (int i = 0; i < rozmiar; ++i) // przepisuje wartosci z oryginalnego obiektu do kopii
tablica[i] = temp.tablica[i];
}
const jakas_klasa& operator = (const jakas_klasa& temp) // operator przypisania
{
delete tablica;
tablica = 0;
rozmiar = temp.rozmiar;
tablica = new int [rozmiar];
for (int i = 0; i < rozmiar; ++i)
tablica[i] = temp.tablica[i];
return *this; //zwracam siebie, jest to potrzebne zeby mozna bylo kozystac z operatora np w taki sposob: a = b = c;
}
~jakas_klasa ()
{
delete tablica;
tablica = 0;
rozmiar = 0;
}
};
Teraz obiekty powinny byc kopiowane prawidłowo.