• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tablice a dynamiczne alokowanie pamięci

Cloud VPS
0 głosów
600 wizyt
pytanie zadane 10 stycznia 2017 w C i C++ przez czujek22 Dyskutant (7,670 p.)
edycja 10 stycznia 2017 przez czujek22

Zastanawia mnie pewna rzecz. Otóż chcę zrobić tablicę obiektów przez dynamiczne alokowanie pamięci i potem się do nich odwoływać. Problem polega na tym, że jak dotąd myślałem, że tablicę tworzy sie w następujący sposób:

Klasa * wsk = Klasa new [10];

Gdy chciałem odnieść się do składowej klasy, zaskoczyło mnie, że zamiast operatora dostępu '->'(do wskaznikow) trzeba użyć operatora do '.'  pojedynczych obiektow.

Edit. Ok, co do operatorów już wiem, że przesuwa sie wskaźnik. np. (wsk+1)->skladowa;

Nauczyciel mi z kolei powiedział, że robię źle deklaracje alokacji pamieci i powinno to wyglądać w ten sposób:

Klasa * wsk[10] ;
for(int i=0;i<10;i++)
   wsk[i]= Klasa new [i] //tutaj nie pamietam czy bylo [i] za new;

Czy coś w tym stylu. W każdym razie powiedział, że każdy element tablicy powinien miec swoj wskaznik tworzony w petli.

Byłem przkonany, że pierwsza forma jest poprawna. Czy ktoś by mógł mi wytłumaczyć, która z tych form jest dobra ?

 

2 odpowiedzi

0 głosów
odpowiedź 10 stycznia 2017 przez Evelek Nałogowiec (28,960 p.)

Jeśli tworzysz tablicę wskaźników: Klasa * wsk[10] ; to nowe obiekty wrzucasz do tej tablicy przez: wsk[liczba] = new Klasa(konstruktor klasy); Następnie odnosisz się do nich przez "->" czyli np. wsk[0]->metoda_klasa();

Tutaj zła kolejność, najpierw new, potem klasa: Klasa * wsk = new Klasa [10]; Z taką formą się jeszcze nie spotkałem przyznam szczerze, nie wiem co miałby robić taki wskaźnik... wskazywać na co... Już prędzej: Klasa * wskaznik = &obiekt[0], gdzie wskaźnik wskazuje na obiekt[0].

0 głosów
odpowiedź 10 stycznia 2017 przez unknown Nałogowiec (39,560 p.)

Klasa * wsk = Klasa new [10];

Raczej chodziło o:

Klasa * wsk = new Klasa [10];

 Gdy chciałem odnieść się do składowej klasy, zaskoczyło mnie, że zamiast operatora dostępu '->'(do wskaznikow) trzeba użyć operatora do '.'  pojedynczych obiektow.

Bo nie wiesz jak działają operatory '[]' i '->'

 Nauczyciel mi z kolei powiedział, że robię źle deklaracje alokacji pamieci i powinno to wyglądać w ten sposób:

Jeśli zapisałeś to w taki sposób jak ja wyżej poprawiłem to było poprawnie a nauczyciel się myli.

 Czy coś w tym stylu. W każdym razie powiedział, że każdy element tablicy powinien miec swoj wskaznik tworzony w petli.

1. W pętli nie są tworzone wskźniki tylko jest w niej alokowana pamięć

2. Coś takiego jest przydatne, kiedy zamiast usunąć od razu całą tablicę, chcesz usunąć pojedyńczy element, ale jest to dość niebezpieczne i lepiej użyć vector'a

komentarz 10 stycznia 2017 przez Evelek Nałogowiec (28,960 p.)

unknown pytanie mam: Co oznacza ten zapis: Klasa * wsk = new Klasa [10]; ? Tworzymy tablicę 10 obiektów klasy Klasa?

komentarz 10 stycznia 2017 przez unknown Nałogowiec (39,560 p.)
Na stercie alokowana jest pamięć na 10 obiektów typu Klasa

Podobne pytania

0 głosów
1 odpowiedź 1,695 wizyt
0 głosów
3 odpowiedzi 3,394 wizyt
0 głosów
1 odpowiedź 429 wizyt

93,454 zapytań

142,449 odpowiedzi

322,718 komentarzy

62,833 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...