Forum » Programiranje » 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?
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 ;)
ne pozabi na destruktor, tudi tam moras se moras sprehodi cez celoten seznam ter izbrisati vse elemente...
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
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…
- spremenilo: freserovski ()
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
Lep dan!
Lep dan!
Problemi so, problemi bodo! Kurc jih gleda!!
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C++] Iskalno drevo implementacijaOddelek: Programiranje | 2276 (1834) | eXoo |
» | [C++ naloga] seznamOddelek: Programiranje | 1385 (1385) | BigWhale |
» | pomoc pri skladuOddelek: Programiranje | 1323 (1248) | NoUse4AName |
» | C++ kopirni konstruktorOddelek: Programiranje | 3421 (3152) | noraguta |
» | Ali mi lahko kdo prosim razlozi delovanje tega konstruktorjaOddelek: Programiranje | 1100 (885) | noraguta |