[C++] Tablica obiektów w klasie


(Ollo98) #1

Siema , np. mam taką klasę.

class Mebel

{

string nazwa;

}

class Mieszkaniec

{

   string imie;

}

class Dom

{

public:

    Mebel szafy[];

    Mieszkaniec osoby[];

};

Nie wiem czemu nie mogę usunąć przerw między liniami, zapisuję i się one same robią.

 Po prostu pisze program (oczywiście inny) w którym potrzebuję mieć w klasie tablicę obiektów innej klasy.
 Problem w tym że kompilator pokazuje błąd "Niekompletny typ jest niedozwolony", a VS podkreśla napis "szafy".
 A najciekawsze jest to że taki błąd wywala tylko wtedy kiedy są dwie tablice w klasie.
 Kiedy jest jedna to wszystko działa.
 Chyba chodzi o to, aby podać ilość obiektów w tablicy.
 Oczywiście tutaj takie coś jest zbędne, ale w moim programie przyda mi się posiadanie tablicy obiektów w klasie.
 To jest tylko przykład, ale oczekuję tylko odpowiedzi na pytanie.
 Czy warto tworzyć tablicę obiektów w innej klasie?
 Czy może lepiej użyć innego sposobu?
 Jak już używać to w jaki sposób?
 Z góry dziękuje za pomoc.


(Tinnuir) #2

Hej.

Podany przez ciebie przykład jest oczywiście błędny z technicznego punktu widzenia, czego, mam nadzieje, masz świadomość. Jeśli chodzi o ideę, to przechowywanie obiektów innych klas w konkretnej klasie jak najbardziej ma sens, co zresztą pokazałeś na przykładzie domu wraz z jego mieszkańcami i umeblowaniem. Co do innych pytań/uwag…

Podawanie rozmiaru tablicy nie jest zbędne, lecz niezbędne. Kompilator od początku musi wiedzieć, ile miejsca przygotować na stosie dla mieszkańców i ich mebli (jakkolwiek płomiennie to nie brzmi :wink: ).

Jak sam widzisz, taki sposób przechowywania obiektów nie jest zbyt wygodny, ponieważ z góry musisz ustalić ich limit. Albo więc będziesz marnował pamięć używając tylko trzech miejsc w stumiejscowej tablicy, albo też dojdziesz do momentu, gdy wypełni się ona i nic nie będziesz mógł z tym faktem zrobić.

Są dwie wygodne alternatywy:

  • Dynamiczne tablice. Na początku w klasie Dom zadeklarujesz pola Mebel* szafy i Mieszkaniec* osoby. Następnie najlepiej byłoby napisać konstruktor przyjmujący za argumenty ilość szaf i osób - wewnątrz niego zaalokujesz miejsce dla tablic za pomocą słowa kluczowego new. Pamiętaj, że kompilator sam za ciebie tego miejsca potem nie zwolni. Dodaj więc destruktor, który zajmie się tym przy pomocy polecenia delete. Plusy: każdy obiekt klasy Dom może mieć sprecyzowaną przez ciebie ilość miejsc na meble i mieszkańców. Minusy: nie będziesz mógł łatwo zmienić rozmiarów tablic w utworzonych już obiektach.
  • Wektory. Po prostu. Jeśli nie wiesz, o czym mówię, poczytaj o std::vector (tl;dr: deklaracja wektora: std::vector<typ> nazwa, dodawanie elementu na koniec: push_back(element), usuwanie elementu z końca: pop_back(), zwracanie elementu z końca: back()). Myślę, że to rozwiązanie najbliższe jest temu, czego szukasz. Plusy: wektory same zarządzają pamięcią, kurczą się i rozszerzają, by pomieścić dokładnie tyle elementów ile trzeba. Minusy: jest to rozwiązanie nieco wolniejsze, by z niego skorzystać, potrzebujesz załączyć bibliotekę <vector>

Pozdrawiam

 


(Ollo98) #3

Dzięki Tinnuir za świetną odpowiedź, właśnie po jakimś czasie pomyślałem sobie o STL’u i dzięki że mnie uświadomiłeś że taki sposób jaki przedstawiłeś jest prawidłowy. :slight_smile:
Od teraz będę sobie ogarniać STL’a, czyli <vector> itd.