Implementacja stosu o roznych typach danych

0

Witam mój problem polega na tym że nie wiem jak zaimplementować stos przechowujący różne typy danych program który napisałem nie działa jak należy.
I mam prośbe czy ktoś mógłby poprawic ten kod lub podać mi inny sposob napisania takiego programu ?

O to kod :

#include <cstdlib>
#include <iostream>
using namespace std;

class wartosc
{
      private:
              int liczba;
              char napis[30];
    public:
////////////////////////////////////////////////
 void wprowadzLiczba(int li)
{
    liczba = li;
}
////////////////////////////////////////////////
void wprowadzNapis(const char* nap)
{
strncpy(napis,nap,30);
}
////////////////////////////////////////////////
    double pokazLiczba()
    {
    return liczba;
    }
////////////////////////////////////////////////
    char* pokazNapis()
    {
        return napis;
    }

////////////////////////////////////////////////
};

////////////////////////////////////////////////////////////////////////////////////////////////
class wartosc_double
{
      private:
              double liczba_d;
    public:
////////////////////////////////////////////////
void wprowadzLiczba(double li)
{
    liczba_d = li;
}
////////////////////////////////////////////////
    double pokazLiczba()
    {
    return liczba_d;
    }
////////////////////////////////////////////////
};

union moja_unia
{
    wartosc a;
    wartosc_double b;
};


class stos
{
////////////////////////////////////////////////
private:
        struct wezel

            {
            moja_unia dana;
            wezel *adres;
            };
////////////////////////////////////////////////
wezel *top;
public:
////////////////////////////////////////////////
	stos()
	{
		top = 0;
	}
////////////////////////////////////////////////
	~stos()
	{
		empty();
	}
////////////////////////////////////////////////
	void push(moja_unia war_dana, int jaki_wyb)
	{
		wezel *e = new wezel;

if (jaki_wyb == 1)
{
        e->dana.a.wprowadzLiczba(war_dana.a.pokazLiczba());
        e->dana.a.wprowadzNapis(war_dana.a.pokazNapis());
}
        else if(jaki_wyb == 2)
{
        e->dana.b.wprowadzLiczba(war_dana.b.pokazLiczba());
}
		e->adres = top;
		top = e;
	}

	void pop()
	{
		wezel *e;
            {
                if(top == NULL) return;

                e = (top)->adres;
                delete top;
                top = e;
            }
	}
	
	void zawartosc(int jw)
	{
		wezel *e=top;

		while(e)
		{
            if (jw== 1)
            {
			cout<<"Liczba int : \n"<<e->dana.a.pokazLiczba()<<",\n ";
			cout<<"Napis : \n"<<e->dana.a.pokazNapis()<<",\n ";
			}
			else if(jw == 2)
			{
            cout<<"Liczba double : \n"<<e->dana.b.pokazLiczba()<<",\n ";
			}
			cout<<endl;
			e=e->adres;//4
		}
		cout<<endl;
	}

	void empty()

	{

		wezel *e;//pomocnicza

		if(top == NULL) return;

		while(top)

		{

			e = (top)->adres;

			delete top;

			top = e;

		}

	}

	bool IsEmpty()
	{
		if(top == NULL)

			return true;

		else

			return false;

	}

};

int main()
{
    stos st;
    char odp;
    int licz;
    double licz_d;
    char nap[30];
    moja_unia unia;

int wybor;
for (;;)
{
cout<<"1 int 2 double :\n";
cin>>wybor;
switch(wybor)
{
case 1:
    cout<<"Podaj dana int : "<<endl;
    cin>>licz;
    cout<<"Podaj napis : "<<endl;
    cin>>nap;
    break;

    unia.a.wprowadzLiczba(licz);
    unia.a.wprowadzNapis(nap);

case 2:
    cout<<"Podaj dana double : "<<endl;
    cin>>licz_d;
    break;

    unia.b.wprowadzLiczba(licz_d);
}

    st.push(unia,wybor);

    cout<<"Cczy koniec ?"<<endl;
    cin>>odp;
    if (odp == 't')
    break;


}
    cout<<endl;
    cout<<"To Twoj stos : \n\n";
    st.zawartosc(wybor);
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
0

Możesz poszukać czegoś o typie Variant (nie myle się ?), ale na początek zedytuj post, ponieważ ten kod wygląda porażająco.
Wklej go w <code class="cpp"> </code>

0

Patryk27 poszukałem po internecie na temat typu VARIANT ale nic konkretnego nie znalazłem i nie wiem jak w ogóle tego użyć gdy zamieniłem :

	void push(VARIANT war_dana, int jaki_wyb)
 

wyskakuja bledy.
Czy moglbys mi podac jakis kokretny tego przyklad albo przerobic funkcje push ktora wczesniej napisalem bo po prostu poraz pierwszy sie z takim typem danych jak VARIANT spotkałem.

0

mozesz przechowywac typ void* i na stosie przechowywac wskazniki do obiektow, z tym ze musialbys wiedziec jaki typ znajduje sie aktualnie na stosie. aby sie tego dowiedziec mozesz np zrobic klase ktora to przechowuje:

#include <stack>
class klasaA
{
// costam
};
class klasaB
{
// costam
};
#define aaaklasaA 1
#define aaaklasaB 2
class dowolnaklasa
{
public:
  unsigned int ktoraklasa;
  void* wskazniknaobiekt;
  dowolnaklasa() {}
  dowolnaklasa(int klasa)
   {
    ktoraklasa = klasa;
    if (ktoraklasa==aaaklasaA)
       wskazniknaobiekt = void*(new klasaA);
    else  (ktoraklasa==aaaklasaB)
       wskazniknaobiekt = void*(new klasaB);
   }
  ~dowolnaklasa()
   {
    if (ktoraklasa==aaaklasaA)
       delete (klasaA*)(wskazniknaobiekt);
    else  (ktoraklasa==aaaklasaB)
       delete (klasaB*)(wskazniknaobiekt);
   }
};

int main()
{
  std::stack<dowolnaklasa> stos;
  stos.push_back(dowolnaklasa(aaaklasaA));
  stos.push_back(dowolnaklasa(aaaklasaB));
  
  return 0;
}

aaa zastap czymkolwiek, chodzi o to zeby nie powtarzala sie nazwa klasy
cos w tym stylu, nie kompilowalem wiec moga byc bledy

a tak poza tym to slabo szukales tego typu variant:
http://www.boost.org/doc/libs/1_45_0/doc/html/variant.html

0

Aha no oki dzięki wielkie!

0

Zaproponuje jeszcze http://www.boost.org/doc/libs/1_45_0/doc/html/any.html jako alternatywe.

0

co do VARIANT to jest to proste jak konstrukcja cepa, idea jest taka:

enum VARIANT_TYPES {
  vtUnknwon = 0,
  vtByte,
  vtWord,
  vtDword,
  vtQword,
  vtFloat,
  vtDouble
  //etc
};

struct VARIANT {
  VARIANT_TYPES vt; //określa w jakim polu unii wpisana jest wartość (jaki ma format)
  union {
    char Byte;
    short Word;
    long Dword;
    long long Qword;
    float Float;
    double Double;
  };
};

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