Wpis z mikrobloga

Mirki zrobiłem taką klase https://pastebin.com/GCDxCB50 do której mam dodać metodę Array* clone(); – wykonuje głęboką kopię naszego obiektu przy pomocy dynamicznej allokacji. W jaki sposób to osiągnąć próbowałem

Array* copy= new Array(size_of_tab);
i wtedy przepisać dane ale niestety to nie działa ( ͡° ʖ̯ ͡°)
i czy dobrze mam wykonany destruktor?
#programowanie #cplusplus #cpp
  • 26
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@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
  • Odpowiedz
@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ą.
  • Odpowiedz
@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.
  • Odpowiedz
@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
  • Odpowiedz
@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ę
  • Odpowiedz
@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) ?)
  • Odpowiedz
@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?
  • Odpowiedz
@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
  • Odpowiedz
@OstryKepucz: proponuję kupić sobie książkę Grębosza i uczyć się od rozdziału "wskaźniki". Grębosz zbiera różne recenzje, ale takie sprawy jak wyżej tłumaczy bardzo dobrze. Wszystko jedno, opus magnum czy Symfonia (ta pierwsza ma kwiatki z C++11)
  • Odpowiedz
@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)
  • Odpowiedz
@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 :/
  • Odpowiedz