• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Klasa w c++, stos, konstruktor kopiujący.

Cloud VPS
–1 głos
962 wizyt
pytanie zadane 25 lutego 2017 w C i C++ przez mistrzuniu1 Użytkownik (600 p.)
edycja 25 lutego 2017 przez Patrycjerz

Zaczynam uczyć się programowania obiektowego. Jako zadanie wymyśliłem sobie napisanie klasy stos, jednak mam problem z niedziałającym konstruktorem kopiującym.
Pomoże ktoś podpowiedzieć co jest nie tak?

Stworzony poprzez kopiowanie obiekt zdaje się nie istnieć.

#include <iostream>
using namespace std;
class Stos
{
private: 
	struct element
	{
		int wartosc;
		element *poprzedni;
	};
	element *dolny, *gorny;
public:	
	Stos()
	{
		dolny = gorny = NULL;
	}
	Stos(const Stos &stosik)
	{
		if (stosik.gorny != stosik.dolny)
		{
			element *pom;
			pom = stosik.gorny;
			gorny = new element;
			gorny->wartosc = pom->wartosc;
			gorny->poprzedni = new element;
			dolny = gorny;
			while (pom != stosik.dolny)
			{
				if (pom->poprzedni != nullptr)
				{
					pom = pom->poprzedni;
					dolny->poprzedni = new element;
					dolny = dolny->poprzedni;
					dolny->wartosc = pom->wartosc;
				}

			}
		}
		else
			gorny = dolny = NULL;
	}
	~Stos()
	{
		if (gorny == NULL)
			delete gorny;
		else
		{
			element *pom;
			while(gorny!=dolny)
			{
				pom = gorny;
				gorny=gorny->poprzedni;
				delete pom;

			}
		}
	}
	void dodaj_element(int n)
	{
		element *pom;
		pom = new element;
		pom->poprzedni = gorny;
		pom->wartosc = n;
		gorny = pom;
		cout << "dodalem element: " << gorny->wartosc << endl;
	}
	void zdejmij_element()
	{
		element *pom;
		pom = gorny;
		gorny = gorny->poprzedni;
		cout << "zdjalem element: " << pom->wartosc<<endl;
		delete pom;
	}
	void wypisz()
	{
		element *pom = gorny;
			while (pom != nullptr) 
			{
				cout << pom->wartosc << endl;
				pom = pom->poprzedni;
			}
	}
	

};

int main()
{
	Stos stosik;
	stosik.dodaj_element(1);
	stosik.dodaj_element(2);
	stosik.dodaj_element(3);
	stosik.dodaj_element(4);
	Stos sto = stosik;
	sto.wypisz();


    return 0;
}

1 odpowiedź

+1 głos
odpowiedź 15 maja 2019 przez anyuq Nowicjusz (160 p.)

wystarczy zmienić na:

Stos(const Stos &stosik)
    {
        if (stosik.gorny != stosik.dolny)
        {
            element *pom;
            pom = stosik.gorny;
            gorny = new element;
            gorny->wartosc = pom->wartosc;
            gorny->poprzedni = new element;
            dolny = gorny;
            
            
                while (pom->poprzedni != nullptr)
                {
                    pom = pom->poprzedni;
                    dolny->poprzedni = new element;
                    dolny = dolny->poprzedni;
                    dolny->wartosc = pom->wartosc;
                    dolny->poprzedni=NULL;
                }
 
            
        }
        else
            gorny = dolny = NULL;
    }

ta twoja pętla była nieskończona bo pom nigdy nie byłby NULL'em (co innego pom->poprzedni)

PS. widzę, że późno odpowiadam, ale jak już mam odpowiedź to po prostu wolę się podzielić :P

Podobne pytania

0 głosów
1 odpowiedź 469 wizyt
pytanie zadane 28 kwietnia 2018 w C i C++ przez konu33 Nowicjusz (210 p.)
+1 głos
3 odpowiedzi 697 wizyt
0 głosów
2 odpowiedzi 761 wizyt

93,460 zapytań

142,454 odpowiedzi

322,724 komentarzy

62,837 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...