[C++] Stos, kładzenie różnych obiektów

0

W programie mam takie klasy:

#include <iostream>

class Stos;

class Element
{
    protected:
        Element* next;

    public:
        Element() : next (0) {};
        Element(const Element & e);
        friend class Stos;

};

class Liczba : public Element
{
    private:
        double el;


    public:
        Liczba(double l);
        Liczba(double l, Element* e);
        const double pokaz_l() { return el; }
        virtual void przetwarzaj(Stos & s);
};

class Dzialanie : public Element
{
    private:
        char el;



    public:
        Dzialanie(char z);
        Dzialanie(char z, Element* e);
        const double pokaz_z() { return el; }
        virtual void przetwarzaj(Stos & s);

};

class Stos
{

    private:
        Element* top;
        int count;

    public:
        Stos() : top(0), count (0) {};
        ~Stos();
//        Stos(const Stos & s);
//        Stos& operator=(const Stos & s);
        void put(Element* e);
//        Element* pop();
//        Element & showTop();
//        void pokaz_caly();
//        Stos& reverse();
    friend class Element;
    friend class Liczba;
    friend class Dzialanie;
};

Chcę teraz stworzyć uniwersalną funkcję put(), która będzie kładła na stos obiekt niezależnie od tego czy jest on Liczbą czy Działaniem - innymi słowy, ma kłaść Element. Mniej więcej tak:

void put(const Element * e)
{
1. pobierz aktualną wartość top
2. skopiuj e i przypisz e.next=top
3. połóż e jako top
}

Brak mi pomysłu jak dokładnie to zrobić, proszę o wskazówki.

0

Kombinuję jakoś tak:

void Stos::put(Element* e)
{
    Element* tmp = top;
    top.next = tmp;
    top = e;
    count++;
}

ale to nie jest dobre rozwiązanie (mam nadzieję że chociaż dobry trop).

0

Nie.

e->next = top;
top = e;
0

Dzięki! A umiesz pokrótce wytłumaczyć, dlaczego nie mogłem zrobić tak jak chciałem?

0

Mogę. Bo to było bez sensu ;]

Element* tmp = top;
top.next = tmp;
top = e;

Czyli po polsku:
Przypisz wskaźnik top do tmp. Jako następnik obiektu (!) pokazywanego przez top ustaw tmp (czyli de facto top). Jako nowy element top ustaw obiekt e.

Problem jest w tym że gubisz wszystko co bylo przypięte do top a potem gubisz i samo poprzednie top.
Lista to jest taki jakby łańcuszek połaczony wskaźnikami.
Wyobraź sobie że masz takie kółka połączone kreskami:

top-O-O-O-O-NULL

i mamy też obiekt e nie połączony z niczym
Zmiana obiektu pokazywanego przez wskanik powoduje "przepięcie" kreski do innego kółka. Więc jeśli zrobimy top = e to stanie się coś takiego:

top-e O-O-O-O-NULL

Czyli pojawia nam się cała lista nie przypięta do niczego! Nie mamy do niej dostępu! Nie wolno tak robić!

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