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

[C++] Implementacja kolejki

Cloud VPS
0 głosów
1,058 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,570 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,570 p.)
Prosz :)
komentarz 29 kwietnia 2017 przez mokrowski Mędrzec (158,840 p.)
Przeczytaj faq poniżej. Nawet nie powinieneś implementacji wyrzucać do *.hpp.
0 głosów
odpowiedź 29 kwietnia 2017 przez tangarr Mędrzec (155,180 p.)
Musisz przenieść implementację kolejki do pliku nagłówkowego.
komentarz 29 kwietnia 2017 przez mokrowski Mędrzec (158,840 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ź 163 wizyt
pytanie zadane 22 maja 2023 w C i C++ przez Dani Obywatel (1,450 p.)
0 głosów
1 odpowiedź 373 wizyt
pytanie zadane 21 maja 2023 w C i C++ przez Dani Obywatel (1,450 p.)
0 głosów
1 odpowiedź 733 wizyt
pytanie zadane 11 września 2017 w C i C++ przez B0nkers Początkujący (310 p.)

93,456 zapytań

142,451 odpowiedzi

322,721 komentarzy

62,837 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
...