Wpis z mikrobloga

@OstryKepucz: jeśli klasa ma w sobie tablicę alokowaną dynamicznie, to dlaczego jej rozmiar jest stały? To bez sensu.

Metoda clone to właściwie konstruktor kopiujący, a w przypadku składników - danych wskaźników różnica polega na tym, że wskaźnik nie może bezmyślnie pokazać na to samo miejsce w pamięci, co nie? Bo zonk będzie. Tworzysz więc nowy obszar w pamięci (jak w konstruktorze), na który pokazuje nowy wskaźnik i dopiero wtedy przepisujesz wartości.
@cpp17: niezbyt rozumiem o co chodzi przy

jeśli klasa ma w sobie tablicę alokowaną dynamicznie, to dlaczego jej rozmiar jest stały? To bez sensu.


W konstruktorze jest domyślna wartość, ale przy tworzeniu klasy można nadać jej dowolną wielkość lub pozostawić domyślną.
@OstryKepucz: zaletą tablicy dynamicznej jest to, że może ona zmieniać swoje rozmiary w dowolnym momencie. Zamiast ustawiać raz na zawsze 20 / 50 / 10000 itd. powinieneś skorzystać z dobrodziejstw enkapsulacji i wynieść zmienną (nie stałą) int size_of_tab do przestrzeni private.
@cpp17: w pełni się z tobą zgadzam, tylko w tej klasie nie planuje rozszerzania tej tablicy więc, czy ma to jakiś wpływ to że to będzie po prostu zmienna const? Przecież rozmiaru tablicy i tak nie zmienię :c

A dwa nadal kurde nie potrafie zrozumieć jak napisać tą metodę wykonująca głęboką kopie (nie wiem czy to skutek już okropnego zmęczenia czy po prostu jestem tępy :/). Mógłbyś mi to bardziej "przejrzyście"
@OstryKepucz: powinieneś dynamicznie alokować pamięć na zawartość tego tab a nie cały array. Ogólnie to głęboka kopie robi się tak.

Alokacja nowej pamięci o rozmiarze taki jaki my posiadamy.

Sprawdzenie czy Alokacja się udała

Przeiterowanie przez elementy naszej tablicy i wrzucenie jej do tej nowo zalokowanej pamięci.

Stworzenie nowego obiektu array i przypisanie mu tej pamięci.

Zwrócenie obiektu array (obiektu a nie wskaźnika)
@cpp17: niby tak samo cały czas rozumuje...
w clone() zwracam wskaźnik do nowozaalkowanej klasy o rozmiarze tablicy wpisanej przez konstruktor, potem mając wskaźnik do tej klasy kopiuje zawartość klasy z której została ta metoda wywołana i zwracam ostatecznie wskaźnik do tej "nowej" klasy.

(chyba że mam zaalokować coś w stylu Array* copy= new Array; i wtedy dopiero dokonać copy->tab= new int(sizeoftab) ?)
@cpp17: u mnie raczej nie jest problem,z przepisaniem danych, tylko zaalokowaniem tej klasy, tak teraz sobie myślę skoro alokuje "rozmiar" klasy, a rozmiar klasy w sumie jest stały bo sama zawiera wskaźnik, więc podczas "zajmowania" pamięci nie dokonuje się tworzenie nowej klasy tylko "zajumanie" pamięci która przechowuje tego mojego consta i wskaźnik, a sam konstruktor nie wpływa na rozmiar jakotaki klasy??? Dobrze myślę czy nie?
@cpp17: konkretniej myślałem że takie coś będzie działać:

Array* clone(){
Array* copy= new Array(size_of_tab); alokuje pamięc z konstruktorem równym co do wartości mojego const'a

for(int i=0; itab[i]=tab[i];
}
return copy;
}
@OstryKepucz: bez sensu, zrób po prostu
Array copy = Array(size)
Tworzenie tabeli przez new masz w konstruktorze.

Tam jest kilka błędów, bo jak tworzysz tablice new int(n), to jej maksymalny index to n-1, nie n (back, sprawdzenie w get)
@smyl: tylko polecenie jest takie ()

dodać metodę Array* clone(); – wykonuje głęboką kopię naszego obiektu przy pomocy dynamicznej allokacji.


Więc clone ma zwrócić wskaźnik :/
@smyl: jeśli tak to gdzie?
Oprócz zwracania tego ostatniego elementu nie widzę żebyś coś było nie tak :/
A w mainie była jedynie deklaracja obiektu, potem użyłem metody fill- uzupełnienie całej tablicy a następnie wywołanie funkcji clone() i wypisanie kopii oraz oryginału.

To co w takim razie z tej klasy może mieć wpływ że to się krzaczy :/ Skoro w majnie użyto tylko dwóch metod clone i fill ( ͡°
@smyl: cały czas źle alokowałem tablice xD zamiast new int[] to robiłem new int() (°°
teraz już wszystko działa ( ͡° ͜ʖ ͡°) dzięki @cpp17 (trzeba było napisać że o te nawiasy chodzi, bo ja myślałem że o te z argumentami itd XDD )