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

cudan parametar i static lista

[es] :: C/C++ programiranje :: cudan parametar i static lista

[ Pregleda: 2713 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Pretender

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



Profil

icon cudan parametar i static lista27.10.2003. u 21:23 - pre 249 meseci
Pozdrav svima.
Imam 2 pitanja.

1)
Citat:

Find() takes a PartNumber and a ULONG. If the part corresponding to PartNumber is found, it returns a pointer to the Part and fills the ULONG with the position of that part in the list. If PartNumber is not found, it returns NULL, and the position is meaningless.

Code:

200:     Part*   PartsList::Find(ULONG & position, ULONG PartNumber)  const
201:     {
202:        PartNode * pNode = 0;
203:        for (pNode = pHead, position = 0;
204:              pNode!=NULL;
205:              pNode = pNode->GetNext(), position++)
206:        {
207:           if (pNode->GetPart()->GetPartNumber() == PartNumber)
208:              break;
209:        }
210:        if (pNode == NULL)
211:           return NULL;
212:        else
213:           return pNode->GetPart();
214:     }

Postojanje parametra position, po meni, nema smisla, jer isti taj parametar u ovoj f-ji inicijalizujemo nulom, a i kako bi, i zasto bi mi trebali znati position nekog clana liste, ako ova f-ja obezbedjuje pronalazenje na osnovu PartNumber ?
Dakle, s jedne strane autor kaze da se position uzima kao parametar, a zatim da sama f-ja,(kao jedan od rezultata) popunjava ULONG polje pozicijom dela u listi, sto meni zvuci malo shizofreno (?)


2)

Code:

140:     class PartsList
141:     {
142:     public:
143:        PartsList();
144:        ~PartsList();
145:        // needs copy constructor and operator equals!
146:        Part*      Find(ULONG & position, ULONG PartNumber)  const;
147:        ULONG      GetCount() const { return itsCount; }
148:        Part*      GetFirst() const;
149:        static     PartsList& GetGlobalPartsList()    //!!!!!!!!!!!!!!
150:      { 
151:         return  GlobalPartsList; 
152:      }
153:        void       Insert(Part *);
154:        void       Iterate(void (Part::*f)()const) const;
155:        Part*      operator[](ULONG) const;
156:     private:
157:        PartNode * pHead;
158:        ULONG itsCount;
159:        static PartsList GlobalPartsList;    //!!!!!!!!!!!!!!!

162:     PartsList PartsList::GlobalPartsList;   //!!!!!!!!!!!!!!! 


Jasno je zasto se static inicijalizuje izvan klase, ali cini se meni da u lin 162 nema nikakve inicijalizacije (kako kaze autor) vec samo ponovljene deklaracije; zar rec static, ne moze implicitno da zameni ovu (prakticno) duplu deklaraciju, tako da kompajler zna da je ona u opsegu celog programa ?

I, na kraju:
Code:

274:     int main()
275:     {
276:        PartsList pl = PartsList::GetGlobalPartsList(); 


E ovo je za mene prava mystica. Cime se ovde u biti stvari inicijalizuje nasa nova lista pl ??

Sta je pretenzija sa ovom GlobalPartsList ?
Da li mozda neka integrisana lista koja ce inkorporirati i sortirati sve clanove svake novounete liste ?
Ako je to, zasto onda uopste kreiramo novu listu, i ne pozovemo jednostavno Global, i radimo na njoj ?


Tx^2

P.S. Ako je za odgovore na ova pitanja eventualno potreban celovit kod, molim za blagoslov da ovde postujem isti od 311 linija.
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
*.racasse.se

Sajt: dejan.lekic.org


+2 Profil

icon Re: cudan parametar i static lista28.10.2003. u 12:46 - pre 249 meseci
Code:
PartNode * pNode = 0;


Ovo gore NIJE nula, nego je NULL! 0 u C++ je isto sto i NULL kad su pokazivaci u pitanju.
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Pretender

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



Profil

icon Re: cudan parametar i static lista28.10.2003. u 13:35 - pre 249 meseci
Pa, jeste leko, znam to, ali nije problem u tom pointeru, nego u parametru position.

Uzgred, funkcija Find() se ne koristi u main()-u, tako da ne moze da se provali kako je Jesse mislio da upotrebi ovaj parametar.

Evo main-a :
Code:
274:     int main()
275:     {
276:        PartsList pl = PartsList::GetGlobalPartsList();
277:        Part * pPart = 0;
278:        ULONG PartNumber;
279:        USHORT value;
280:        ULONG choice;
281:   
282:        while (1)
283:        {
284:           cout << "(0)Quit (1)Car (2)Plane: ";
285:           cin >> choice;
286:   
287:           if (!choice)
288:              break;
289:   
290:           cout << "New PartNumber?: ";
291:           cin >>  PartNumber;
292:   
293:           if (choice == 1)
294:           {
295:              cout << "Model Year?: ";
296:              cin >> value;
297:              pPart = new CarPart(value,PartNumber);
298:           }
299:           else
300:           {
301:              cout << "Engine Number?: ";
302:              cin >> value;
303:              pPart = new AirPlanePart(value,PartNumber);
304:           }
305:   
306:           pl.Insert(pPart);
307:        }
308:        void (Part::*pFunc)()const = Part::Display;
309:        pl.Iterate(pFunc);
310:       return 0;
311: }

Find() se ne poziva ni posredno (preko Insert() ili Iterate()).
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: cudan parametar i static lista28.10.2003. u 16:55 - pre 249 meseci
Citat:
Pretender:

1)Postojanje parametra position, po meni, nema smisla, jer isti taj parametar u ovoj f-ji inicijalizujemo nulom, a i kako bi, i zasto bi mi trebali znati position nekog clana liste, ako ova f-ja obezbedjuje pronalazenje na osnovu PartNumber ?
Dakle, s jedne strane autor kaze da se position uzima kao parametar, a zatim da sama f-ja,(kao jedan od rezultata) popunjava ULONG polje pozicijom dela u listi, sto meni zvuci malo shizofreno (?)


position je tzv out parametar. To znači da će u njemu biti rezultat funkcije - pozicija unutar liste.

Citat:
Pretender:
2)Jasno je zasto se static inicijalizuje izvan klase, ali cini se meni da u lin 162 nema nikakve inicijalizacije (kako kaze autor) vec samo ponovljene deklaracije; zar rec static, ne moze implicitno da zameni ovu (prakticno) duplu deklaraciju, tako da kompajler zna da je ona u opsegu celog programa ?


Loše ti se čini. Linija 162 nije ponovljena deklaracija, već definicija - poziva se podrazumevani konstruktor.

Citat:
Pretender:
Ako je to, zasto onda uopste kreiramo novu listu, i ne pozovemo jednostavno Global, i radimo na njoj ?


Koliko vidim na prvi pogled, to je Singleton design pattern (pogledaj po Google-u, da sad ne skrećemo na to) - namena mu je da zameni globalne varijable.

 
Odgovor na temu

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: cudan parametar i static lista28.10.2003. u 22:10 - pre 249 meseci
Citat:
Pretender:
Jasno je zasto se static inicijalizuje izvan klase, ali cini se meni da u lin 162 nema nikakve inicijalizacije (kako kaze autor) vec samo ponovljene deklaracije; zar rec static, ne moze implicitno da zameni ovu (prakticno) duplu deklaraciju, tako da kompajler zna da je ona u opsegu celog programa ?


Stvari postaju ociglednije kada se klasa razdvoji na deklaraciju u *.h fajlu i implementaciju u *.cpp.
Tada linija 159 ide u *.h i static je informacija da postoji jedna instanca promenljive za klasu (tj. za sve objekte klase). Linija 162 je definicija koja ide u *.cpp i ona kompajleru kaze u koji *.obj fajl da smesti samu promenljivu. Konstruktor PartsList nad objektom PartsList::GlobalPartsList se poziva pre nego sto bude pozvana prva funkcija iz tog *.cpp fajla.

Obrati paznju na to da, ako se promenljiva koristi pre nego sto bude pozvana prva funkcija iz *.cpp fajla (npr iz staticke inline funkcije clanice, kakva je GetGlobalPartsList), konstruktor ne mora da bude pozvan pre toga i sadrzaj promenljive moze da bude nedefinisan.

 
Odgovor na temu

[es] :: C/C++ programiranje :: cudan parametar i static lista

[ Pregleda: 2713 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

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