» »

C++ kopirni konstruktor

C++ kopirni konstruktor

Hatefild ::

class vozlisce
{
public:
vozlisce (int _vrednost, vozlisce *_next){vrednost=_vrednost,next=_next;}
~vozlisce (); //destruktor
int vrni_vrednost(){return vrednost;}
vozlisce *vrni_naslednjega(){return next;}
private:
int vrednost;
vozlisce *next;
};

class sklad
{
public:
sklad(){vrh=NULL;}
~sklad();
void push (int vrednost); //dodajanje
void pop (); //brisanje
void top (); //vrne podatek, ki je na vrhu
void izpis (); //izpise sklad
int prazen (); //preveri sklad
private:
vozlisce *vrh;
};

vozlisce::~vozlisce(){}
sklad::~sklad ()
{
while (prazen!=NULL)
{
pop();
}



}

Prosil bi ce kateri ve kako naj naredim kopirni konstruktor za sklad, saj brez njega tudi dela naloga ali brez tega kopirnega konstruktora jo nemorem zagovorit, nimam pa pojma kako ga naj naredim, prosil bi tudi malo za opis kaj sploh dela ta konstruktor

Za pametne odg. se zahvaljujem!

OwcA ::

Kopirni konstruktor se uporablja, kot že ime pove, pri kopiranju objekta. Vsakič, ko naredimo novo kopijo tega objekta, kopirni konstuktor poskrbi, da se kopija v atributih ujema z originalom. Potreba po takšnem kopiranju nastopi, ko določiš objektu novo vrednost (operator =) ali kadar ga podajaš po vrednosti.

sklad(const sklad &rhs)
{
vrh= rhs.vrh;
}
vozlisce(const vozlisce &rhs)
{
vrednsot = rhs.vrednost;
next = rhs.next;
}

Tole bo vredu le, če imaš vse na stacku, v kolikor uporabljaš heap se boš moral v stvar nekoliko bolj poglobiti in ali spremeniti zasnovo ali pa dodati mehanizem za samodejno smetarjenje (najvrjetneje v obliki štetja referenc).
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

Vesoljc ::

@owca
kako praviš da formatiraš kodo? (fixed)

dodal bi le še to:

vozlisce(const vozlisce &rhs)
{
  if(&rhs != this)
  {
    vrednsot = rhs.vrednost;
    next = rhs.next;
  }
}

s tem preprečimo t.i. self assignment
Abnormal behavior of abnormal brain makes me normal...

Zgodovina sprememb…

  • spremenil: Vesoljc ()

OwcA ::

@Vesoljc: uporabi HTML oznako <pre>beeee</pre>
Preprečevanje self assignmenta ni potrebno, ker za to poskrbi prevajalnik (izraze tipa a=a; enostavno zanemari).
Otroška radovednost - gonilo napredka.

Vesoljc ::

tud če maš dve različni referenci?
Abnormal behavior of abnormal brain makes me normal...

OwcA ::

Kako misliš različni? Če sta obe kazalca na isto instanco, potem, ja.
Otroška radovednost - gonilo napredka.

Vesoljc ::

kukr pravjo na gamedev.net-u, to velja samo za osnovne tipe, za user defined objekta pa ne.

thread
Abnormal behavior of abnormal brain makes me normal...

astras ::

alo
kaj pa tole? bi prosil ce kdo ve...
torej, jes mam narejen kopirni konstruktor takole kot je spodaj, rabil bi pa narejenega tako, da mi kao ne dela vmesnega na b ampak da mi gre direkt iz sklada na kopijo sklada ce me razumete, bi mi znal kdo napisat kodo prosim?
lp
sklad::sklad(const sklad &S) //kopirni konstruktor, ki ni vredu...
{
	sklad b;
	Vozlisce *Temp = S.Vrh;

	while (Temp != NULL)
	{
		b.vstavi(Temp->Element);
		Temp = Temp->Naslednji;
	}

	Temp = b.Vrh;

	while (Temp != NULL)
	{
		vstavi(Temp->Element);
		Temp = Temp->Naslednji;
	}

}
***Ce bil bi vedez...... ne bil bi ...... revez***

Zgodovina sprememb…

  • spremenilo: OwcA ()

Vesoljc ::

// sklad a
sklad a;
a.vstavi(nekaj);
a.vstavi(še_nekaj);
//sklad b hočemo naredit kot kopijo sklada a
sklad b(a);
// torej moraš vse elemente it a prenesti v b


brez bolj detajlne kode (vsaj header :\) ti tešžko natančno pomagam...

sklad::sklad(const sklad& rhs)
{
   // sprehajalec
   Vozlisce *temp = rhs.Vrh;
   while (temp != NULL)
   {
	this->vstavi(temp->Element);
	temp = temp->Naslednji;
   }
}


kej tacga?
namreč, z ključno besedo this dostopaš do trenutnega objekta, v tem primeru objekta b, ki kliče svoj kopirni konstruktor sz parametrom a.
Abnormal behavior of abnormal brain makes me normal...

Gundolf ::

Lahko pa tudi izpustis this-> ;)

noraguta ::

tale tema bi bila pa skoraj lahko sticky pojavi se vsako jesen.
mogoče še v kombinaciji z par ostalimi domačimi nalogami?
Pust' ot pobyedy k pobyedye vyedyot!

Zgodovina sprememb…

  • spremenilo: noraguta ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] Iskalno drevo implementacija

Oddelek: Programiranje
52311 (1869) eXoo
»

[c++]Seznam

Oddelek: Programiranje
142667 (2667) Gundolf
»

[C++ naloga] seznam

Oddelek: Programiranje
81396 (1396) BigWhale
»

pomoc pri skladu

Oddelek: Programiranje
51332 (1257) NoUse4AName
»

Ali mi lahko kdo prosim razlozi delovanje tega konstruktorja

Oddelek: Programiranje
61105 (890) noraguta

Več podobnih tem