|
[ Pretender @ 27.10.2003. 21:23 ] @
| 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. |
[ leka @ 28.10.2003. 12:46 ] @
Code: PartNode * pNode = 0;
Ovo gore NIJE nula, nego je NULL! 0 u C++ je isto sto i NULL kad su pokazivaci u pitanju.
[ Pretender @ 28.10.2003. 13:35 ] @
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()).
[ Dragi Tata @ 28.10.2003. 16:55 ] @
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.
[ sspasic @ 28.10.2003. 22:10 ] @
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.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|