C++ template<typename ...> - klasa w pliku .h i .cpp
Ostatnio zmodyfikowano 2023-10-02 12:25
GrhuGhu Temat założony przez niniejszego użytkownika |
C++ template<typename ...> - klasa w pliku .h i .cpp » 2023-09-30 13:53:40 Cześć! Zacząłem bawić się templatkami w C++ i napisałem taki stos: #pragma once
template < typename dataType > class Stack { public: Stack() { top = nullptr; size = 0; } ~Stack() { Node < dataType > * temp; while( top != nullptr ) { temp = top->next; delete top; top = temp; } } void push( dataType data ) { Node < dataType > * temp = new Node < dataType >( data ); temp->next = top; top = temp; size++; } dataType pop() { if( top == nullptr ) return 0; Node < dataType > * temp = top; top = temp->next; dataType tempData = temp->data; temp->next = nullptr; delete temp; return tempData; size--; } bool isEmpty() { if( top == nullptr ) return true; else return false; } private: template < typename dataType > class Node { private: dataType data; Node < dataType > * next; Node( dataType data ) { this->data = data; } ~Node() { } friend class Stack < dataType >; }; Node < dataType > * top; int size; };
Kod się kompiluje i ładnie śmiga, tylko że moim pierwotnym założeniem było zachowanie "etyki" tworzenia klas(Klasa w pliku .h, a metody klasy w pliku .cpp), męczyłem się z tym dobre 4 godziny, niestety bezskutecznie. Kompilator cały czas walił błędami i to coraz dziwniejszymi (Coś w stylu "Undefined Node<dataType>::Node([#@@#$%%@#$@#$@#]) ) ,a i sam visual studio wyrzuca błąd przy chociażby próbie automatycznego stworzenia deklaracji metody klasy. Mam więc do was moi Drodzy dwa pytanka: 1.Istnieje jakiś sposób na rozdzielenie tego kodu na plik.h i plik.cpp? (Przy moich próbach już samo stworzenie konstruktora z parametrami waliło błędami, nie ważne gdzie co i jak bym powstawiał. W pewnym momencie dosłownie już zacząłem próbować wszystkich możliwych kombinacji. Ofc, konstruktor bez parametrów działał, żeby było śmieszniej...) 2.Jest jakiś sposób na wyciągnięcie klasy "Node" z klasy "Stack" tak aby obydwie znajdowały się w jednym pliku nagłówkowym? - Tutaj podobna sytuacja co wyżej, nie ważne czego próbowałem nic nie działało. Jak znam życie to odpowiedzi na moje pytania są banalne, i gdybym jeszcze trochę poszukał to bym znalazł. Niestety czas mnie goni, i nie mam już siły męczyć się z tym i tracić więcej czasu więc bardzo proszę was o jakąś wskazówkę. Z góry dziękuję za poświęconą mi uwagę. :) |
|
pekfos |
» 2023-09-30 18:49:24 1.Istnieje jakiś sposób na rozdzielenie tego kodu na plik.h i plik.cpp? Istnieje, ale wtedy będziesz mógł używać tego szablonu tylko dla zamkniętego zbioru typów, które będziesz musiał wtedy precyzyjnie wymienić. Raczej nie nadaje się dla kontenera. Patrz "Explicit instantiation" w https://en.cppreference.com/w/cpp/language/class_template2.Jest jakiś sposób na wyciągnięcie klasy "Node" z klasy "Stack" tak aby obydwie znajdowały się w jednym pliku nagłówkowym? A po co? Node nawet nie musi być szablonem gdy jest w środku, a na zewnątrz jest całkowicie bezużyteczna bo wszystko ma prywatne. Node powinno być tu strukturą ze wszystkim publicznym. Tak tego używasz, wiec po co kombinować z przyjaźniami? I tak cała definicja tej klasy jest prywatna. |
|
jankowalski25 |
» 2023-10-01 17:50:48 Istnieje, ale wtedy będziesz mógł używać tego szablonu tylko dla zamkniętego zbioru typów, które będziesz musiał wtedy precyzyjnie wymienić. Da się prościej, można mieć deklarację w jednym pliku, zaś implementację w drugim i robić #include "plik_impl.h" tuż za deklaracją z pliku nagłówkowego. Przy czym o ile takie podejście "działa", bo #include robi głównie copy-paste, o tyle to psuje na przykład zasadę, że wszystkie nagłówki mają być na początku. Także cóż, da się, ale pytanie jakim kosztem i w jakim celu? Bo jeśli chodzi o wydajność, to i tak tutaj za wiele się nie ugra ( kiedyś ludzie chcieli robić export template , ale z tego co wiem, to ten pomysł nie wypalił). |
|
GrhuGhu Temat założony przez niniejszego użytkownika |
» 2023-10-02 12:25:22 Rozumiem, dziękuję za odpowiedź. :) |
|
« 1 » |