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

[C++] Implementacja kolejki

Object Storage Arubacloud
0 głosów
762 wizyt
pytanie zadane 29 kwietnia 2017 w C i C++ przez Łukasz Świtaj Użytkownik (520 p.)

Siemanko, staram się ogarnąć implementację kolejki w C++. Tak się staram i staram i napotykam najgorszy problem z jakim można się spotkać koder - nie kompiluje mi się. Musiałem coś źle napisać w szablonie konstruktora, ale sam nie mogę wpaść co jest nie tak.
Chodzi o to, że main nie przyjmuje deklaracji Queue<int> kolejka(size); i wyrzuca błąd. Dałbym radę ktoś pomóc?

 

pliki:
main.cpp 

Queue.h 

Queue.cpp 

2 odpowiedzi

+2 głosów
odpowiedź 29 kwietnia 2017 przez criss Mędrzec (172,590 p.)
wybrane 29 kwietnia 2017 przez Łukasz Świtaj
 
Najlepsza

Definicje szablonów muszą być znane w czasie kompilacji. Tzn. nie mogą być w w pliku .cpp. No chyba, że jakoś inaczej to rozwiążesz. Możesz zostawić definicje tych wszystkich metod w pliku cpp, ale zaincludować go na końcu headera (pod definicją Queue po prostu). To powinno załatwić sprawe. Ja do takiego rozwiązania osobiście nic nie mam, ale opinie są różne - niektórzy mówią że brzydkie, psuje czytelność i wymaga includowania pliku cpp co jest nieco dziwne.

Nie zagłębiałem się specjalnie w kod, ale zauważyłem kilka rzeczy które być może warto poprawić: 

  • Node powinna być zadeklarowana wewnątrz definicji Queue (i najlepiej jako private). Nie ma powodu, żeby Node było znane dla ogółu.
  • Duplikacja kodu w konstruktorach. Zamiast
template <class T2>
Queue<T2>::Queue() : MAX_SIZE(10)
{
    front = rear = nullptr;
}

template <class T2>
Queue<T2>::Queue(int qsize) : MAX_SIZE(qsize)
{
	front = rear = nullptr;
}

możesz skorzystać z delegowania konstruktorów:

template <class T2>
Queue<T2>::Queue() : Queue(10) {}

template <class T2>
Queue<T2>::Queue(int qsize) : MAX_SIZE(qsize)
{
	front = rear = nullptr;
}
  • Nie inicjalizujesz membera size

No i na przyszłość: napisz w pytaniu jaki błąd jest wyrzucany przez kompilator.


PS: błąd kompilacji to zdecydowanie nie jest najgorszy problem :D IMO hierarchia wygląda tak (od najlżejszego):

  • błędy kompilacji
  • błędy linkera
  • kompiluje się, ale się wykrzacza z powodu naruszenia pamięci
  • wykrzacza się z powodu przepełnienia stosu
  • crash wewnątrz sterownika
  • wewnętrzny błąd kompilatora (compiler internal error - cholernie rzadka rzecz)

:D 

komentarz 29 kwietnia 2017 przez Łukasz Świtaj Użytkownik (520 p.)
Oki wielkie dzięki, przerzucę wszystko do .h, jeśli chodzi o te konstruktory to akurat roboczo tylko tak zrobione po tym jak kombinowałem żeby to jakoś skompilować. Node'a też przerzucę.
Dziękóweczka!
komentarz 29 kwietnia 2017 przez Łukasz Świtaj Użytkownik (520 p.)
Śmiga <3
komentarz 29 kwietnia 2017 przez criss Mędrzec (172,590 p.)
Prosz :)
komentarz 29 kwietnia 2017 przez mokrowski Mędrzec (155,460 p.)
Przeczytaj faq poniżej. Nawet nie powinieneś implementacji wyrzucać do *.hpp.
0 głosów
odpowiedź 29 kwietnia 2017 przez tangarr Mędrzec (154,860 p.)
Musisz przenieść implementację kolejki do pliku nagłówkowego.
komentarz 29 kwietnia 2017 przez mokrowski Mędrzec (155,460 p.)
Nie... https://isocpp.org/wiki/faq/templates#separate-template-fn-defn-from-decl

I jak się chwilę zastanowić nawet nie powinien.

Podobne pytania

0 głosów
1 odpowiedź 96 wizyt
pytanie zadane 22 maja 2023 w C i C++ przez Dani Obywatel (1,450 p.)
0 głosów
1 odpowiedź 168 wizyt
pytanie zadane 21 maja 2023 w C i C++ przez Dani Obywatel (1,450 p.)
0 głosów
1 odpowiedź 515 wizyt
pytanie zadane 11 września 2017 w C i C++ przez B0nkers Początkujący (310 p.)

92,568 zapytań

141,422 odpowiedzi

319,637 komentarzy

61,957 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!

...