dwa obiekty różnej wielkość tego samego typu

0

Witam,
uczę się C++ i doszedłem do tworzenia class. Zastanawia mnie co się stanie, gdy utworzę klasę z dynamiczną tablicą a następnie utworzę dwa takie obiekty z inną wielkością tablic a następnie przypiszę jeden obiekt do drugiego?
Tzn. zrobić coś takiego:

 
new_class zmienna1(10); //to w nawiasie to wielkość tablicy dynamicznej :)
new_class zmienna2(50);
new_class zmienna3(10);
zmienna1 = zmienna2; //przypisujemy większą do mniejszej 
zmienna2 = zmienna3; //przypisujemy mniejszą do większej

czy jeśli do obiektu z większą tablicą przypiszę obiekt z mniejszą tablicą to czy ta większa tablica zostanie wypełniona wartościami z tej mniejszej a reszta zostanie "skasowana" -> automatycznie się zmniejszy czy zostanie np. wypełniona zerami lub w ogóle pozostaną stare śmieci? tzn. czy cały obiekt się również zmniejszy czy zostanie tak samo duży ale wypełniony wartościami z tego mniejszego?
Pozdrawiam i dziękuję za odpowiedzi!

0

Zachowanie będzie zależeć tylko i wyłącznie od Ciebie, a konkretniej od tego czy przeładujesz operator przypisania i jak to zrobisz.
Jak nie napiszesz takiego operatora, to żaden z tych wymienionych przez Ciebie przypadków nie będzie mieć miejsca. Dodatkowo instancja tej samej klasy zawsze ma taki sam stały rozmiar.

0

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.

0

Dziękuję bardzo za odpowiedzi!
Szczególnie Tobie "a" :)
zaczynam mniej więcej kumać o co chodzi chociaż będę musiał jeszcze trochę nad tym posiedzieć...
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1