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

question-closed Template'owanie klas w jezyku c++

Object Storage Arubacloud
0 głosów
721 wizyt
pytanie zadane 28 lipca 2019 w C i C++ przez DragonCoder Nałogowiec (36,500 p.)
zamknięte 16 sierpnia 2019 przez DragonCoder
Witam,

Czy warto otemplowac kazda klase jaka sie napisze? Jesli nie, to kiedy warto stosowac szablony klas i czy sa one wazna czescia, np. podczas pisania gier?

Pozdrawiam DC
komentarz zamknięcia: uzyskano odpowiednia odpowiedz

5 odpowiedzi

+3 głosów
odpowiedź 28 lipca 2019 przez profesorek96 Szeryf (91,420 p.)
Wiesz to nie jest proste pytanie. Używaj szablonów wtedy kiedy wiesz że tak klasa czy funkcja będzie re używalna i wiesz że może mieć różne warianty typów.
komentarz 29 lipca 2019 przez DragonCoder Nałogowiec (36,500 p.)
Dziekuje za odpowiedź
+3 głosów
odpowiedź 29 lipca 2019 przez tkz Nałogowiec (42,000 p.)

Zależy... Z punktu widzenia kompilatora szablony nie są normalnymi funkcjami ani klasami. Są kompilowane na żądanie, co oznacza, że ​​kod funkcji szablonu nie jest kompilowany, dopóki nie będzie potrzebna instancja z konkretnymi argumentami szablonu. W tym momencie, gdy wymagana jest instancja, kompilator generuje funkcję specjalnie dla tych argumentów z szablonu. Kiedy projekty się rozwijają, zwykle dzieli się kod programu na różne pliki kodu źródłowego. W takich przypadkach interfejs i implementacja są zazwyczaj rozdzielone. Biorąc przykład z biblioteki funkcji, interfejs zazwyczaj składa się z deklaracji prototypów wszystkich funkcji, które można wywołać. Są one zazwyczaj deklarowane w „pliku nagłówkowym” z rozszerzeniem .hpp, a implementacja (definicja tych funkcji) znajduje się w niezależnym pliku z kodem cpp. Ponieważ szablony są kompilowane w razie potrzeby, wymusza to ograniczenie dla wielu plików projekty: implementacja (definicja) klasy lub funkcji szablonu musi znajdować się w tym samym pliku, co deklaracja. Oznacza to, że nie możemy rozdzielić interfejsu w oddzielnym pliku nagłówkowym i że musimy dołączyć zarówno interfejs, jak i implementację do dowolnego pliku, który używa szablonów. Ponieważ żaden kod nie jest generowany, dopóki szablon nie zostanie utworzony, gdy jest to wymagane, kompilatory są przygotowane, aby umożliwić włączenie więcej niż jednego pliku szablonu z deklaracjami i definicjami w projekcie bez generowania błędów łączenia.

Okazuje się, że szablony mogą „programować” system typu C++ http://babel.ls.fi.upm.es/~pablo/Papers/Notes/templates-overview.html#intro

komentarz 29 lipca 2019 przez mokrowski Mędrzec (155,460 p.)
Owszem, umowna. Tak jak konieczność wyprowadzania do pliku *.(i/t)pp. Można pozostawić wpisy w *.cpp
komentarz 29 lipca 2019 przez tkz Nałogowiec (42,000 p.)
Skoro można zostawić w cpp, to po co dodawać tpp?
komentarz 29 lipca 2019 przez mokrowski Mędrzec (155,460 p.)
Bo jest różnica pomiędzy definicją API i ABI. Zawartością bibliotek statycznych/dynamicznych oraz jawnym zobowiązaniem co do konkretyzacji szablonów z danymi typami. Stąd ... lepiej mieć w większym projekcie po prostu porządek.
komentarz 30 lipca 2019 przez adrian17 Ekspert (344,860 p.)

Skoro można zostawić w cpp

".cpp" to konwencja/niepisany kontrakt mówiący, że ten plik będzie osobno kompilowany przez kompilator. Za to inne rozszerzenia, szczgólnie typu ".h", ".hpp", ".cpp.h", ".tpp" etc są tylko #include'owane.

Plik ".cpp" którego nie można osobno kompilować tylko trzeba #include'ować skonfudowałby więc czytającego i zmniejszyło czytelność kodu.

komentarz 30 lipca 2019 przez mokrowski Mędrzec (155,460 p.)
Ja się przychylam bardziej do wydzielenia. Łatwiej to utrzymać bo błąd linkera to często dopisanie do pliku wymuszenia instancjonowania szablonu w znanym miejscu.

Na drugim końcu szali może być argumentacja w stylu "nie wydzielam do innego pliku bo przecież (dla mnie i mojego zespołu), *.cpp emituje kod a *.hpp nie emituje a co do *.Xpp to.... nie znam i nie chcę znać tych typów plików".

To jest na tyle świadomie stosowana technika, że w projekcie raczej po wynegocjowaniu jak będzie zespół to robił, dyskusje są ucinane :-)

Z kolei Qt, czasem ma konieczność include takiego pliku, ze względu na pośredni etap kompilacji wykonywany przez moc (Meta Object Compiler). Ale to już nieco inne zagadnienie.
+3 głosów
odpowiedź 29 lipca 2019 przez MetGang Nałogowiec (34,360 p.)
Ni huhu, unikaj jak ognia, bo się poparzysz. Póki nie masz potrzeby napisania czegoś naprawdę uniwersalnego (jak kolekcje danych czy algorytmy operujące na tych kolekcjach) to się za to nie bierz. Chyba, że jesteś masochistą i lubisz jak logi z błędami kompilacji przekraczają 10x długość kodu.
2
komentarz 29 lipca 2019 przez Janix4000 Nowicjusz (100 p.)
Święte słowa
komentarz 29 lipca 2019 przez mokrowski Mędrzec (155,460 p.)
Bzdura i to na resorach. Jedna z wielu części języka i tyle. Żaden ze standardów przemysłowych nie zabrania stosowania szablonów a wiele efektów da się uzyskać tylko dzięki nim.
komentarz 29 lipca 2019 przez MetGang Nałogowiec (34,360 p.)
Prawda, aczkolwiek tak jak z każdym innym aspektem języka trzeba go używać z głową ;)
1
komentarz 29 lipca 2019 przez MetRiko Nałogowiec (37,110 p.)
Zarówno @MetGang jak i @mokrowski macie trochę racji.. ale myślę, że osoba, która ogarnia już szablony i wie, że można je wykorzystać do wielu rzeczy raczej nie założyłaby takiego postu. Można po tym wnioskować, że OP jest dopiero początkującym w kwestii szablonów, a rada by unikać wstawiania szablonów, gdy nie ma rzeczywistej potrzeby ich używania.. dla takiej osoby jest raczej dobrą radą.
Wiadomo.. Z czasem jak zrozumie szablony dokładniej to będzie mógł iść na całość z metaprogramowaniem czy SFINAE.. ale to już odkryje sam jak douczy się więcej teorii. W końcu szablony spowalniają compile time i wstawianie ich na siłę wszędzie jest bez sensu. Dodatkowo tak jak @MetGang napisał.. błędy szablonowe (tym bardziej bez jakiegoś clanga pod ręką) to piekło dla początkującego w tym zagadnieniu. Więc rada by ich unikać tam gdzie nie są potrzebne pomoże mu nauczyć się rozwiązywać błędy szablonowe na prostych przykładach.
komentarz 29 lipca 2019 przez mokrowski Mędrzec (155,460 p.)
Osobiście nie popełniam błędu zakładania "kto jest jaką osobą" i "na jakim etapie jest". A już szczególnie w kwestii definiowania "czym może się poparzyć" ani "kiedy czego powinna się uczyć" i co w związku z tym będzie "relatiwizowaną prawdą" dla niej "bo ja tak przypuszczam". Przez takie podejście hamuje się ciekawość, chęć eksperymentowania i samodzielny rozwój. To jest nauka programowania a nie nauka obsługi procedury startu statku kosmicznego w zatłoczonym kosmo-porcie. Szablony są techniką której można się uczyć już na samym wstępie a ostrzeganie przed "wąsatą baba-jagą" jest po prostu nadużyciem.

Im wcześniej odczepi się dodatkowe kółka podporowe w rowerku, tym lepiej dla dalszych postępów w nauce :-)
1
komentarz 29 lipca 2019 przez MetGang Nałogowiec (34,360 p.)
Byleby nie jeździć tym rowerkiem po autostradzie :D
komentarz 29 lipca 2019 przez mokrowski Mędrzec (155,460 p.)
Tak ... strata czasu.
+2 głosów
odpowiedź 28 lipca 2019 przez adrian17 Ekspert (344,860 p.)

Jasne, że nie. Podobnie jak nie każdą funkcję owija się klasą i nie każdą linię zamienia się na funkcję.

Jesli nie, to kiedy warto stosowac szablony klas

Kiedy faktycznie potrzebujesz, żeby kod był generyczny (lub masz jakiś bardzo dobry powód żeby wykorzystać takie informacje podczas kompilacji, np do silnych optymalizacji)

i czy sa one wazna czescia, np. podczas pisania gier?

Yup.

komentarz 29 lipca 2019 przez DragonCoder Nałogowiec (36,500 p.)

Yup

Mógłbyś podac przyklad użycia w grach? I dziekuje za odpowiedź 

komentarz 29 lipca 2019 przez profesorek96 Szeryf (91,420 p.)
Proszę bardzo, tutaj masz kod mojej gry. Do sprawdzania kolizji używałem funkcji szablonowych.

https://github.com/profesorek96/ArcanoidV2/blob/master/ArcanoidV2/ArcanoidV2.cpp
+2 głosów
odpowiedź 29 lipca 2019 przez mokrowski Mędrzec (155,460 p.)
Takie luźne uwagi:

Programowanie generyczne, to tylko jedno z zastosowań szablonów. Takie podejście (obecne w bibliotece standardowej w kontenerach danych), umożliwia tworzenie uniwersalnych algorytmów do różnych kontenerów danych. Oczywiście w połączeniu z iteratorami.

Dodatkowo szablony umożliwiają przesunięcie wyborów podejmowanych wcześniej na etapie działania kodu, do etapu kompilacji. Daje to ogromne zyski w prędkości działania i objętości programu. Część działań wykonywana jest na etapie kompilacji.

Szablony umożliwiają także implementowanie polimorfizmu statycznego który pozwala na szybsze wywołanie funkcji bez pośrednictwa translacji w vtable.

Szablony są także językiem funkcyjnym który umożliwia tworzenie programów operujących na stałych i typach danych. Włącznie z implementacją kontenerów szablonowych, algorytmów pracujących na szablonach oraz iteratorów szablonowych. To nieco egzotyczny rodzaj programowania ale bardzo użyteczny w poważnych projektach (np. systemy transformacji typów lub generowanie środowisk akustycznych pomieszczeń w grach).

Szablony dają także możliwość zapisania np. definicji maszyny stanu w jednym miejscu i wygenerowanie bardzo efektywnego kodu obsługi tejże.

Oczywiście nie zawsze jest to potrzebne ani konieczne. Jeśli nie znasz szablonów, to się ich naucz. Nie zrobisz tego nie eksperymentując. Straszenie że to wiedza tajemna mija się z celem. Ich praktyczne zastosowania są bardzo użyteczne.
komentarz 29 lipca 2019 przez DragonCoder Nałogowiec (36,500 p.)
O to wlansie mi chodzilo, bo wszedzie ludzie pisza tylko ogolnikowo, no uzywasz, gdy chcesz ustalic jakiego typu ma byc klasa/funkcja. A Ty podales dokładniejsze przykłady, tak samo z grami, co sie przyda bo sam jestem w trakcie planowania.

Dziękuję bardzo

Podobne pytania

0 głosów
0 odpowiedzi 311 wizyt
pytanie zadane 12 marca 2022 w C i C++ przez Billy Użytkownik (680 p.)
0 głosów
1 odpowiedź 195 wizyt
pytanie zadane 31 marca 2018 w C i C++ przez HappyEnd Nowicjusz (140 p.)
0 głosów
2 odpowiedzi 174 wizyt
pytanie zadane 4 stycznia 2018 w C i C++ przez Philip Bywalec (2,320 p.)

92,536 zapytań

141,377 odpowiedzi

319,455 komentarzy

61,922 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...