Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++ template<typename ...> - klasa w pliku .h i .cpp

Ostatnio zmodyfikowano 2023-10-02 12:25
Autor Wiadomość
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:

C/C++
#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();
       
Node( dataType data )
       
{
           
this->data = data;
       
}
       
~Node()
       
{
           
//delete next;
       
}
       
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ę. :)
P-180393
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_template

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?
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.
P-180396
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ł).
P-180397
GrhuGhu
Temat założony przez niniejszego użytkownika
» 2023-10-02 12:25:22
Rozumiem, dziękuję za odpowiedź. :)
P-180398
« 1 »
  Strona 1 z 1