Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

brisanje objekata

[es] :: C/C++ programiranje :: brisanje objekata

[ Pregleda: 2451 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Pretender

Član broj: 12407
Poruke: 100
*.beotel.net



Profil

icon brisanje objekata21.10.2003. u 14:47 - pre 248 meseci
Izvinjavam se DT-u, filmilu, Rajku, i ostalima, sto naizgled tvrdoglavo istrajavam na ovoj knjizi.
Vec sam ranije pokusao da obrazlozim neke svoje motive za to. Posto sam na 15(21), mislim da bi ipak bilo nesuvislo da se sada uklapam u koncept neke nove knjige (sto cu svakako uraditi po zavrsetku ove).

Ako ipak jos ima strpljenja, molim za odgovor na sledece pitanje:

Citat:
2. Using the program from Exercise 1, write a short driver program that makes three objects and then displays their member variables and the static member variable. Then destroy each object and show the effect on the static member variable.

Code:
1:     #include <iostream.h>
2:
3:     class myClass
4:     {
5:     public:
6:        myClass();
7:        ~myClass();
8:        void ShowMember();
9:        void ShowStatic();
10:    private:
11:       int itsMember;
12:       static int itsStatic;
13:    };
14:
15:    myClass::myClass():
16:     itsMember(1)
17:    {
18:       itsStatic++;
19:    }
20:
21:    myClass::~myClass()
22:    {
23:       itsStatic--;
24:       cout << "In destructor. ItsStatic: " << itsStatic << endl;
25:    }
26:
27:    void myClass::ShowMember()
28:    {
29:       cout << "itsMember: " << itsMember << endl;
30:    }
31:
32:    void myClass::ShowStatic()
33:    {
34:       cout << "itsStatic: " << itsStatic << endl;
35:    }
36:    int myClass::itsStatic = 0;
37:
38:    int main()
39:    {
40:       myClass obj1;
41:       obj1.ShowMember();
42:       obj1.ShowStatic();
43:
44:       myClass obj2;
45:       obj2.ShowMember();
46:       obj2.ShowStatic();
47:
48:       myClass obj3;
49:       obj3.ShowMember();
50:       obj3.ShowStatic();
51:     return 0;
52:    }

Ovde ocigledno nije uradjen 2. deo zadatka (ovo bi trebalo da bude resen zadatak), tj. unistavanje objekata, pa se ni ne vide efekti destruktora (sa porukom).
Koliko znam, unistavanje objekata sa steka se izvodi automatski pri izlasku iz programa, pa ne vidim kako smo mogli i da ocekujemo da vidimo poruke destruktora(?)
Da li neko ima ideju, sta je autor mislio pod unistavanjem objekata sa steka ?


Tx

 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: brisanje objekata21.10.2003. u 15:45 - pre 248 meseci
Na prvu loptu, program deluje ispravno. (naravno osim što koristi hedere na stari način i sve u vezi)

Pri uništavanju objekata koji su alocirani na steku, kao i globalnih objekata implicitno se poziva destruktor, tako da će se pri izlasku iz ovog programa pozvati tri destruktora, za tri objekta koje si napravio. Destruktor nije nužno vezan za operator delete i zato mi se čini da je kod kog si dao zaista odgovor na zadatak. Jedini problem može biti što u tekstu zadatka kaže da moraš ručno da uništiš objekte, pa je možda mislio da ih praviš na heapu umesto u lokalu.

f
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
*.pexim.co.yu



+62 Profil

icon Re: brisanje objekata21.10.2003. u 16:06 - pre 248 meseci
Zadatak JESTE kompletno uradjen.
Kako? Pricali smo ranije u jednom pismu kako kompajler obezbedjuje memoriju raznim field-ovima i pointerima na field-ove.
Ovo ti je slicna stvar, samo sto ovde kompajler (bolje reci: garbage collector) pokusava da oslobodi memoriju koju je prethodno alocirao. Konkretno, linija:
Code:

  myClass obj1;

navodi kompajler da pozove copy constructor date klase, koji opet alocira memoriju itd. itd. i tebi vraca referencu na instancu te klase.
Sledeca stvar je - vidljivost (scope) date instance; cim referenca izadje iz scope-a, garbage collector oslobadja referencu (memoriju), samim tim poziva destructor i to je to. Da bi shvatio pricu sa scope-om, pokusaj sledece:
Code:

38:    int main()
39:    {
           { 
40:         myClass obj1;
41:         obj1.ShowMember();
42:         obj1.ShowStatic(); 
           }
43:
           {
44:         myClass obj2;
45:         obj2.ShowMember();
46:         obj2.ShowStatic();
           } 
47:
           {
48:         myClass obj3;
49:         obj3.ShowMember();
50:         obj3.ShowStatic();
           }
51:     return 0;
52:    }


Svaki par zagrada {} otvara novi sub-scope; sve sto se kreira u jednom scope-u, prilikom izlaska iz njega se automatski i unisti. Postavi breakpoint-e na kod i posmatraj sta se desava: destructor-i se nece pozivati na kraju funkcije main(), vec prilikom izlaska iz svakog scope-a (redom).
Valjda sam ti pomogao...drzis se jos one knjige? ajajaj...
Pozdrav

Rajko
 
Odgovor na temu

Pretender

Član broj: 12407
Poruke: 100
*.beotel.net



Profil

icon Re: brisanje objekata21.10.2003. u 19:10 - pre 248 meseci
Ne znam, da li ste primetili da destruktor treba da pokaze poruku koja demonstrira dekrement itsStatic-a (?)
Na to valjda `pisac` misli kad kaze:...destroy each object and show the effect on the static member variable.

Medjutim, ja sam ovaj program kompajlirao, i te poruke se pri izvrsenju ne pokazuju (vec se dobija samo onih 6 podataka, koje pozivaju objekti), a ne vidim ni mehanizam u programu, koji bi trebao ovo da omoguci.

Inace, Rajko, upravo to i jeste pitanje; kako da postavim breakpoint-e i nateram destruktor da se pokaze, kada su objekti instancirani na steku a ne na heap-u ?

A, vezano za ovo, filmile, ove vezbe su koncipirane tako da autor `uvek`(ovo nije jedini slucaj, samo dosadasnji su bili ocigledni) daje kompletno resenje za svaki postavljeni zadatak, tako da bi to trebalo da vazi i ovde.

Potpuno se slazem sa Vama da je knjiga puna mana, samo bih hteo da proverim, da li je to i ovde slucaj, ili je po sredi moje neznanje.


Tx a lot
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: brisanje objekata21.10.2003. u 19:18 - pre 248 meseci
Meni brate sve lepo ispiše, baš kao što Bog zapoveda. A što se tiče breakpointa, pa postavi ga u destruktor.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: brisanje objekata21.10.2003. u 19:21 - pre 248 meseci
@Rajko: Ja lično volim da kažem da je stek najbolji garbage collector, ali u principu nikad nisam čuo da se izraz garbage collector koristi u tom kontekstu. GC služi da "počisti" objekte sa heap-a, a ne sa steka. Standardni C++ nema ugrađen GC, mada nije problem da se koristi neki eksterni.
 
Odgovor na temu

Pretender

Član broj: 12407
Poruke: 100
*.beotel.net



Profil

icon Re: brisanje objekata22.10.2003. u 00:39 - pre 248 meseci
Provalio sam problem.

Po ranovanju, ispise se onih 6 poruka, a pri izlasku iz programa (pritiskom na neki taster), command prompt prozor se zatvori pre nego sto destruktorove poruke stignu da budu ispisane (uspeo sam da ih uocim na trenutak).

E sad, posto od Borlandovih 10^9 komandi znam toliko da mogu da kompajliram, snimim i izvrsim program (opet uz pomoc #include<conio.h> i getch(), da mi se dos-prozor ne bi zatvorio), da li bi neko mogao da me uputi, kako da dodatno produzim zivot command prompt prozora, tako da mogu da vidim i destruktorove poruke ?

A sto se tice breakpointa, on se, koliko sam bacio pogled, samo ovlas pominje u 20.danu, tako da do toga jos nisam stigao, a i kad budem, to mi izgleda nece biti od velike pomoci, jer Jesse ne prikazuje njegovu implementaciju nego ga opisuje kao u nekom romanu. (...znam, znam)


Tx
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: brisanje objekata22.10.2003. u 00:51 - pre 248 meseci
Breakpoint nije deo jezika, već mogućnost razvojnog okruženja. Da koristiš Visual C++ ili gcc + gdb objasnio bih ti kako se postavlja breakpoint, ali za Borlanda stvarno ne znam.
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: brisanje objekata23.10.2003. u 22:03 - pre 248 meseci
što se pauze tiče, lepo ostaviš jedan char da se učita sa STDIN-a i pre toga ispišeš poruku press any key to continue. Ili koristiš system("PAUSE") funkciju (iz system.h valjda)
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

[es] :: C/C++ programiranje :: brisanje objekata

[ Pregleda: 2451 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.