» »

Kopirni konstruktor

Kopirni konstruktor

freserovski ::

Oj
imam sledečo kodo :

#ifndef _SKLAD_H_
#define _SKLAD_H_
//DINAMICNI SKLAD
//LIFO (LAST IN FIRST OUT)
class Sklad
{
protected:


struct vozlisce{
int pod;
vozlisce*next;
};
vozlisce*zacetek;
int vel;


public:
//KONSTRUKTORJI IN DESTRUKTORJI///////
Sklad();
Sklad(const Sklad &skl);//kopirni konstruktor
~Sklad();
//////////////////////////////////////

//METODE//////////////////////////////
void vstavi(int vrednost);
void brisi();
int vrh() const;
bool prazno() const;
int velikost() const;
//////////////////////////////////////
///dodatne////////
void izpisi();
};

#endif

in naslednji kopirni konstruktor :

Sklad::Sklad(const Sklad &skl){
zacetek=skl.zacetek;
vozlisce*novo=new vozlisce;
novo->next=zacetek->next;
novo->pod=zacetek->pod;

}

V glavnem programu ga kličem na ta način:

Sklad skl;

int podatek;


cout < < " vpisite podatek, ki ga zelite vstaviti" < < endl;
cin > > podatek;

skl.vstavi(podatek);

skl.izpisi();

Sklad skl1(skl);//klicanje kopirnega konstruktorja....

Ne vem kaj bi bilo pri tem narobe, toda enostavno ne deluje...ob izhodu iz programa napiše to opozorilo :


hmm, ko pa dam še 1x izpis, takoj za kopirnim konstruktorjem na način skl1.izpisi(), pa ga normalno izpiše..., samo ko program zaprem se pojavi to okno :(
Kdo ve kaj bi bilo narobe?
Problemi so, problemi bodo! Kurc jih gleda!!

Vesoljc ::

glej, v classu sklad definiras pointer na vozlisce. vsako vozlisce ima podatek in pointer na naslednje vozlisce. zdej si moras najprej razjasnit, kaj hoces, da copy con sploh naredi. ce delas z eno instanco (kopijo) sklada ter v njega vstavljas ali brises vozlisca bo to zgledal neka tkole:

class sklad 1:
velikost = 4;
zacetek->drugi->tretji->cetrti;

ja?

no in kaj mora zdaj kopirni konstruktor narest? narest mora tako imenovani deep copy, prekopirat mora ves dinamecen memory, v tem primeru vsa vozlisca, ne samo prvo, kot to storis ti! afaik, imas v spodnjem primeru, "share-ne" pointerje, oziroma dva objekta uporabljata iste kose pomnilnika in ko gres ven iz programa se kliceta dva destruktorja, ki oba hoceta izbrisati isti seznam....

po kopiranju mora izgledat skl2 takole:

class sklad 2:
velikost = 4;
zacetek->drugi->tretji->cetrti;


nekak tkole ;)
sklad::sklad(const sklad &rhs)
{
  if(rhs.zacetek != 0)
  {
     zacetek = new vozlisce;
     zacetek->pod = rhs.zacetek->pod;
     while(ni konec seznama)
     {
       kreiraj novo vozlisce ter mu priredi vrednost
       trenutni = sprehajalec->next;
     }
  }
}


ne pozabi na destruktor, tudi tam moras se moras sprehodi cez celoten seznam ter izbrisati vse elemente...
Abnormal behavior of abnormal brain makes me normal...

freserovski ::

thnx, bom probal, če bo delovalo...saj to je bilo za test, sem v seznam dodajal samo en element, pa ni delovalo :( .
Destruktor pa imam narejen tako, da pobriše ves seznam...
hja, točno na en objekt sem pozabil:'(.
Kako bi pa bilo mogoče kopirat kodo na forum, da bi se ohranili tabulatorji, ker ukaz /code/ ne dela
Problemi so, problemi bodo! Kurc jih gleda!!

Zgodovina sprememb…

Vesoljc ::

Abnormal behavior of abnormal brain makes me normal...

freserovski ::

OK, hvala! Madona, saj gre, samo včasih je malo pomanjkanje koncentracije, pol pa kar nekaj v tri dni delam pa preizkušam. Sem si malo napačno predstavljal delovanje kopirnega konstruktorja. Zdaj pa mi je končno uspelo : pomoč je prišla zelo prav :D

Lep dan!
Problemi so, problemi bodo! Kurc jih gleda!!


Vredno ogleda ...

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

[C++] Iskalno drevo implementacija

Oddelek: Programiranje
52276 (1834) eXoo
»

[C++ naloga] seznam

Oddelek: Programiranje
81385 (1385) BigWhale
»

pomoc pri skladu

Oddelek: Programiranje
51323 (1248) NoUse4AName
»

C++ kopirni konstruktor

Oddelek: Programiranje
103421 (3152) noraguta
»

Ali mi lahko kdo prosim razlozi delovanje tega konstruktorja

Oddelek: Programiranje
61100 (885) noraguta

Več podobnih tem