Szablony - instantiated from here

0

Witam,
Zaimplementowałem sobie stos z użyciem szablonów.


template <class T>
class Stos
{
      private:
              struct Node{ T val; Node* next; };
              Node* top;
      public:
             Stos():top(0) {};
             void push(const T& el);
             T pop();
             bool empty();
};

template <class T> bool Stos<T>::empty() {
     if (top) return true; else return false;
}

template <class T> void Stos<T>::push(const T& element) {
                 Node* e = new Node;
                 e->val = element;
                 e->next = top;
                 top = e;
}

template <class T> T Stos<T>::pop() {
         if (top)
         {
                 Node* x = top;
                 T xa = top->val;
                 top = top->next;
                 delete  x;
                 return xa;
         }
         throw "Stos pusty";
}

Kiedy tworzę stos typu prostego, np. integerów, wszystko działa dobrze. Jednak kiedy stworzę sobie taką klasę:

class Osoba
{
      private:
              string imie;
              string nazwisko;
              int rokUrodzenia; 
      public:
             Osoba(string imie,string nazwisko,int rokUrodzenia):imie(imie),nazwisko(nazwisko),rokUrodzenia(rokUrodzenia){}; 
             void opis() { cout << endl << "Imie:        \t " << imie << endl << "Nazwisko:    \t " << nazwisko << endl << "Rok urodzenia: \t" << rokUrodzenia << endl << endl; };
                 
};

Tworzę sobie stos osób, następnie jakąś osobę i próbuję ją wrzucić na ten stos:

Stos<Osoba> stos;
Osoba osoba("Jan","Kiepura",1902);
stos.push(osoba);

to przy próbie wrzucenia jej na stos pojawia się błąd "instantiated from here". W czym leży problem?

0

Zdefiniuj domyślny konstruktor klasie Osoba.

0

działa, dzięki ;)

0

Drugim rozwiązaniem może być dodanie konstruktora do klasy node, który przyjmuje T i wpisuje do val w liście inicjalizacyjnej. Nie ma potrzeby wymagać do używania takiego kontenera tego, że obiekt ma konstruktor domyślny (ale musi mieć konstruktor kopiujący, w tym przypadku automatycznie stworzony jest w pełni wystarczający).

0

@_0x666_ - a jednak nie działa :/ sprawdziłem tylko, czy się kompiluje. Owszem, kompiluje się, ale podczas wykonywania program się zacina, gdy próbuję coś wrzucić na stos.

0

A co to znaczy, że "program się zacina"? push wygląda ok.

Tu masz nieco sensowniej napisaną wersję empty:

template <class T> bool Stos<T>::empty() const { return !top; } 

i dodaj destruktor, który pousuwa zalegające elementy stosu.

0

A co to znaczy, że "program się zacina"?

Sprawdziłem na innym kompilatorze - Segmentation fault

0

Pokaż kod, który powoduje błąd, bo ten co podałeś nie powinien sprawiać problemów.

0

już działa :) wystarczyło dodać konstruktor kopiujący w klasie Osoba

0

Sprawdź, czy aby nie kopiujesz nigdzie stosu (a najlepiej dodaj destruktor, konstruktor kopiujący i operator przypisania do stosu, lub oprzyj się na shared_ptr).

0

dodałem konstruktor kopiujący do klasy Osoba i już działa

1 użytkowników online, w tym zalogowanych: 0, gości: 1