Nagłówki w obiektowości klas

Nagłówki w obiektowości klas
D1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 99
0

Witam

Szukałem ostatnio sposobu na skonstruowanie klasy Biblioteka w najprostszym wydaniu: Biblioteka, Czytelnik, Książka, Pracownik i chciałem to rozłożyć ładnie na 4 klasy z tym, że każda z nich w osobnym pliku, ale tak aby Czytelnik dziedziczył po Bibliotece. Męczyłem się trochę z importowaniem aż natrafiłem w końcu na kwestie nagłówków i z tego co czytałem jest to najlatwiejszy sosób na to aby klasy się widziały jak i zmienne oraz funkcje.

Pytanie czy da to się zrobić jakoś inaczej niżeli określenie struktury aplikacji w nagłówku reszta w pliku cpp wraz z kontruktorami ? Biorę tez pod uwagę rozwiniecie mini projektu więc dobre 100 linijek kodu skrolować to tak mało wygodne :-p

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5549
6

tak aby Czytelnik dziedziczył po Bibliotece

mocny towar. A odpowiadając na pytanie. tak, interfejsy klas powinny być w plikach nagłówkowych. inaczej tak pradawny język jak C++ pewnie tego nie ogarnie (chyba że coś sprytnego wymyślili ostatnio). IHMO jak to twój pierwszy raz z programowaniem i nie robisz tego na studiach to lepiej zacząć od Javy czy C# albo nawet pythonga niż piłować pliki nagłówkowe. no chyba że robisz to na studia czy do szkoły to co innego

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
2
delform_17 napisał(a):

tak aby Czytelnik dziedziczył po Bibliotece

Dziedziczenie jest złe. Zwłaszcza takie. Słyszałem żeby ktoś miał łeb jak sklep, ale jak biblioteka? Rozumiesz że dziedziczenie oznacza że przyjmujesz cały interfejs tego z czego dziedziczysz? Znaczy wszystko co można zrobić z biblioteką będzie można też zrobić z czytelnikiem. Będzie można do niego wejść, wypożyczyć od niego książkę (to akurat ok), będzie można założyć u czytelnika kartę i będzie trzeba siedzieć cicho jak już wejdziesz do czytelnika.

Zasmucę cię - w przypadku tych czterech klas nie ma tu miejsca na jakiekolwiek dziedziczenie. Czytelnik co prawda może odziedziczyć po babci książkę ale tutaj tak to nie działa.
Możesz za to poćwiczyć kompozycję, którą i tak powinieneś wybierać w 99,9% przypadków.

Co do nagłówków to nie ma opcji że chat gpt się wykłada nawet na takim temacie, więc po prostu go użyj. Może mieć pretensje że robisz głupie rzeczy, wtedy też warto go posłuchać i nie zakładać od razu że to ty jesteś tym mądrzejszym.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
4

Dla mnie pytanie jest zbyt abstrakcyjne i ogólnikowe.
Po jakości pytania widać, że jesteś początkujący i jeszcze nie wiesz co wiesz (i czego co nie wiesz). To dlatego pytanie jest bardzo słabej jakości i za bardzo nie można ci pomóc.

Najlepiej skopuj do pytania kod z którym masz problem (być może nawet cały), skopuj błąd jaki zgłasza kompilator/linker, to wtedy może będziemy w stanie się dogadać.

A może masz publiczne repozytorium z tym kodem?

Co do dziedziczenia i OOP internet jest pełny bzdur.

delform_17 napisał(a):

Pytanie czy da to się zrobić jakoś inaczej niżeli określenie struktury aplikacji w nagłówku reszta w pliku cpp wraz z kontruktorami ?

Od C++20 dostępne są moduły, ale wsparcie od kompilatorów dla tego nowego feature, dopiero teraz osiąga dojrzałość.

Biorę tez pod uwagę rozwiniecie mini projektu więc dobre 100 linijek kodu skrolować to tak mało wygodne :-p

100 linijek na plik to jest bardzo mało. Za dużo zaczyna się od ~1200.

SL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1020
1

Zapytaj czata GPT. Poproś o wytłumaczenie struktury plików i dlaczego to działa. To wiedza dla początkujących i nikt ci tego tutaj lepiej nie wytłumaczy niż AI

klasy Biblioteka w najprostszym wydaniu: Biblioteka, Czytelnik, Książka,

Klas nie projektuje się tak, żeby reprezentowały to czym są tylko to co robią. Przykładowo możesz mieć projekt, gdzie masz klasy Dinozaur i Kot. Taki model moze pasować do np.:

  • jakiejś gry dla dzieci, gdzie pojawiają się zwierzątka
  • gry, gdzie Dinozaury to postacie sterowane przez graczy a koty to jedzenie
  • gry, gdzie odpowiednie zwierze to pomocnik głównego bohatera

"Rzeczy" po prostu pasują do wszystkiego i dlatego są złymi abtrakcjami, bo nie odzwierciedlają tego co się dzieje w programie. Klasy powinno się projektować pod konkretne zastosowania i tak przykładowo dla poprzednich przykładów:

  • wystarczy jedna klasa Obrazek , gdzie kot albo dinozaur to po prostu inne instancje klasy z odpowiednim obrazkiem
  • klasa Player i jakaś klasa EdibleItem
  • klasa Companion albo po prostu generyczne Entity

Zauważ, że w żadnym z tym przypadków klasy nie są projektowane pod Dinozaura i Kota.

mwl4
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 404
1

Biblioteka w najprostszym wydaniu: Biblioteka, Czytelnik, Książka, Pracownik

tak aby Czytelnik dziedziczył po Bibliotece

Czytelnik nie jest Biblioteką. Dziedziczenie to relacja is-a. Możesz wprowadzić klasę Człowiek. Wtedy Czytelnik jest Człowiekiem i Pracownik jest Człowiekiem. Ale niekoniecznie musi ci się to przydać.

Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
1
delform_17 napisał(a):

Szukałem ostatnio sposobu na skonstruowanie klasy Biblioteka w najprostszym wydaniu: Biblioteka, Czytelnik, Książka, Pracownik i chciałem to rozłożyć ładnie na 4 klasy z tym, że każda z nich w osobnym pliku, ale tak aby Czytelnik dziedziczył po Bibliotece. Męczyłem się trochę z importowaniem aż natrafiłem w końcu na kwestie nagłówków i z tego co czytałem jest to najlatwiejszy sosób na to aby klasy się widziały jak i zmienne oraz funkcje.

To zupełnie nie o to chodzi w oop. Zapomnij o czymś takim. Podziel klasy według tego co faktycznie program ma robić, a nie według jakiegoś dziwnego modelu.

delform_17 napisał(a):

Pytanie czy da to się zrobić jakoś inaczej niżeli określenie struktury aplikacji w nagłówku reszta w pliku cpp wraz z kontruktorami ? Biorę tez pod uwagę rozwiniecie mini projektu więc dobre 100 linijek kodu skrolować to tak mało wygodne :-p

No niestety C++ osłabił enakspulację C pod tym względem, że teraz wszystkie pola (nawet te które mają być prywatne) są w nagłówku niestety.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.