tanuljuk meg a c++ programozási nyelvet 24 óra alatt

542

Click here to load reader

Upload: mucibuci88

Post on 19-Jun-2015

15.986 views

Category:

Documents


1.062 download

TRANSCRIPT

Azopertorokprecedencija sasszociativitsa A tblzatbanelbbopertorokmagasabb precedencival rendelkeznek, mint a k- felbukkank. A C+ +szablyai szerint egykifejezs zrjeln belltallhat a program azopertorokprecedencijnak sorrendjben vgzielgy,hogy a legmagasabbrangopertorral hajtj a vgre majdsor-rendszerintfolytatja.tv.egyoperandusplusz(+) sminusz(-) a precedencia-lista maso-dikszintjnszerepelnek.vagyis - teljesenlogikusan- azaritmet ikai ket,amelyekazldik szinten kaptakhelyet.A msodik szintentallhat& opertora "c-me"opertor,mg a g, szinten lthatugyanilyenjel a bitenknt i AND opertora, A 2, szintenlthat " a mutat ltalcfmzett tartalomkiolvasst vgzi,mga 4.szintenlt hatugyanilyenjela szorzs,Amennyibena vgrehajtsnaksorrendjrenem utalnak zrj elek,gy az azonosprecedenciaszinthez tartoz a program jobbrl balra.vagybalrl jobbrahaladvahajtja vgrea tblzatbanmegadott nakmegfelelen, SzintOpertorokKirtkelsisorrend 1 (magas)()::balrl jobbra 2[l->++ -- balrl jobbra typei dkeyword, typecast 3*& !- + ...-- ...- jobbrlbalra aizeof new delete 4 *->* balrljobbra 5 /% balrljobbra 6 , -balrljobbra ) balrljobbra 8=balrljobbra 9='"I ",balrljobbra 10 balrljobbra 11balrljobbra 12balrljobbra 13 balrljobbra 14 " balrljobbra 15 ?, jobbrl balra 16=*=/= ... =-= %=jobbrl balra =;&=A=I= ACsaC+ + kulcsszavai Kulcsszavak and'(&&)false' and_e,,'(&,, )float .,m '0" autofriend' bitand'(&)goto bitor'( I) " bool'inl ine' break 'ne caselong catch'mut able' charnamespace class'new' campl '(-)not '(l) constnot,eq'( I,,) const, cast 'operator' continueor'(I I ) defaultor, eq' (I ,, ) delete'private' doprotected' doublepublic' dynarnic, caet'register elsereinter-on= pret, cast' explidt'return export'short externeigned , Csak a C++nyelvnek rsze, s izeof size, t static statiC, cast' struct switch template' this' throw' true' try' typedef typeid' typename' union unsigned us!ng' virtual' void volatUe' wchar, t while xor'(A) xor, eq'(A;; ) 17throw 18(alacsony),operator) balrljobbra balrliobbra Azok a kulcsszavak,amelyek utn zrjel szerepel, a zrjelbentallhat opertor szinonimi. Adattpusoka C+ +nyelvben TIpus16 bit32bitTartomnv uneigned short int2bjtos2bjtosO-tl 65 535-ig short int2bjtos2bjtos-32 768-t6l32 767-ig uneiqned long int4bjtos4bjtosO-tl 4294967 295-ig long int4bjtos4bjtos-2147483 648-t612147 483647-ig int2bjtoe4bjtos(16):-32768- tI32767 - ig; (32):-2147483 64 8- tl 2147483 647 - ig unsigned int2bjtoe4bjtos(16): O- t165 535 - ig;(32) : Q-tl 4294 967295-ig s i ze_ t2bjtoe4bjtos(16): 0 - t165 535 - ig;(32) : Q- tl 429 49672 95 - ig char1bjtoelbjtos256 karak ter wchar_t2bjtoe2bjtos65535 karakter boollbjtos1bj tosTr u evagy False float4bj t os4b jtoe1, 2*10>1 t13,4"10"ig double8bjtos8b jtoe2, 2 *10-"'- tl 1, 8*10'''- i g l ongd ouble10 bjt o s10 bjtos3 , 4 *10"" -t6l l, l*10"" -ig TARTALOMJEGYZK I.rsz l. ra Bevezets a C+ +programozsinyelvbe lpsek aprogramozshoz....... . A C++nyelvjrsai(C++,ANSIC++,ISOC++s aWindows) A fordtteleptse sbelltsa Telepts a CD-r61., ................ . A Borland C++BuilderX fordtbelltsa...... . Fordt.'s a Borland C++BuilderX-szel A fordtprogram s a Fordts s linkels 3 .4 .5 . ..... 6 .. 6 ..... 8 ..... 9 ......... 10 .10Fordtsazintegrlt krnyezetben linkels .......... . .......... 11 A fejlesztsiciklus., .. HELLO.CPP - Az els6 C++programunk Fordtsi hibk...... . Krdsek svlaszok Gyakorlatok Kvz Feladalok Vlaszok akvzkrdsekre. 2.raEgyC++ programrszei lehet j vlaszts aC++nyelv. Procedurlis, strukturlt s objektum-kzpontprogramfejleszts . . ..... II 13 15 16 16 17 17 17 . 19 21 A C++rwelv s az objekmm-kzpontprogramozs. 22 Begyazs (encapsulation). . .. . .. . .. .. . .. . .. . ... ......... .. .... 23 s jrahasznosts.................... .. ....Tbbalaksg (polimorfizmus).... . .. .. .. . . . .. . 24 Egy egyszeru program rszei.......... . . 24 Az#indudc utasts viz.zinnenamoda... .. . . .. ....... 319 Szeletels (slicing). .. . .. . . .. .. .. . .. ........ 320 Virtulis destruktorok... . .. . .. 322 Tanuljuk meg a C+ +programozsi nyelvet 24 6raalatt Ixi Virtulismsolkonstruktorok A virtulis fggvnyekklL5gei..... . Krdsek s vlaszok........ . Gyakorlatok. Kvz rdadatOk Vlaszoka kvzkrdsekre. 18.raA tbbalaksgkifinomult hasznlata ... . 322 ... 326 . ....126 ..327 ..... 327 ..... 327 . .....~ 2 8 Problmk az egyszeres rkl6dssel....... . .. ...329 .. 334 ..338 ....342 345 Elvont adattpusok.. .. ........... . .......... resvirtu,lisfggvnyek....... ... ....... . .. . ...... . Azres viltulis fggvnyekmegva16ststl.......... . .. . Azelvonatkoztats sszetett hierarchija.. Melytpusok elvontak? Krdsek s vlaszok Gyakorlatok. Kvz.... FeJadatok Vlaszok tikvzkrdsekre........ . . . . .. . . .. . . 19. raLncolt listk Lncoltlistks egyb struktrk....... . Esetlanulmnyalncolt listk hasznlatrl Afelel6ssgtruhzsa.. Az alkotrszek Mialncolt listk tanulsga? Krdsek s vlaszok Gyakorlatok......... . Kvz Feladatok Vlaszok akvzkrdsekre......... . ..... . .. ... . . .. . VI.rsz 20.ra Klnlegessgek Klnlegesosztlyok, fggvnyek, mutatk Statikus tagvltozk. Statikustagfggvnyek Egymst tartalmaz osztlyok............... . .... . A tartalmazott osztly tagjainak elrse A tartalmazott osztly elrsnek korltozsa ........349 350 . 351 . 351 . ........ 351 .352 . ... 353 . 355 .355 ........ 355 364 365 366 366 .366 ....... 366 ... 369 . ...... 372 .... 374 . . .. . . . . 380 . . . . . 380 Xli, Tanuljukmega C++ programozsinyelvet 246raalatt A tartalmazs kltsge... .. .,. . . .. .. ... 381 rtk szerinLis hivatkozs slerintimsols.. .. ... ... . . , ... .. 381 Barti viszonyban osztlyok........ . ......... 381 Barti viszony fg&'Vnyekkzlt............... . .. . . .. ..... 382 Fggvnymutark....... ,. .. . .. .. .. . .. .... . 382 Rvidtett rsmd. .. . .. .. . .. .. . . .. .. 386 Fggvnymutatk tmbje. .. .. . .. . .. .. . ... .. . . .... .. 386 Fggvnymutatk tadsams fggvnyeknek... ..... 389 A type(k:r hasznlatafggvnynmtatkkal............ ............ 391 Tagfg&>vnyekrevonatkoz mutatk.. .. .. . .. . .. .. .. . .. .. .. 394 Tagfggvnyekre vonatkoz mutatkhlll tmbk........ ..... 397 Krdsek s vlaszok... .. . .. .. . .. . .. .. ........ 400 Gyakorlatok . .. . .. . .. .. . .. .. . .. .. . .. . ... . .. ..... .. 400 Kvz. .. . .. .. . .. ....... . .................... . ......... 400 Feladatok. .. .. . .. . .. . .. . . .. . .. . ... . ...... 401 Vlaszok akvzkrdsekre.. ..................... . ......... 401 21.raAz Az s afordt......... .. .......... . ................ 403 Akztes llapot mentse.. .. . .. . .. .. .. . .. . . . .. .. . .. .. .. . 404 A #denne direktvahasznlata.. . .. .. . .. .. . .. .. . .. . .. . .. .. .... 404 A . define hasznlatalland6kkalkapcsolatban.. .. . .. . .. . . . .... .. 405 A -*define s az '#ifdcf hasznlatavizsglatok vgzsre.. ........ 405 Az#else direktva.............................. ..... .... 406 Beszrs s annakvezrlse.. . . . .. .. .. ........... .......... 407 Szimblumokdefinilsa aparancssorban.......... . .... . .......... 109 Arnegszntetsc... . . ................ 409 Feltteles fordts......................... . ... . .... . . . ........ 409 Makrknt megvalstott........ .. Miez arengeteg zrjel?..... Makrk,fggvnyek,sablonok Karakterlncokkezelse.......... . . ........ 410 ........... 41 1 .. . .......... 413 . ............... 414 A szvegg ala kt(slringizing) opertor.. . . . .. . .. . . . .. .. ..414 Azopertor. .. .. . .. . .. .. . .. . .. .. . .. ... 414 meghalrozoamakrk. . .. .. . .. .. .. .. . .. . . .. ...... 415 AzaS5ertObeptett makr. . .. .. ............. . ...... .116 Nyomkvets az assertO makr6segtsgvel.418 A makrk mellkhatsai....... .. ................ 418 Osztlyinvarinsok............ .. ... 420 Kztes rtkekkiratsa...... .. ... ... 425 Nyomkvetsi szintek Krdsek s vlaszok Fe1adatok. .. ... .... .. ... . ... . ... . . . . .. ... 426 .......................432 .... .. ......... ... . . ..... . ...... . .... . . 4.l3 Tanuljuk mega C+ +programozsinyelvet 246raalatt I xiii Kvz, ...... ......... 433 Gyakorlatok., ...... ... ... ......433 Vlaszokakvzkrdsekre... ............ ........... . ........ 434 22.raObjektum-orientlt elemzss tervezs A fejlesztsiciklus. .. . .. .. . ... . .. . .. ., ., 435 riaszt6rendszer szimulcija... ...... ............ , . .. ., 436 Konce[Ki6lelV.......... ... ... .. .. . .. ........ 437 Elemzs s az ignyek felmrse........ ........... . ........... 437 Magas s alacsony szinnl teJVezs....... . .... .. ... . . ... .... 438 Egyb objektumok.. .. . .. . .. .. .. .. .. . . . ... .. 439 Milyen osztly.linklesznek?. . .. ... ................. 4,,9 Hogyan jelezzk ari:lsztsokat?.. . .. . . . ., . 440 Esemnyhurkok. .. . .. .. . .. .. 441 PostMaster:egyesettanulmny . .. .. . .. . .. .... . . ', 443 Mrjktszer, vgj eb'Yszer... .. . .. . .. .. . .. .. . .. .. ., ... 444 Oszdmeg s uralkodj... . .. . .. ... . . . . ., ... 444 zenetform;'itum. .. . .. . .. .. . .. . ... ........ ., .. , ...... 445 Az osztlyok kezdetitelVC........ ....... .. . ., ...... 446 Egyvagy tbb kiindulponthier'dfchia... ........ . .......... 447 Interfszektervezse.................. . .. ... ... , .. . . ....... 449 Prototpus ltrehoz.1S:l.................. . .. . .. . . .... 450 A 8O/80-as szably.. . . .. .. . .. .. . .. .. . . .. .. .. . . .. . . . .. .. .. . 451 A PostMasrerMessagc os;t.t{ilytervezse.. .. . .. . .. . 452 Azinterfsz.. ..... . ..... . ,. .., .... 452 Progmmozsnagy csoportokban......... , .... , . . . .. .. ... 454 A tervezsifolyamauaJkapcsolatos szempontok.. .. .. . . .. . .. ....... 454 TelVezsi dntsek... . .. .. . .. .. . .. . .. .. . .. .. . .. . .. .. .... 455 Mikor hozzunk dntseket?..... . . .. .. . .. . .. .. . . . .. .. . 455 Munka a.. .. . . .. .. . . . . . . . ... . .. ... . 456 Krdsek s vlaszok..... ........... .. , .. . 463 Gyakorlatok.. . .. . .. .. . .. .. .. . .. .. . .. ... ..... 463 Kvz... .... , . .. .. . .. . ... ..... , . .. .. ...... 463 Feladatok. . ........... .... .. . . .. . . .. ..464 Vlaszok akvzkrdsekre..... .... . .. .. . .. , . .. ....... 464 23. raSablonok Mikazok a sablonok?........ . ... ... . .. .. .. .. 465 A sablon pldnyostsa. . . .. ... ... .. . '. . .. . ..... , 466 A sablon defincija.. . .. . .. . .. . ... ...... , . . ........ , 466 Sablontpus hasznlata.. . .. . .. ... ..... .. . '. . .. .. ., 474 A szabvnyos sablonknyvtr. . .. . . .. ... . .. . ., 480 xiv ITanuljukmeg a C++programozsi nyelvet 24 6raalatt Krdsek s vla.o;zok Gyakorlatok ..... . Kvz. . ...... ........ . Feladatok Vlaszoka kvzkrdsekre .... . .... .. ......... . 481 .. .. .. .. .. .... 481 .. .. 481 ..... . . ... 482 ..... "..... ".482 24.raKivtelek,hibakezels s nhny tancs Programhibk, tvesztsek,k6dmegromls. . . . . . . . . . . . . . . . . .. ... 483 Vratlanesemnyekkezelse. . . . . . . . . . . . . . . . . . . . .. . 485 Ki vtelek. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . 485 Hogyanval6sitsukmeg akivlelkezelst?. . . . . . . . .. . 486 A try s catchblokkokhasznlata..... 491 A kivtelek elkapsa................. . . . . . . . . . . . . . . ... .. 491 Tbb catchmegadsa.. . . . . . . . . . .. . 492 Hivatkozs elkapsa - tbbrtsg a kivlelkezelsben..... . . .... .. 492 Hogyanrjunkprofesszionlis m i n s g programokat?.. . 496 Zr6jelek. . . . . . . . . . . . . . . . . . . . . . . . .. . . . . ....... 497 Hossz sorok. .. . . . . . . .. . .. .. . . .......... 498 A switchutastsok.. . . . . . . . .. . . . . .. . . . . .... . . 498 A program szvege................. .. 498 Azonost6nevek. . .. . . . . . . . . . . . . ... .... . .. .. . . . . ...... 499 A nevekbetO"zses anagybetukkrdse. . . . . . . . . . . . . . .. 499 Megjegyzsek. . . . . . . . . . . . . . . . . .. 500 Hozzfrs. . . . . . .. . . . . . . . . . . . . . . .. 501 Osztlydefind6k. . . . . . . . . .. . . . . . . . . . . .. 501 Beemelend6 ll omnyok.. .. .. . .. .... . ... .. . ... . . . ...... 501 assenO. . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . .. . 502 const... . .. . ... . ......... . . . . . . . . .. . . . . .. .. . 502 Tovbbi forrsok. . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . .. . 502 Hol kapunk segtsget s tancsokat. . . . . . . . . . . . . . . . .. .. 502 Ajnlott olvasmnyok. . . . . . .. . . . . . . . . . .. .... . 503 Krdsek s vlaszok. . . . . . .. . . . . . 504 Gyakorlatok.. ........ 504 Kvz.. . .. . . . . . .. ..... 504 Fe1adatok. . . . . . . . . . . . . . . .. . ....... 504 Vlaszok akvzkrdsekre.. . . . . . . . . . . . . . . . . . .. .. 504 VII.rsz A fggelk B fggelk Trgymutat . Fggelkek A binris s ahexadecimlis szmrendszerek..... . .. . ...... 507 Gyakran hasznltkifejezsek.. . 519 531 A Jesse Liberty szmos szoflverfejlesztsselkapcsolatos knyvet rtmr, amelyekkztt akad nhny kiugran is.Ez utbbiak a CH nyelvvelilletve a technolgivalkapcsolatosak.6avezet6je aUbeny Associates[nc. cg-nek, amely egyediprogramok fejlesztsvel , tancsadssal s oktalssal foglalkozik. David B Horvath eCCp) tancsad Philadelphiban,Pennsylvaniban LTbb mint15 ve dolgozik azinformatikbanilletve egyetemi tanr nhny helyiilIervetvoktatssal m(kd6 egyetemen.Azilalaoktatott t rgY'd.k a C++nyelvvel,aUnix/Linux opercis rendszerrel,valamint adatbzisokklllkapcsola-tosak.Diplomjt szervezeti dinamikbl szerezte aUniversity of Pennsylvanin 1998-ban. Tbb nemzetkzi szeminriumot s szakmai sszejvetelt vezetett mr SZgydediklt pldnyt,de ellltz6doll a projekt. - David B.HOIVa/h Ksznetnyilvnfts Mindenknyv kivl6 alkalmal teremt arm,hogyksznetet mondjunkbenne azoknak, akiknlkl garantltannem jllvolnaltre.Esetnkbena Staccy,Robins Rachel Liberty llnak az len. Ezen kvl szeretnk ksznetetmondanimindazoknak, akikakiadk-Sams, Que, O'Reilly,\'('rox - munkatrsaiknt segtenek abban,hogy eddigiffitlveim megjelenhessenek.A Sa msKiad valamennyienkivl munklvgeztek, mkln szeretnm kzlk kiemelni Carol Ackermant, ChrislyFr..mklints Paul Striclandel.Szintn hlvalta!lozom RiehHalpertnek.Vgezetl szeretnmmegk-sznniMrs.Ka1ismunkjt, aki1965-ben, hatodikoszt{llyoskorombanmegtantolIa nekem,hogyankelJkeHesszmrcndslerbcn sszeadni skivonni,mikzben sem 6, semminemtudtuk,hogy ezpontosanmireisj. -Jesse liben)' Mindazokmellett,akiknek Jesse az imntksznetet mondoLLvaljbanmg sokan le-hetnekIISamsnl,akiketkifclejtcttlink. cztonis elnzst szeretnk krni. J-magamSonglinQillval s LorellaYatcs-Sleldolgoztmn ezen;1projekten. Ezaknyv termszetesennemjhetett volnaltrea csa!{I c.!orn,killnskppenpedig felesgemMarytmogatsa smegrtse nlkl.Sajnosa knyvr.'ismr csak ilyen. Azembernek leginkbb estnknt meg htvgn vanideje s hangulataazalkotshoz, amikor a csalddalkellene lennie.Ilyenkor jn aztnade mostnem tudok vele-lekmenni,merta knyvnkelldolgoznom"szveg. -/)cwid B.Horoath Tanuljuk mega C++ programozsinyelvet 24ra alatt Ixvii Kfvncsiak vagyunk aznvlemnyre! Mintaknyv olvasja,n,kedves olvas amikritikusunk.ppen azrtnagyr.! rtkeljk az n vlemnyt. Tudni .szeretnnk,havalamit jlcsinltunk, s persze a7.t is,Itanem.Tudni szeretnnk,milyenms teriilctekr61 olvasna szvesen knyvekct eb-ben a sorozatban,s termsZdesenrmmelfogadunk minden egyb megjegyz.nynl- meg kellmon-danunk, hogyazmilyen tpus rt(:ketfogvisszaadni.Ezen aponton amain ()megint klnlegesnek szmt, mivelktelez6en egsz (integer) rtkkel kellvisszatrnie.Ezt atpustaCH nyelvben az intkulcsszjelzi, de err6! majd csak aharmadik rban lesz sz. Amipedig avisszatrsirtkeketilleti , a4.rbantanulunk.majd akifejezsek s utastsok kapcsn. 2.ra EgyC++programrszei127 Tudta hogy ... ? rtkek visszaadsa? A main ()fggvnyltalvisszaadott egsz rtket maga az opercis rendszer veszi t.Ezazrthasznos, mert ezaz egyetlen szmbizonyoshiballapotok }elzsre.Ezamgyteljesen ttalnosan hasznlt mdszer a termelsi vagyktegelt feldolgozst rendszerekben.A dologa gyakorlatban gynz ki, hogyaprogram ltalaz opercis rendszernek visszaadotthibakdol egymsikprogramvagy szkriptki tudja olvasni,s megtudjatennia lpseket,hogy rtestsea kezelket.(Ha pldul egykifejezettennagy adatfeldolgozsifolyamatrlvanSZ,akkor zeneteIkl d egy szemlyhvra, termszetesen szigoran azjszaka kells kzepn.) Mindenfggvnytrzse egy nyit kapcsos Lr6jellel kezd6dik,s - nem tlmeglep6 mdon - ennek GetAge() 23 :ves 'endl : 24 : 25 :dc1cteFr i s ky; 26 :returnO; 27 : Kimenet Frisky2ves Frisky5ves A 17.sorbanegy SimpleCat objektumpld{myjnltreamemriban, melynek let-konn az alapnelmezettko nstrukt or 2-re lltjabe.A lR.sorban aGetAge ()tagfgg-vnyt hvjuk meg.Ezmostegymutat;ilyenkor a lilii/afopertorraltudjuk elrni :1 hivatkozon tagfggvC: nyt.A 21. sorbanaSetAge ()metdus, a22.sorbanpedig jra aGetAge (lhvdikmeg. Adattagok a dinamikusmemriban Azosztlyokegy vagytbb adatlagjarmutathat amcm6riaegy-egy objekllllnra . A szksgesmemriaterletlefoglalsatnnhct az osztlykonstruktorban vagy vala-mely metdusban,afelszabadtsapedig adcstruktorban, ahogy az a10.3Listban islthat. 10.3 Lista - Adattal sl8r.pt jtsz mutatk(datamember.cppl o:/I10.3Lista 1 :IIAdattag-mutat6k 2 :iinclude 3 , 4:classSimpleCat 5 , public : Si mp leCat ( ) ; -SimpleCat{ }: 10.ra A mutatk kifinomulthasznlata187 6 , 7 , 8 , 9 , 10 : intcons t vo i dSetAge(inta ge ) return l (*itsAge"a ge ;) 11 : 12:intGet Wci9ht()con st{return*it sWcight ; 13 :voidsetWeight( i ntweight)(*i t sWeight=weight ; 14 : 15 :privat e : 16 :intitsAge ; 17 :int*itswci9ht ; 18 :) ; 19 : 20:SimpleCat : : Simp1cCat (J 21 :( 22 :i t sAge=new1nt(2) ; 23 :i t s Weightnewi nt ( 5); 24 : 25 : 26:SimpleCat , : -SimpleCat () 27 ,( 28,deleteitsAge : 29:deleteitsWeight; 30 : 31 : 32 :intmain() 33 :( 34 :SimpleCat*Frisky=newSimpleCat ; 35:std:: cout"Frisky"Frisky->GetAge() 36 :ves\n' ; 37 : 3B :Frisky->SotAge(S) ; 39 :std :: cout"Fr i s ky,Frisky->GetAge ( ) 40 :ves\ n'; 41: 42:deleteFrisky ; 43 :returnO; 44: Frisky2ves Frisky5ves ASimp1eCat osztlynakkt tagvltoz6javan, egszeket cmez. Akonstruk-tor (a20-24. sorban)inicializljaezeket amutat6kat gy,hogy a dinamikus mem6riate-rletremutassanak, s a vltoz6khoz hozz rendeli amegadou kezd6rrkekcl. 188 1111.rsz Mem6riakezels A destnIktor (a26-30.sorban) felszabadtjaalefoglaltmemriaterOletekcl.Minthogy ez adestruktor, nincs rtelmenullzniamutatkat,hiszen ezek a mr nem lesznek Ezegy bizlonsgosan vllalhat kivtelazonszably all, hogy atrltmutatkhoz rdemes null rtketrendelni ; persze nem okoz gondor a szably kvetsesem. A hvfggvny - jelen esetben amain ()- mit sem rud arrl , hogy azitsll.ge s az itsWeight a dinamikus memrirairnyul mutatk.Egyszenlenmeghvja a GetAge ()s a Get WeighL ()fggvnyeket, mint eddig is;amem6riakezels rszle-t.eielvannakrejtve az osztly megvalstsban - ahogy annak lenniekell . Amikor F'risky a 42.sorban, meghv6dik a destruktOJ:l.A deSlmklor mindenadattag-mutatt trl.Haezek kimutatnak egyb objektumokrais,melyek afel-Il:lszn{116{tltaldefinilt oszt51yokpldnyai, akkor azok destrukloraiismeghfv6dnak. Ezen ap6kl{tnjllthat6, hogy mirt rdemes sajt destruktort rni(afordt6progr.:tn1 llalfclaj{tnlotlalaprtelmezshelyett). Alaprtelmezettena28.s 29.sorbanlthat6 trl(:sektrt(: nnnekmeg;aprogramozmikkellezeket ll1itsLcngth=length; 10 :intGetLength()const(returnthis->itsLength; ll :voidSetWidth(intwidth)(itsWidth=widt h ;) 12 :intGetWidth()const{returnitswi dth ;} 13 : 14:private: 15 :intitsLength; 16 :intitsWidth ; 17 :) ; 18 : 19:Rectang1e : : Rectang1e () 20 :( 21 :i t s Width=5 ; 22 :itsLength;;10 ; 23 : 24: 25:Rectangle :: -Rectang1e() 26 :( ) 27 : 28:intmain() 29:( 30:Ractanglet haRect ; 31 :cout"Tgla1apom"theRect . GetLength() 32:lbhossz ."end1; 33:cout"TglalapomtheRect . GetWidth() 34:"lbszles . "endl; 35 : 36 :theRect . $et Length(20) ; 37 :theRect . SctWidth(lO); 38:cout"Tgla!apomthcRect . GetLcngth(l 39 :"lbhossz . "endl ; 40 :cout"Tglal apom"t hcRect . GetWidth() 41 :lbszles . "endl ; 42 : 43:returnO, 44 : Tglalapom10lbhossz . Tgl alapom5lbszles . Tglalapom20lbhossz . Tgl alapom10lbszles . 190III. rszMem6riakezels -A SetLength ()s GetLength()hozzfr6 f&!,,,,nyekkifejezetten athis mutatt hasznljk aRectangle objektum tagvltozinak elrsre,ellenttben a SetWidth (J s GetWidth ()hozzfr6 fggvnyekkel , melyek msknt dolgoznak. Nincs klnbsg aviselkedskben, csakabban,hogy athis nlklimetduskdjatalnolvasl1at6bb. Tudtahogy ... ? Mire is val6 teht eza this mUlat6? Ha csak ennyirtelmelennea this hasznlatnak,nemlett volna rdemesmeg-emlfteni.A this mutat hordozzaaz adott obj ektum memriacfmt - ezigenhat-kony eszkzlehet! A knyvegy (14.)fejezetben lthatjuk majdennek a gyakorl ati felhaszn-lst azopertorok tlterhelsnl. elgannyiis,hatudunk a this muta-t sarrl.hogy magra a szban forgobjektumra mutat. Semmi dolgunk vele,nemkellltrehoznunk vagytrlnnk - eztel vgzi helyettnk a fordtprogram. Gazdtlanvagy "lg" mutatk A programhibk egyik forrsaa gazdtlan mutatkb61ered, melyeket nehz s kellemet-len felkutami.Gazdtlanmutat akkor keletkezik, amikor trjnk egy mutat6t (delete-leO - ilym6clon felszabadt juk a hivatkozottmemriaterillelet - s ks6bb anlklkis-rcljkmeg jrahasznlni ezt a muratt, hogybrmit ishozL1rendeltnk volna. Olyan ez,mintha egy cg elkltzne telephelyr61, s egy gyfelkargisti'imon pr-blnatelefonlninekik.Lehet, hogy semmiklnsnem trtnik - csng egy telefon egy elhagyott irodahzban.De az islehet,hogy ezt a szmotmr valakims hasznlja, akiesetleg azjszakt, s ez a telefoncsrgs breszti legszebb lmbl. Rviden:nehasznljunk olyanmutatkat, melyeket e16z6leg trltOnk.A mulat to-vbbraisamem6riaegy bizonyos terletremutat, de ;1fordtprogramnak jogavan oda ms adatokat tenni, gy ennek a mtJtatnak ahasznlata IIprogl"J.msszeomJs-hoz vezethet.Ennl isrosszabb,ha aprogram vganfuttovbb, s ahiba csaknhny perccel ks6bb kvetkezikbe.Eztbombnakhvjk, snem tlvicces.A biz-lonslig kedvlt rdemes NULL-ralltani (s ezzellefegyverezni)ahasznlatonkvl helyezettmutat6kat. Aprop K6bor mutat6k Az.gazdtlanmutatkat kbor vagy lgmutatknakishvjk. 10.raA mutatkkifinomult hasznlata191 Konstansmutatk Mutatk esetben aconst kulcssz61 titpus utn, vagy mindkt helyenhat juk.Azalbbi deklarcikmindhelyesek: constintpOne ; intcons tpTwo ; c onstintconstpThree ; Ezek klnooz6mutatkat eredmnyeznek.pOne ch'Ykonstans egszre mutat.A hivat-kozou rtket nem lehet megvltoztarniamutatnkeresztl,azaznem az albbi sor: ' pOnc=5 HaeZIks6reljk meg, hibt ada forJt6progmm.pTwOkonstans mutategy egszre. AhivatkoZQIIszm rtkemegvltoztathal6,de ap'I'wonemmutathat sehovmshov. KonsWnsmutat6hoznemlehetmsvl tozt rendelni.Azaznem a kvetkez{}: ..&x pThree konstans mutat egy konstans egszre. A hivatkozott szm rtke sem vlloz-tathatmcg, s apThree sem mutat hat semmimsra. Hzzunk egy kpzeletbeli fgg61egesvonalat :lcsill ag jobboldal n. Haacons tsz avomtlt61balraesik, akkor azobjektumkonstans,s hajobbr-.l , akkor pedig amaga mutatvltoztathatatlan constintpl ;IIAhi vatko.,;otteg!lzkonstans i ntconstp2;I Ip2konsta ns ,nemmutathatsemmimsra . Konstansmutatk s konstans tagfggvnv.k A 7. 6rn tanultunk az osztlyok alapjair61.Olivolt sz arrol, hogya const kulcsszt lehet tagfggvnyekre is vonalkOZL1. tni.l iaegy fggvnytkonstansknt dekladlunk, afordl6progr-.unhibajelzsselm3st viSszaminden ksrl etet, amellyel az adon fgg-vny vltoztatniakama azobjekrumon. Hakonstans objcklumra hivatkoz6an deklar lunk egy mutatl, akkor ezt csakiskons-tam;mctdusokkallehet hasznlni.A 10.5Li sta ezt illusztrlja. 10.5 Usta - const objektumot cimz6mutat hasznlata (constptr.cpp) o :!!10 . 5Lis ta l :I Ikons tansobjektumotc i mzomu tat6ha s.,;n l ata 2 :'incl ude 3 , 4 ,classRect angle 5 :{ 6 :public , 192 1111. rsz7 :Rectangle() ; 8 :-Rectangle() ; 9 :voidSetLength( intl e ngt h)(itsLength=leng t h ; 10 :intGetLength()const{ret urnitsLength;} l l : 12:vo idSetWi d th{intwi dt h)litsWid th- wi dth; 13 :i ntGet Wi dt h()c on s t{retur ni t s Width ;) 14 : 15 :private : 16 :intitsLength; 17 :intitsWidth ; 18 :} ; 19 : 20 :Rectangle: : Rectangle (): 21 :itsWidth(S) , 22 :itsLength (10) 23 :(l 24 : 25 :Rcc t angle : : _Rectnngl e () 26 :{} 27: 2B :intmain() 29 : 30 :Rectang!a*pRect=newRectanglc; 31 :constRectangle*pConstRectnewRectangle ; 32 :RectangleconstpConstPtr=newRectangle ; 33 : 34 :std: : cout'pRectszlessge :" 35 :pRect ->GetWidth()lb"std: : endl ; 36 :std :: cout"pCons t Rectszlessge : 37 :pConstRect->Cctwidth()'lb'std,, endl; 38 :st:, cout' pConstPt rszl essge , 39 :pConstPtr->CetWi dth ()'lb'std:: endl ; 40 : 41 :pRect->setWidth(10) : 42 ,IIpConstRect->SetWidth(lO) ; 43 :pConstPtr->SetWidth(lO) ; 44 , 45 :std:: cout'pRectszlessge: 46 :pRcct->GetWidth()lb'std:: endl ; 47 :std , , cout'pConstRcctszlessge : 48 :pCons t Rect->Get Width()l b "std:: cndl , 49 :s td : : cout'pCons tPt rszlessge : 50 ,pConstPt r - >GeLWidth()lb's td : : endl ; 51:returnO; 52 : pRectszlessge :5lb pConstRec tszlessge :5l b pConstPtrszlessge :5l b pRectszlessge :10lb pConstRcctszlessge ,5lb pCons t Pt rs z l essge :1 0l b 10, ra A mutatk A 4- 18.sorokban deklarlunk egy tglabpot.A 13.sorban aGetWidth ()tagfggvnyt konstansknt deklarljuk A 30.sorban cgy mutatva!hozzukIIreapRecttglalapot. A 31.sorban deklarlt pConstRect egy konstans tglalaprahiv:ltkozmulat.A 32. sorban ltrehozott pConstPtr pedig egy tglalaprahivatkozkonstansmulat. 11.34-39.sorok kirjk ahrom szlessg-rtket. A 41.sorbanapRect segtsgvcl lllitjuk az els6 tglalap szlessgt 10-fe. A 42.sor-ban a pConstRect hasznlatvaltennnk de ez IImUlat egy konstansknt fel-vetitglalaprahivatkozik,melynek rtke nem vltoztathat, s nem hvhat meg r nemkonstans L:tgfggvny.Eza sor tch:1tmegje,gyzssvan alakitv:-I,A 32.sorban 3 pConntPtr konstans mutatknt lettllfehozvGetAge (). A ( - opertor jobb, mivel rnzsre isnyilvnvalanmutatjaaprogra-moz szndkt. 4.Gazdtlanmutatrl akkor beszlnk,haazutn ksreljk meg amemria hasznlatt egy mutat rvn, miutn mr azt amulatttrltk.Ilyenkor nem tudhat juk, hogy azadottmemriaterlet milyen szerepbenll! 11.RA Hivatkozsok Ebbenazrbana sz: Mik azok a hivatkozsok Mibenklnbznek ahivatkozsok amutatktl Hogyanlehethivatkoz.'isokat ltrehoznis hasznlni Mi lyenkorltai vannak abivalkozsoknak Hogyanlehet afggvnyeknek rtkekets objeknllnokal tadni s t510ktven-nihivatkozsok segtsgvel Mi aza hivatkozs(referencia)? Azelmltkt rnttekintettk amutatkhasznlatr; hogy segtsgkkelmiknt le-hel adinamikus memriban objektumok kalbnni, s hogy hogyan lclu;!(ezekre az objektumokrakzvetettmdon rmutatni.A hivatkozsok, ezen az rn sz6 lesz,arnutatkhozhasonlanhatkony eszkZT adnakakeznkbe,csak jvalegysze-nbb szintaxissal. 196 1111.rszMemriakezels A hivatkozs egy alternatv nv ( alias).A hivatkozst egy msik objektum, a clobjek-tumnevvellehet inicializlni. apillanattlkezdve ahivatkozs b.'Yviselkedik, mintha magaa clobjekt umlenne; brmi , amit ahivatkozssaltesznk, megtrtnik aclobjektummalis. Ennyiaz egsz.Nholgy emlegeti ahivatkozsokat,minthaazokmutatkle nn-nek,de eznempomos.Br gyakran tnyleg mutatknt valstjkmeg 6kel, ez csak afordtprogmmokgyrtiratartozik.I' rogmmozknt elkellmdniklnteniakt fogalmat. AmUlatkolyanvltozk,melyek egy msik objekmm memriacmt troljk.Ahivat-kozsok ezzel szembenegy msik objektumnvvltozatai. Hivatkozsokltrehozsa Hivatkozst gy hozh:nunk ltre,hogy megadjuk a20) ret urnERROR; else , r Squared::n *n ; r Cubed'"n"n*n ; returnSUCCESS ; Enteranumber(O-20) :] nwnbe r :] square :9 cubed :21 IIsimpleerrorcode 210 1111.rsz A 11.8 stamegegyezik a11.7Listval , kl kivtelle1.AzERR-CODEfelsorolsos tpus tllhat6bbtesziahiba jelentseket (33.s 38.sor) , valamint a19.sor hibakezelsl. A v lt ozs azonban abban ll , hogya Factor ()fggvnytmost gy dek-larltuk,hogymutatkhelyett hivatkozsokal vr asquared s acubed helyre. A pa-mmterekkezelse h'Ysokkal s Krdseks vlaszok Krds:MirtIJtlsznljl/llk hivatkozsoka"Itaclmutat6k mindarnl kpesek,amire CIhfvatl.lozsok? Vlasz:A hivatkozsokat knnyebbhasznlnis megrteni.A cmfeloldsrejtenentr-tnik,nincs szksg ismtelt cmfelold opertorokra. Krds:An,.,hasz/llj/.mkakkor /IIuUll kat,haegyszerl1bbek CIlIiv(l lkoz!ok? Vlasz:A hivatkoz{!sokat nemlehet null zni,sempedig jrafelhasznlni.A mutatk rugalmasabbak,de valamivelnehezebbahasznlatuk. Gyakorlatok Most, hogy megismerkedfnk ahivatkozsokhasznlatval , vlaszoljunkmeg nhny krdst s vgezznk elnhny feladatO[Uldsunk Kvfz 1.Miaz ahivatkozs? 2.Milyenopertorralhozunk ltreegy hivatkozst? 3.Miegy hiv"koz's mem6"ocime' 4.Miafggvnyek al aprtelmezett paramtertadsi mdszere aC++-ban? Milyen mdonlehet ennek korl taittlpni? Feladatok 1.Egyestse apassbyptr. cpp s apassbyref. cpp (11.5s 11 .6Lista)programja-ibanhasznl t mdszereket gy,hogy az egyik rtkel mutat,amsikat hi vat-kozs segtsgvel adjat aswap ()fggvnynek!Ezjl mutatja,hogy ekl mdszer teljesentj rhat. l1.6raHivatkOLls.kl 211 2.Mdosrsa gy areturnwithptr. cpp programot (11.7Li sta),hogy mutatk he-lyeuhivatkozsokat hasznljon! 3.Bontsahrom rszre areturnwithptr. cpp programot Cl 1.7Lista)oly mdon, hogy HZeredeti nvenmaradjo nmeg a (returnwithptr . cpp), aFactor ()fggvnymegv.d6stsakerljn t egy klnfjlba(factor. cpp), slegyen egy fejlcllomnyisaFactor {}fggvnyproTolpusval (fa ctor . hpp).Vegyefelafactor. cpp-taprojektllomnyok kz,(:$fordtsa le aprogmmot!Ezazt szemllt eti,hogy hogyan lehet megosztani afggvny- s osztlyknyvtrakat.Afggvny lefordthat sa gpi nyelv{[ progmmkd a fej-lcll omnnyal (bclUle aruggvnyprototpussaD egyttkzzlehe16 atermel-kenysg javtsra. Vlaszok a kvfzkrdsekre 1.A hivatkozs valamely vltOl6 vagy objektumszinonimja,nvvltolat.1, 2.Aljel (&)hasznlatvallehec hivatkozst deklarlni.A hiv:ltkozsokat inida-lizlnikelladeklarlskor.Nem lehet null hi vatkozsul,k, csaklenulIzottmu-tat6nk. 3.A hivatkozs cme annaka vltoznak vagy objektumnak acme,amelyreutal. Ha :1 . cm(/'opertorl alkalmazzuk egy hivatkozsra, akkor (amutat6kkal ellen-ttben) gyhogy semmihelyet sem foglalel amemriban. 4,Azrtk szerintipammter:'uads.Il yenkor az tadott vllOZmsolatval dolgo-zikafggvny, gynemlehet fellrniaz tadott vltoz61.Ezenktflem6don lehetfellemelkedni:egyrszt amutatkhasznlatval,ugyanis ilyenkor az ob-jektum cme kerl tadsra.Msrszt hivatkozsok tadsval, hi szen ezzel az eredeti vltoz nvvllozatl kapjameg afilggvl1y. 12.RA A hivatkozsokrlsmutatkrl - mlyebben Ebbenaz6rbana sz6: llogyan tehetjkhatkonyabbprogramjainkat cm szerintiparamtecitadssal Mikor rdemes hivatkozsokat hasznlni,s mikor mutatkat HogyanIcgyilnkrramcmriagondokon amutatkkzben Hogyankerljk elahivatkozsokkal kapcsolatos csapdkat Hatkonyabb a cfmszerintiparamtertads Azrtk szerintiparamtcrt:tdskor msolat kszl az objeklumr61.Haafggvny visszatrsi rtke egy objekt um, akkor megint egy jabb msolat keletkezik. Nagyobb mrcr,felhasznl ltalltrehozou objekrumok esetn ezeknek amsolsok aszITtsignycmr igenislehel.A szksgesnl tbbmemrithasznl aprogram, s vgs6 soron sokkal !assabban fut. 214 1111. rszMemriak.,.l. Egy,afelhasznl ltaldefinilt objektummrete averemben az egyes tagvltozk mretnek sszege.Ezen tagvllozk akr nagy objektumok islehetnek. Egy efflegi-gantikus struktra tadsa(azaz a verembemsolsa) igen sokba kerlhet memrias futsivonatkozsban. Msflekltsgekisfellpnek ilyenkor.Az oszt{llyokplclnyostsakor kszlrluk t'b'Yideiglenesmsolat;ilyenkor afordt6progmmmeghv egy specilis konSlnlktOI1: amsol konstruktort.A 13.rn,aIxmyolulwbbfggvnyeknlmegtanul juk,hogy hO!''Yan ezek amsolkonstnlktorok, s hogy hogyankszthetnkma-gunknak ilyeneket;mostazonban elg annyit tudnunk, hogy egy objektum ideiglenes msolatnak averembe msolsakor meghv6Ohnhan.me egy pldaerre: cout"hel loworld. \n"; C++-ban akal"oIkterlnctulajdonkppenegy karaktert mb, amelynek vgt egy null karakter jelzi.(A nullkarakter jellsre - megklnbztetend6 a NULLrtkUmutat-tl- a'\0' hasznl:1tos.)Ennek megfelel6en egy kal"oIktcrlncot deklar.'ilhatunksini daliz lhntunk isugyangy, mint egy tmbt.Helyes tehtakvctez6 forma: charGrccting [l..{' H',' e ','l' ,' l ' ,' o ' ,' ' W' , ' o ', ' r' ,' l ' , ' d ',' \0 '}; A sortzri\0 'karakter az abizonyosnullkllrakter, ami alapjn aC++fggvnyei megtudjkmo ndnni, hogyholvan akarakterlnc vge.Br afentimdszer kpes,semknyelmesnek, sem biztonsgosnaknemnevezhet6.Sz{unoshelyen elle het gpelni,arTInemisbeszlve, hogy egy szvegetbetfinknt,elvlaszt vabegpelni inkbb gpr6ibravr, mint rtelmes mcgolds.ppen ezrt aC++bizto-stegy sokkal akarakterl ncok megads."ira: charGreeting[)""HelloWorld" ; 15, 6ra Tmbk 1283 Ezzela szintaxissal kapcsolatbankt dologra szeretnnk flhvniafigyelmet: Az ittnemegyszeres,hanem kell hasznlni,avessz6k s akapcsos zr6jelek pedig nemkellenek. Nem kellklnkirnunk azr nullkaraktert,az IIfordtprogramautomatiku-san beillesztiakarakterlnc vgre. A "Hello Worldn karaktednc11 ll , teht 12bjthosszsg. A Hello5 b{ljtot teszki,IIsz6kz egyet, aWorldjabb ll,azr nullkardkter pedig egy bjlOS. Deklarlhatunkinicia1i7..ci6nlkliskar:.lktertmbket.Ezeket szokspuffereknekis nevezni.Mini ffiindtmlmbnl, termszetesenillisgyelnnk kellarra, hogy nem akarjuk tbb karaktert elhelyezniegy ilyenlrban, mint amekkora amrete. Azinici:llizci nlk! dck!arlLkaraktertmbkhasznlatramUlat pldt a15.6.Lista. 15.6, Usta - Egykaraktertmb feltltse(arrayfilled.cpp) O;/115 . 6 .ListaKaraktertOmbOkpufferkntvalhasznlata l ;linclude " 3 ;i ntmain () 4 ,{ 5 ;charbuffer[801 ; 6 :std:: cout"Enterthestring ;' : 7 :std :: cinbuffer: 8 :std:: cout"Here ' sthebuffer ,bufferstd : : endl; 9 :returnO; 10 :} Kimenet Enterthestring :HelloWor l d Here ' st hebuffer :Hello Az S.sorban ltrehozunk egypuffert,amely 80 karAktertkpes trolni . Ez azt jelenti, hogy ebben atmbben egylegfeljebb 79bettls szvegel helyezhetnk el, hiszenkell egybjt alezr6 null karaktcrnekis. A 6. sorbanbekrunk afelhasznl6tlcgy szvegel,amit a7.sorban elishelyeznk 37..imntkialaktott pufferben.A cin automatikusan elhelyeziakarakterlnc vgt jel-z6nullkarakter, ezzel teht nemkelltr6dnOnk. A 15.6.Listbanbemutatottkddalktproblmais van.El6szr isnem tudjuk,hogy mitfoggpelni afelhasznl.Ha79 karakternl tbbet ad meg, akkor apuffer tlcsor-284 1 IV.rsz'Halad aszkzk dul,hiszenac in nem rzkeliavgl.A msikproblma,hogy ha afelhasznl sz-kzt isgpel, akkor acin azt fogjaabemenet vgnek tekinteni , s amaradkot be sem rja a pufferbe. Ezeknek aproblmknak amegoldsra kicsit tkell alaktanunk aprogramot:acin egy specilismetdust, aget() -et kellhasznlnunk.A c i n . get ()hromparamtcn vr bemt!nelk nl: A kitltcnd6 puffer nevt A beolvasnikvnt karakterek legnagyobb szmt Azt ajck:t, amit abemenet vgnekkelltekinteni Azalaprtelmezett "bemenet vge jel azjsor.A mdostott kd a15.7.Listban lthat. 15.1.Lista - Karaktertmb feltltse(msodik vltozat)larrayfilled2.cpp) o :1115 .7.L i!l t lAci n . get (}met6dusha sznlltv. l :#i nc l udc 2 . 3 :intma in() 4:I 5 :charbuffer[80] : 6 :std : : cout"Enterthest r ing :"; 7 :std :: cin . get!buffer,79) :IIgetupto79ornewlin 8 :/ltd : : cout"Here ' sthebuffer :bufferstd :: endl ; 9 :returnO; 10 : menet EnterthesLri ng :HelloWorld Here ' sthebuffer :HelloWor l d A ci n osztly get()rnetdust a7.sorbanhvjukmeg.Ennekaz argurnenmma az apuffer,amit az 5.sorban deklarlrnnk.A msodikparamter abekrhet6 karakterekmaximlis szma. Esetnkbenez 79, mivelapufferben gy mg ppenelfr azrnullkarakter is.A bemenet vgt karakter megadsraittmost nincs szk-sgnk,mivelazalaprtelmezettjsor erre aclrappen megfelel.A s annak mindenfleklnlegessgr61majd a21.rban sz6l unkrszletesebben. AzstrcpyOsazstmcpyOfggvnyek A C++rklte a C akarakterlncok kezelsre szolgl fggvnyeket.A sz-mos lehetsges mO"veletkzl iti csak szeretnnkkiemelni,amelyek karakterln-lS.6ra-cok msolsraszolglnak.Az c&'Yikaz strcp ()fijg&'Vny,amsik az s trncpy ( ) . Az strcpy () viszonylag egyszenT:vesziamegadottkamkLerlncot,s a tel-jestartaImttmsolja aszintn megadott pufferbe.Hasznlatt a15.8.Lsta szemllteti. 15.8.Lista - Az strcpyll fggvny hasznl ... (..ingstrepy.epp) o:1/15 . 8 .Lista- Azs trcpy()fo.ggvnyhasznlata l :#include 2:#incl ude ). 4:intmain () 5:{ 6.chnr 7:char ,. Stringll]="Nomanisanisland"; String2lBOJ ; 9 .strcpy (String2 , Stri ngl) ; 10: ll :s td : :cout string1 : 12:std : : cout"String2 : l):returnO; 14: JGmanot Stringl :Nomaniyanisland String2 :Nomanisanisland Stringlstd :: endl ; Stri.ng2std: : endl ; A2.sorbanbeemeljOk aSTRING . H fejlcllomnyt,amely tartalmazzaaz strcpy () fggvnyprototpust.Az strcpy ()bemenetkntkt karakt ertmbtvr,melyek k-zl az ilmsols c;(:lj a,s amsodik aforrlIs.gyeljnk amIis,hogy ha aforrns tbb adatot tartalmaz,mint nmennyi aclpufferbenelfr,akkor azstrcpy () en tlrjaazt. Ennek alchel,>geshibnakakikszblsre aszabvnyos knyvtr tartalmaz egy strncpy () vltozatotis,amelynekamsolnikvnt kamkterckmaximlis szmlIt ismcg lehet adni.A fggvny aznullkarakterig msol, vagy nmgelnem riezt azrgzLeuszmot.Azstrncpy ()fggvny hasznla tM szemlltetia15.9.Li sta. 15.9. Lista - Az strncpyO fggvnyha""lata (usingstrncpy.epp) o:II15 . 9 .ListaAzstrncpy()fo.ggvnyhasznlata 1:inc1ude 2:*lnclude ) . 4:intmain() 5 :{ 6:constintMaxLength:80; 7:charStringl []:"Nomanisanisland"; 286 I IV.rszeszk2k 8 ,charString2[MaxLength+l1; 9 . 10 :strncpy(String2,Stringl,MaxLength); ll:String2[strlen(Stringll]' \0';IIaddanulltotheend 12 :std :: cout'Stringl :J. r ~ 6 d s303 115 :Dogrover (5) ; 116 :Dogbustcr{6 , 8) ; 117 :Dogyorkie(3,YORKIE); 118 :Dogdobbie(4 ,20, OOBERMAN) : 119 :fido.Speak(); 120 :rover .WagTail () ; 121 :std : : cout'Yorkieis 122 :yorkie . GetAge ()yearsold\ n': 123 :s td: : CQut"Dobbicwcighs 124 :dobbi e. GetWeight()pounds \n'; 125 :returno: 126 : Aprop Sormmok akimenetben Az.elemzsutalsainakmegknnyrtshez sorszmokkallttuk ela kimenetet.Fu-tskzbenezeknemjelennekmega kpernvn. 1 :Mammalconstructor ... :2:Dogconstructor ... 3 :Mammal (int)constructor ... 4:Dog (int )constructor ... 5 :Mammal(int)cons t ruc t or .. . 6:Dog(int ,i nt )constructor .. . 7 :Marruna l(int)constructor . 8:Dog(int,BREED)constructor .... 9:Mammal(int)constructor ... 10:Dog(int,int,BREED)constructor. .. ll :Hammalsound ! 1," :Tailwagging ... 13 :Yorkieis3ycarsold 14 :Dobbicwc i ghs20Dounds 15 :Dogdestructor ... 16 :Hamma!destructor . .. 17 :Dogdestructor ... 18 :Hammaldestructor ... 19 :Dogdestructor . .. 20 :Mammald estructor. .. 21 :Dogdestruct or.. 22 :Hammaldestructor ... 23 :Dogdestructor ... 24 :Hammaldcstructor . .. -A 16.4Lista10.sorban megjelenik egy tlterheltkonstruktor:aMammalelfogadjapara-mterknl azem16skort.Az58-63.sorban tallhal megval6sts azitsAgetagv!cQ-z6t akonstruktornak tadott rtk alapjninicializlja, aparamterrel nem jellemzett itsWeightnkt pedig 5-re lltja. 304 1V.rsz s tbbalaksg A Dogszmrat tlterhelt konstnlktor llrendelkezsre (32-36.sor).Az az a lap-nelmezeltvltozat, amsodi knak az llatkort adhat jukmeg (csak gy,mint aMammalesetben).A harmadik konstruktor akort s a slytkri,anegyedig akon s afajtt,az tdik pedig akort, aslyt s afajtt. Fi gyeljkmeg a71.son , ahol akutyk alaprtelmezett konslruklOr.l az alap-rtelmezett konstruktort hvjameg.Br ez nem lennektelez6, ez egybenazt isdoku-memlja,bogy szndkosan aparamter nlkli alaprtelmezett bziskonstmktorthv-jukmeg. A bzisko nstmktor meghvsaegybknt ismegtrtnne, dc gymg nyilvn-valbban ltszik erre vonatkoz szndkunk. A 77-82. sorban vanaz akutyakonstruktor,amely egy paramtert vr,spedig az let-kon.A (78-79.sor) aDoginiciaJizljasajt bzisosztlyt, ii tadva neki akor par.'lmlelt,majdafa jtainicializlsakvetkezik. A84-90.sorbantal lunkegyjabb kutyakonstnlktort, amely kt paramtelt vr.Megint csak a sajt bzisosztlyinicializci6j:lval az rtkad61ista (amegfelele> konstmktor meghvsva!), de ezttalafajt 2 , ..egyszrmaztatottos ztlyban ] :enumBREED(YQRKIE,CAIRN,DANDIE,SHETLAND,OOBERMAN,LAS) ; 4 . 5 ,classM.limnal 6:( 7 ,public : 8,IIKonstruktorok 9 :Hammal (){std:: cout'Marrunalconstructor ... \0' ;} 10 :-Hamma l(){!:ltd :: cout"Hamma ldestructor ... \n' :} 11 , 12 :IIMstagtggvnyek 13 :voidSpeak()const{std :: cout'Ma mma lsQund l \n' ;} 14 :voidSleep()conat(std :: cout"shhh .I 'ms!eeping . \n"; 15 : 16 :protected : 17 :intitsAge ; IB :intitsWeight; 19 :l ; 20 : 21 :classDog 22 : 23 :public : publicMammal 24 :IIKons t ruktorok 25 :Dog()!std :: cout 'Oogcons t ructor ... \n'; 26 :~ D o g ( ) {std:: cout'Oogdes t ructor ... \n' ; 27 : 28 :IIMstagfggvnyek 29 :voidWagTail()(std: : cout"Tailwagging .. . \n" ;) 30 :voidBegForFood()(std:: cout"Begging(orfood . .. \n" ;) 31 :voidSpeak()const(std :: cout"Woof!\o" ;) 32 : 33 :pr ivate : 34 :BREEDitsBreed; 35 :}; 36 : 37 :intmain() 38 : 39 :MammalbigAnirnal ; 40 :Dogfido; 41 :bigAnirnal.Speak.(); 42 :fido. Speak () ; 43 :returnO; 44 : Mammalconst ructor .. Mamrna lconstruct or.. . Dogconst ruc t or ... Mamma lsound! Woof ! DogdesLructor. . Mam.maldes true tor . Mnmmaldcstructor ... 16.ra Az 307 A 31.sorban aDogosztlybanfellirjukaSpeak ()met6dust, aminekahatsr.!.aku-tyk aztfogjkmondani,hogy" IVOOp'.A 39.sorban egy bigl'l.nlma l(nagytfla/) eml6s{J ll alothozunk ltre;kOllstruktorinakksznhet6 akimenet els6 sora.A40. sor-ban jn ltrefi dokUlya,emiattkapjuk akimenet kvetkez6kt sort, az eml6s-s akutyakonsu1Jkloradhrtmagrl. A 41.sorban megszlalabiglulimal, majd a42.sorbanfido kutyais. A kimcnetb61 ltszik, hogy mindkt llat asajt Speak ()met6dust hvtameg. Vgl:1kt:tobjektum hatkrnkvlkerl, smeghvdnak adestnIktorok. Tlterhels vagy fellfrs? E klfogalomnem llmessze egymstl, azonba n alapvet6en n tartalmuk.Ami-kor tlterhelnk egy fggvnyt, akkor ann:tktbbviltozatlksztjkel (tlgyanabban az osztlyban) azonos nven, dems-ms paramter-szignatrftva1.Amikor viszont fe-llnlnk egy fggvnyt , akkor a szrmaZL.1tonoszllybanugyanolyanncvCs 118)'al1-ol)'a/I paramter-szignatrjfggvnytdeklarlunk, mint mni absosztlybanis megvan. A bzisosztly met6dusainak elfedse AZprogmmban aDog osztly Speak ()mel6dusaelfedteab!izisosztly azonos Jllctdust.Ez volt aslndkunk, azonbanvratlanmellkhatSOliislehetnek e Haazvanegy mozgst kifejez6 tlter11elt metdusa,s a kutykszmraezt fellrjuk, akkor ezzel az sszesilyen nev(i metdusvltozatot fe-llnuk. Haa Mammaltlterheli aMove ()fggvnyt, s hrom vltozatot valstmeg(az egyik paramter nlkli , amsik egy egsz paramtert, aharmadikegy egsz s egy irnyjcllegCparamtert vr),s aDogezek kzlcsak aparamter nlkli vltozatot rjafell,akkor nem lesz egyszeru aDogobjekrumok szmraamsik kt Move ( ) -vltozat elrse.Ezt a16.6Listbanlilhatjuk. 30a l V.rsz stbbalaksg 16.6 lista - Metdusok eHedse(hidingbase.cpp) o:1/16 . 6IIMetdusokel fedse 1 . 2 :#i nclude 3 . 4:c l assHammal 5 :( G:public : 'I :voidHove!)const(std: : cout'Hammalmoveonestep\n' ; 8 :voi dMove{intdistance)const 9 :{std :: cout'Marnmalmovedistanccstcps . \n ';} 10 :protected: 11 :inti tsAgc; 12 :intitsWeight; 13 :}; 1 4: 15 :c l assDogpublicMammal 16 : 17 :public : 18 :voidMove()const{std:: cout'Oogmove5stcps . \n' ;} 19 :l ;IIAjobbforditprogramokfigyelmeztp.tnok ,hogyelfogunkfedni .. egyfOggvnyt ! 20 : 21 :intmain() 22 :( 23 :HammalblgAnimal ; 24 :Dogfido ; 25 :bigAni mal ,Movfl ( ) ; 26 :bigAni ma l.Move (2) ; 27 :fido . Move() ; 28 ,IIfido . Move(lO) ; 29 :returnO; 30 : Kimenet Mammalmoveonestcp MaJnlUalmove2Gt ops . Dogmove5s l epl:l . Bes Minden flslegesadatoLs fggvnyr cltnlettnk az oszttyokbl.A 7. s 8.sorban deklarljuk aMammalosztly therhelt Move ()fggvnyeit.A 18.sorban aDogfeWlrja aMove ()fggvnyparamter nlkli vltozatt. A 25-27.sorbanhvjukmeg efggv-nyeket,melyek vgrehajtst akimenet mutatja.A 28.sor azonbanmegjegyzsbe van tve,mert fordtsihib{1lokozna. Hanem trtnt volnafellrs,akkor aDogpJd,lny meghvhatn aMove ( egsz)szignatrjvltozatot,de mivel fellrtl.lkazeredeti fggvnyvltozatok egyikt, gy valamennyivltozatot jrakellfogalmazni,hahasznl-niakarjuk Ez emlkeztet arraas7,ab{t1yra,hogy hamegadunk sajt konstruktort, akkor afordtprognlmmr nem t,mogalja az al aprtelmezett konstruktor hvst. Gyakorihib-d.,hogy fggvnyek fellrsakor elfelejtjk aconst kulcssZl,amely pedig aparamter-szignatrnrsze.Igy aparamter-szignatramegvltoztatsvalcs.lkelfed-jkabzisosztly eredeti fggvnyt,nem pedig fellrjuk Egyes fordt6programok figyelmeztetnek azelfedsre valahol ;115-19.sor krnykn. ABorlandfordtnem teszi ezt.Msfordtprogrdmokgytlikmeg,hogy - br van ametdusok elfedsre - cz gyakrantvedsb61bkad, gyinkhh kldenek egy figyelmeztetst,hailyent szlelnek. A bzismetdusmeghfvsa liafellisrtunk egybizismetdust, megvanra hogy azt hvjuk meg, csakmeg kelladni a teljes nevl.Eza bzisoszt,'ily nevb6I,kl kett6spontb61, vglafggvnynevl>61ll,pldul: Mnmmal::Move() A28.sort ennek megfelel6entlehetlle fogalmazni,hogylcforduljon a16.6Li sta: 28 :fido.Mammal::Move(10); Ezkifejezeuen a Mammalsajtmetdus:' t hvjamcg.A 16.7 Li staezt a lehct6sget nlU-taLja. , 6.7 Usta - A bzismetdu5meghvsaegy fellirt meldusbl(callingbase.cpp) o:II16 . 7II11bzismet6dusmeghvsaafelal!rLmet6duGb l 1 :j include 2 : ] :cl assMarranal 4,( 5 :public : 6:voidMove ()cons t(std:: cout'Marrunalmoveonestep\n";) 7:voidMove(intdistance)const 8:(std:: cout"Hammalmove 9 :d istance'steps . \n";) 10:protected: 11 :inti tsAge; 12 ,intitsWeight ; 13 :l ; 14: 15:classDogpublicMamma l 16 : 17 :public ! 18:voidMove ()const ; 19 :}; 310 IV.rszrkl6ds s 1bbalaks!g 20 , 21:voidDog :: Move()const 22:( 23 :std: : cout'Indogmove . .. \n' ; 24 :Hammal :: Move (3) ; 25 :} 26 : 27 :intmain() 28 : 29 :Manunll lb igAnimai ; 30 :Dog(ido ; 31 :bighnimal . Move{2) ; 32 :fido . Mammal :: Move{6); 33 :returnO; 34 : menet Mammalmove2Mammalmove6stcps . Bamzs A 29.sOl'banltrejn egy bigAnimai (nagyl/ lIat) cml6s{l llal, majd a30.sorb:11l fido, akutya.A 31. sorban [[Ilhatmetd ushvs neml6sk Move ()fggvnythvja mcg, amely egy egsz szmpardmtert vr. A programoz a kutya szmraisil yenegyparamleres Move ()fggvnytszeretne meghvni, dc ez akadlybatkzik.A Dogosztly fellrtaaz eredeliMove ()fgg-vnyt, denemvette a fradsgot IIllterhelsrc,snem fogalmaztameg azegypara-mteres vflltozatot.Ezen gy segthetnk, hogykifejezetten abzisoSZllyMove () fggvnytnevezzk meg a 32. sorban. H81y81 rdemeskiLerjesztenia bevMtoszt-lyok fl.lnkcionalitst aszrmntalott osztlyokban. Abzisoszll y metclusain:lk fellr-sval rdemes bizonyos s7..l nnazta-totl fiiggvnyekmkdstmegvl-taztatni. H8lytelen Neessnk abba ahibba, hogy apa-ramter-szignatramegvlt oztatsval vletl enl elfeclnk egybzisfgg-vnyt. Krdsek svlaszok Krds:Ork/6dncl.!-e tbb genercint aszrmaz/atollosztlyok adaltagjai 6fgg-t-tllyei? ifa aMulya egys elZ egy l/al,akkor rkli-eIIkut)'aaz llatok-raada/okais jiiggvnyeket? Vlasz:Igen.Az folyamatban aszrmazlatott osztlyok min-den adatt s fggvnylmegkapjk. Krds:lalakfhal-e etv' szrmaztatott osztly egy nyi/vllos (p/lblic) bzisJliggvnyl priu' ra? F/asz:Igen,de ebben az esetben ez nemfogltszani iltovbbiszrmaztatottoszt-lyokbnJl. Gyakorlatok Azel mlt 6dban ;iZ rkl6dssel. Most vlaszoljunk meg nhny krdst sv{:gczznk cl nhny feladatot tudsunk ellen6rzse s megerostse vgett! Kvfz l.Mialecsupaszts clja? 2.Mirtrdemes egy osztCtlyl sznnaztatva3.A fejezelprogramjaiban (16. 1-16.5) lallkozhatott az enumut:lsitssa1.Ezmitcsi-nl? 4.Mirtlehet rdemes elrejteni egy bzisfggvnyt a szrmaztatott osztly (mint ahogy az a16.6listban istrtnt)? Feladatok l.A hidingbase.cpp programban 06.6 Li sta) vegye kia a28. SOlt.Mitl1nik?Hogyanlehetmgis tenniaprogramot? 2.Mdostsagy aderivedobject. cpp programot 06.2 Li sta),hogy afajta (breed) nyilvntartsm afelsorolsosvltoz helyett szveges vltozt hasz-m ljon. 3.A baseoverride . cpp programban (16.5Li sta) csak az sz.3.mrallren-delkezsre aSleep ()fggvny.Mdostsa gy aprogramot, hogy bigAnimal s f ido ishvjameg ezt amel6dust. 312 1V.rsz stbbalaksg Vlaszok a kvfzkrdsekre 1.A lecsupaszts rvnpillanatok alaltfuttathat6v egy fggvny. Nem kell afeladat megvalstsnak aprrszletei rekoncentrlni; egy ks6bbi ban isbe lehet fejezniavzlatosan elk!szlt fggvnyt. 2.Egy osztly szrmaztatsa gyakran sokkal egyszenThb, mint a megrni. Hamr nhnyvonatkOzsbanjl mil1kezdennk 3.Azenum lehet6v teszi (amesterklt s nehezen lthel6 szmk6dokhelyett) abeszdes szimb61umnevekhasznlat.l,lrunt pl dulaYORKIE. 4.Aosztly viselkedse eltr abzisosZtlyt61,oly-annyira,hogy nhny bzisf'ggvnymr hasznlhatatlan.Mivelnemmindig vanarra hogyabzisoszrlyhoz hozznyljunk(pld:lulmert nincs is meg aforrsa),ezt amegoldsTrdemeshaszn{llnL 17.RA A tbbalaksgsa szrmaztatott osztlyok Ebbenaz rbana sz: Mikazok a viltu:'lisfggvnyek Hogyan hasznljuk avirtu:'lis dcslruktorokat s msol konstmktorokat Miknt teszikleher6v avirtulis fggvnyekabzisosztlyok tbbalaksng:'t Milyenkltsgei s veszlyei vannak avirtulis fggvnyeknek A virtulis fggvnye kkelmegvalstott tbbalaksg Azfejezetazthangslyozta, hogya kutya tpus objekrum egyben lpus objektum is.El eddig cz pusztn .lZl jelentene,hogy akmya objektum rkltminden Tulajdonsgot (adatot) s kpessget (fOggvnyr) abzisosztlyt61. A C++-ban azon-ban a "rszt!'relci ennl mJyebb sszefggst takar. 314rsz A tbbalaksgteszi, hogy gy bnjunk egy szrmaztatott osztllyal, mintha az abzisosztly objektumalenne.Tegyiik felpldul , hogylt rehozunknhny spe-cializlt eml6st j kutyt, macskt, lovat stb. Mindezek az osZtlyblszrmaznak, gy az is asmukra. Az egyikilyenlehet aSpeak () . Mindenadki valamilyen hangol. Megszeretnnktantaniminden szrmaztatott llatfajt a specializlthangadsra.A ku-tyaugasson,amacskanyvogjon stb. Minden osztl ybanfellkellrnunk aSpeak () met6dust. Ugyanakkor,hamr van egy sereg llatunk (pldul egy farmnyikutya,macska,l s tc-hn objektum), akkor szeretnnk farmjtt:kunkban tudatni ezekkel az ll atokka l, hogy jvol na, ha beszlnnek (SfX'ak),de azzalnemkvnunk foglalkozni,hogy mikntisva-16stj:kmeg eZl akpessgket asajt Speak ()metdusukkaLAmikor ezeket az llato--kat cgysz(,;!r(,;!!1Move(); 29 :pDog->Speak{) ; 30 :returnO; 31 : Hammalconstructor ... DogConstructor ... Mammalmoveonestep woof! A 9.sorban az eml6s oszt.ly biztosit egy Speak () vinulis fggvnyt.Azoszt.ly ezzclkifejeziazt a sz.'indkt,hogy cz az osztly ms osztlyok bzisosz-llyalegyen.A szrmazulloll osztlyokban fellfogjkirniezt a fggvnyt. A 27.sorbHnltrejn egy eml6sre ulal mUlll1,apDog;ehhez egy jkutya objekmm cmtrendeljkhozz.Mivel akutyaeml6s,ez ahozzrendels helyes.Ezzelamutal-valhvjukmeg azutnaMove ()fggvnyt.A fordtprogramgytudja, hogya pDog egy mutatja, gy az em16sknlke resiaMove ()metdust. A 29.sorban amutat6vala Speak ()fggvnyre hivatkozunk.Mivel a Speak ()vimI-lisfggvny, akuryaosztlya ltalfellrtSpeak ()metdus hvdikmeg. Ezmr-mrlegalbbis abban avonatkozsban, hogya hv fgg-vnynekcsak egy mutat6ja van,millmgis egy kmyamet6dusllud meghvni. Haegy egsz lmbnyi mutatnk lenne, s mindegyikvalamilyen 315 316 mazOllrdhivatkozna, akkor ismind-mindsorban a neki szntfggvnythvn meg. A17. 2 Li staeztmUlaljabe. 0 ,II17 . 2Lista- TObbvirtulisfggvnyegymsutnimeghvsa 1:'include 2, ]:classMamma! 4, 5 :public : 6 :Mammal(): itsAge(l) 7 ;-Mammal( ){) 8 :virtualvoidSpeak()cons t(sta : : cout"Mammalspeak!\n"; 9 :protected : 10 :intitsAge; ll :) ; 12 : l] :c l assDogpubl icMammal 14 : 15:public: 16:voidSpeak () const(std :: cout"Woof! \n " ;) 17:); 18: 19 : 20:classCatpublicHammal 21:{ 22:public: 2]:voidSpeak()const{std::cout"Meow!\n";} 24 :); 25 : 26 : 27:classHorse 28:( 29:public: publicHammal 30:voidSpeak () const(std :: cout'winnie! \n" ;) 31:J; 32 : ]] :classPigpublicHamma l 34 : 35 :public : 36 :voidSpeakO c onst(f;td :: cout'Oink l \n' ;) 37 :) ; 38 : 39 :intmain() 40 : 41 :Mammal *theArray(5J ; 42 :Mammal*pt r; 43:intchoice,i ; 44 :for(i"O;i Show{) ;}IItruhzs! 80 : 81 :private: 82 :Data"myData;IImagaazadat 8] :Node 'myNext;IIalncoltlistakvctkez6csompontjramutat 84:}; 85: 86 :IIAkonstruktorcsakinicializl 87:InternalNode: : InternalNodefData..theData,Node"next): 88 :myData(theData),myNcxt(next) 89:( 90:) 91: 9] : 94 , 92 :II 1/ 1/ II alistatartalma HajelemetadunkalJsthoz, akkorezegyacsom6ponthozkerul , kelltovbbhaladniaazjelemnek, amieldnti,hogymerre hogyvgalhelyrekeruljn.95 : 96 :Node"InternalNode :: Insert(Dat atheData) 97 : 9B : 99 :IIAzjtag vagynagyobbnlam? 100 :intresu l t=myData->Comparc (*thcDat a) ; 101 : 102 : 10] :switch(result) 104 :( 105 :IIkzmegegyezsszerintazaz vizsglat,hogyazonos-e 106 :casekIsSame:IItcsorgunk 107 :casekIsLarger:IIazjadatelmke rl lOB :f 109 :InternalNode*dataNode= 110 :newInternalNode(theData,this) ; lll ,returndataNode; 357 358 1V.rsz s tbbalaksg 112 : 113 : 114 :/ /nagyobbnlam,gytadomakvetkez6csom6pontnak, 115 :/ /knl6djonmegVELEinkbb116 :casekI sSmaller : 117 :myNext=myNext->Inscrt(theDatu} ; 118 :r eturnthi s ; 119 : 120 :returnthis ;1/afordtprogrammegnyugodhat 121 : 122 : 123 : 124 :/ IAlistafarka 125 :classTailNode 126 :{ 127 :public: 129 :'l'ailNode ()() csakegypublicNode 129 :virtual-TailNode() (J 130 :virtualNode*Insert(Oata*theData) ; 131 :virtualvoidShow(){} 132 :private: 133 :l; 134 : 135 :1/Hahozzmrkezikegyadat.akkorannakelmkellkerl11nie. 136 :/1mertnvagyokavg,sSEMMIscmjhetutnam 137 :NodeTailNode ::(Data*theData l 138 :( 139 :InternalNodedataNode=newInterna1Node(theData,this) ; 140 :rcturndataNocle ; 141. : 142 : 143 :IIAfejnemtartalmazadatot,hanemrmutat 14 4:IIazada tlistaelejre 145 :classHeadNode:publicNode 146 :( 147 :public : 148 :HeaclNode(); 149 :virtual_HeadNodc()(deletemyNcxt ;I 150 :virtual *Insert(Data*151 :virtualvoidShow(){myNext->Show();} 152 :pr ivate : 153 :Node*myNcxt; 154:} ; 155 : 156 :1/ 1/ Mihelytkszafej . ltrehozzaafarkat157 : 158 : 159 : 160 : 161 : 162: HeadNodc, : HeadNade ( ) { myNext.,.newTailNode; ) 163 :1/Semminemllhata(ej igytovbbadjaa zadatot 164 :1/acsom6pontnak 165 :Node*HeadNode :, I nscrt( Data*theData) 166 : 167 :myNext=myNext->Inser t(theData) ; 168 :returnthi s ; 169 : 170 : 19. 6ra-171 :IIMindenhatalmatnkaptam,snnemfogokdolgozni 172:classLinkedList 173:( 174 :public: 175:LinkedList(); 176 :_Li nkedList (){deletemyHead;} 177 :voidInsert (Data*theData) ! 178:voidShowAl1{)(myHead->Show{) ; 179:private , 180:HeadNode~myHead; 181,}; 182: 183 :IISzletsemkorltrehozomalista(ejet 184:1/Azmegalkotjaafarkat 185:IIigyazreslistamutatjoafejremutat, 186:IIezpedigafarokra .skzt.knincssellVlli. 187:LinkedList: : LinkedList() 188:( 189:myHead=newHeadNode; 190 :) 191 : 192 :IItruhzs,truhzs ,truhzs 193 :voidLinkedList :: Insert(DatapDaLa) 194:( 195 :myHcad->Insert(pData); 196:) 197 : 198 :IIteszteloproqram 199 :intmain() 200 :( 201 ,Data*pDat.a ; 202,intval; 203 :LinkedList.ll; 204, 205 :IIKrjnkafe1haszn16tlnhnyrtket 206 :1/st egykezeketalistba 207 ,for(;;) 208 :{ 209 :std:: cout-Whatvalue?(Otostop) :- ; 210 :std:: cinval; 211 :if(lva!) 212 ,break; 213 :pDat a=newData(val) ; 214 ,ll . Insert (pData) ; 215 :} 216 : 360 I V.rsz' s tbbalaksg 217 :IIMostj rjukbealisttsmutogass ukmegazada tokat 218 :11 . ShowAl 1() ; 219 :returnO;1/IIhatkr n smcgs zani k 220 :} menet Whotvalue?(o tostop) :5 Whatvalue? (o tos t op) :a Whacvaluc? (otostop) :3 Whotvalue7 (o to !S t op) :9 Whatvalue? (o to s t op) :2 Whatva luc?10tostop):10 Whotvalue? (o tos t op):O 2 J 5 , , 10 EI.s Az els6, ami a szemnkbe tlik, az egy felsorolsos tTpus hrom rtkkel: kIsSmaller, kIsLa.rger, s kisSame(kisebb,nagyobb,egyel/l),A listaminden ob-jektumnak ismemie kella Compar e ()fggvnyl ; ezek .1felwrolsos vfiltoi' .k ennek a fggvnyneka visszatrC!sirtkei. A 27-36.sorban ltrejn az illusztrcis clData osztly, ennek Compare ()metdusa a40-48.sorbankszleLA Da t aosztlynak egyetlen stimC:rtkcvan, amely ssze tudjamagthasonllllni( compare)egy msik Data osztly szml!rtkvel,illetve V'1n egyShow()tagfggvnye is, mellyel kilehet ratnia szmrtke!. A lncoltli stamegrtsnek legegyszenbb mMja,ha vgign&zzkpldnkat,amely azt haszn:lja.A 199.sorb:mkezddika A 201.sorbanegyDat aobjektum"lir-nyul6mutatl hozunk lrre,a203.sorbanpedig egyhelyilncol t listt defjni:1Iunk. A lncoltlistaltrehozsakor a187. sor konstruktoraindulcl.Ezcsak annyillesz,hogy elhelyezamemriban egy HeadNode (lis/aJf!) csom6jJ()//t)ubjektumot,s ennek d mt tadjaannak amyHeadmutat6nak,ami alncolt lista fe jt tartalmazza (180.sor). A HeadNodeelhelyezse meghvjaa158.sorban definiltHeadNodekonstruktort, amelynekfelad 3 ,classString ., : { 5 :public , 6 ,/1Konstruktorok 7 ,String () ; 8 , " 10 : 11 : String{const Stri ng (cons t -St ring() ; char"const) ; St ring... ) ; lz :1/tlterheltoper torok 13 :c har& operatorf ](intof f set) ; 14 :c haroperator[ l(into f fset)const ; 15 :Stringoperator.(constString&) ; 16 :voidoperator.={constString&) ; 17 ,Stri ng&operator;(constString&) ; IB : 19 ,1/Eltal noshoz z f 6rofuggvnyek 20 :i ntGetLen ()const(retur nitsLen; 21 :constc har*GetString ()const{returnitsString ;} 22 :1/stat i ci ntConstr uctorCount ; 23 : 24:pri vate : 25 :String(int) ;IIprivtkons t ruktor 26 :char*i t sStdng ; 27 :intit5Len ; 28 :) ; 29 : 30:IIaza laprtelmezettkonstruktorObjtoskarakterlncothozltre 31 :String " String() 32:( 33 :itsString=newchar[l) ; 34 :i t sSt ring[Oj=' \0 '; 35 :itsLen=O ; 36:IIstd :: cout \tDefaultstringconstructor\n ; 37 :IIConstructorCount++ : 38:} 39 : 40:IIprivt(segd)konstruktor,csakosztlymet6dusok 41 :IIhasznljkmeghatrozottmretujkarakter lncok 42 :IIltrehozsra.Nullaltltve. 43 :String : : SLr ing (intlen) 44 :( 45:itsString=newchar[len+l]; 46:inti; 47:forCi=O;i*pFunc)(J ; 80 ;deleteptr; 81 : 82 :returnO; 83: 20.6ra menet (O)Quit(1) Dog(2)CaL(3}Horse :1 (1)Speak(2)Move :1 Woof! (O)Quit(1)oog(2)Cat(3)Hor sc :2 (1)Speak(2)Move :1 Meow! (O)Quit( 1) Oog(2)Cat(3)!-!orse:3 ( 1 )Speak(2)Movc :2 Galloping (O)Quit(1)Oog(2)Cat(3)Horse :o Az 5-14.sorbana Mammal(emls)absLtr..kt adattpust deklar:lljukkt virtll{llis metdussal;ezeka Speak ()s a Move () . A Mammalalosztlyaia Dog, ;1Cat s aHorse (azaz aklltya, amacska s a16),mindegyik feIOlrj:\ aSpeak () -et s a Move ()-ol. A f6programmegkrdezia felhaszn lt,hogymelyik Jlatfajtt hozzukltre.Ekkor lt-rejn 11mum6ribanazAnimaI-nakmegfelel6s cme bukerltiptr nm-tmbaa 49-63.sorban. Ezutneldnthetia felhasz.nl, hogy melyikmetdlIst szerelnmeghvni.A dnts-nek metdus cmebekerlDogFunctionsIMethod-lj)() ; Valljukbe, ez gy egy kiss ezoterikus, de haaprogramban valamimiau ppen ragf8b",-nyekb61 lltblzatm vanszksg, ez Cf,'Yszerub s 0lvashat6bb teszi akdot. 400I VI.rszKlnlegessgek Krdsek s vlaszok Krdi'!>:Mil1haszll/llnk slatikus vllozkal,ha lehel globlisakails lIasZ/llni? \fIasz: A statikus vltozkha16kre egy osztlyrakorl tozdik, igy csakezen osztly pldnyaibl rhetek el: nyilvnos vltoz6 csetn explicit s teljes osztlynv-meg-adssal, vagy esetleg egy statikus tagfS&",nyenkeresztLAstatikus adatok tpusa az osztlyhoz kl6dik,s aszigortou elrs,illetve :I Z erds tpusoSs{lgmiattbiztons-goslibbanhasznlh:Hk,mint agloblisak. Krds:ANr/"aszt/lnnk slaukus lagfggvnyel-.:cI,lIa lehet glo/:Jlisakalis!taszlll"i? Vlasz:A statiku.slagv:i ll oz6kegy osztly hatkrbe tm1.07;nak,s Csakazadott osz-t(llyobjektum{mkeresztl rl1et6ek el,vagy kifejezett s teljesosz!lynvvel,mi nt pl-dul C1U8sName:: Funct;.ionName ( ). Krds:Mir/nCIIIIcsszf}kmindcll osztlyul/kalaZOIloszt{}'Okbarlaiv,amelyeket hasznlllak? Vlasz:Egyo..o;ztlybarunyilv{mt:'isanapvilgrahozzaamegval6.stsrszleteit sla-7.tjaazegysglx:zrst.A cl:lZ,hogy az osztlyok megvalstsnakarszleteilehe-t6leg maradjanakrcjrvcms osztlyok eI6t1. Gyakorlatok Azelmlt rban megisrnerkedtnk aklnleges osztlyok,f.iggvnyeks mUlatkvi-lgval.Yllaszoljunkmegnhny krdsts vgezznk clnC:hnyfel::tdatot,hogy el-1l1lyLzrdika &'Ykrosztlyba. 448 1VI.rsz Klnlegessgek A hiera rchibana pStored s apwired osztlyok kvetkeznek. A pStored objektu-mokat alemezen troljuk (pldulhanemhasznljuk aprogramot), apWired objektu-mok pedig modemenvagyhlzaton kldjk zenetekknt. Csaknemminden objek-tumollernentnk lemezre, gy rdemes azta gykrhez kzelelhelyezniahiemrchi-ban.Azsszes elkldu objektumot trolnunk kell, de nemminden troltobjekt umOl kldnk el,igyjogosan szrmaztatjuk apWired osztlyt apStored oszllybl. Minden szrmaztatott osztly hozzfr a tudshoz (adat)s funkci onalit-shoz (metdusok),s mindegyik egyedi kpessgekkel azl. kiroly61ag a pWircd larl:.llmazhatpluszmetdusokat,dc ezek amOO(!ffit:sadattvitelrtlesznek felelfisek. Lchc(!';ges,hogy mindenelkldtt objektumot t{irolunk,vagymindentrolt objektu-mOt elkldnk, de akr azis el6fordulhat,hogyafentikijelentsek egyike semteljesl. Hacsak nhny objeklumot trolunk s csaknhny trolt objektumot kolc!Onkel, ak-kor atbbszrs rkl6dssel kelldolgoznunk,V:lgymsmdonkellmegoldanunk aproblmt.Azegyik megolds,hogya WiredosztMyta Storedosztly-bl sz:"irma:a;njuk.s JlrehoZllnkmet6dusokat atrolshoz,melyek nem csinlnak semmit, vagy hibtjeleznek, haaz objektumot rnodemen elkldtk, denem troltuk. Vegyk szre,hogy nhny objektumotnemkellelkldenil nk, ll ycnekpldul afel-hasznli bell tsok.Perszemindenkldtt objektum troland, gy az ennek megfe-lel6 hicruchi l a22. l-es bramutatja. PObjOO pSto'ad pWiradpPreferencespProvlder Info I pMeuage 22.1 bra Al...>c:zdcli hierarchia 22.raObjektum-orientlt elemzsstervezs449 Aprop Fggvnyknyvtrak:Vsroljuk vagy frjuk? Vsroljukvagy rjuk?A tervezsifzisban mindigfelmerla'krds,hogymilyen rutinokat kellmegirnunksmelyekazok,amelyeketmegvsrolhatunk.Elkpzelhe- mrkereskedelmi fggvnyknyvtrthasznlni, mely megoldstnyjtnhnyvagy akr azsszeskommunikcival kapcsolatoskrds re.A dntsnlperszea licencdjakat segyb,nem technikaijellegkrdseketis figyelembekellvenni. Gyakranilyenfggvnyknyvtrakat vsrol ni,sa tnylegesproblmra koncentrlni,fgynemkelljrafeltallnunka kereket.Akkorisrdemeselgondol-kodni a vsrlson,hanemkifejezettenC++-hoz szntka a fggvny-knyvtrat,deazalapfunkciihasznlhatak.Ez szerepetjtszhat abban, hogytudjuktartani Interfszek tervezse Fontos,hogya tervezs ezen szakaszban ne nyugtalankodjunk azimpk:ment,d6 mi-ali.Mindenenergi:'nk:lt az osztlyok kzti letisztult imerf!E!sLekrnegtervezsrc kell koncentr.'ilnunk, majdpedig felkellvzoJnunk, hogy azosztlyonbellmilyenadatok-1".1s metdusokrnlesz szksg. Gyakr::\nhasznos,h:lteljesmrtkbenmegrtjkaLalaposztlyokat,miel6tt a s7...rrnaz-tatottosztlyokkalfoglalkoznnk,tehtapObject-re, apStored-re s a pWired-refogunkkonccmrlni. A pObject - I Igykrosztly - csupn olyan adatokkals metdusokkalrendelkezhet, melyek kzsek.Mondjukminden objekmm rendelkezhetne egyediazonostszm-mal.Ltrehozhatnnk egy pID cpostMaster ID)vltOZI a pObject adatwgjaknt, de tegyiik fel a krdst magunknak:Szksges-e ilyenazonost6s7..molyan objek-wmhoz, amelyet nem trolunk, ts nem iskldnk el?Ezperszefelvetiakr-dst is:Van-eolyanobjektum, melyet nemt:irolunk, de rsze ennek a hieF.lrchinak? Hanincs ilycnobjektum, rdemesmrlegelniapObject sa pStored osztlyok sszcvonst,azonbanhaminden objektum trol t objektum, akkor mialapjntesznk klnbsget?Eztvgiggondolvaafra akvetkeztetsre jutunk,hogy nhny objektum, mim pldtlul a cm objektumok, amelyet nmagbannem trolunk,jogosan szrmaz-tathatnnkapObject-b6I, hiszenha troljuk,akkor azt csakis egy msik objektumr-szeknttnnnc. Jelenleg tehl egykln pObject osztly mgiscsakhasznos lenne.Kpzeljnk el egy mlistt,amely pAddress objekmmok lenne s noha nmagban pAddress objektumot sose trolnnk,mgisrendelkezhemnek ezek az objektumok egyedi azonostsz:mokkal , amihasznos. 450 IVI. rsz Klnlegessgek Prbakpp rendeljkhozz a pID--t a pObject oSlllyhoz, amely !,'Ynz kiminimlisan: classpOjbect ( public : pObject () ; -pobject (); pIDGetID{) const; voidSatID() ; pr-lvate: pIDltsID; Szmos dolgot megfigyelhetOnk ebben az osztlydekl ar.:'ici6ban.Elszr is,nosztly nem szrmaztatott osztly, ez tigykroszlly.Msodszor: senuni jele azirnplementci-nak,mg aGetID ( ) -t sem implementltuk, amely mindenbizonnyal egy helybenki-rejlett (inline) met6dus lenne. Harm:ldszor:felfigyelhetnk a constmetdusnl, mely azinterfsz rsze,nemazimp-lementt vezet akatasztr6fhoz, hagy prbljukmeg ltrehozniaz sszesg -tlyt s kiegszteni az interfszeket,hogy mg egy sorkdot semnunk. __________________________________Szmos igen j ok van arra,hogy mirt rdemes atervet egy prototpuson kiprblni -amely egy kevss elegns, deplda az alap deteinkre. Szmos tpusavan aprolOtpusnak,melyek ntindms s ms ignyeket elgtenek ki. A felhaszn(116iinterfszprototpuslehet6v teszi avgfelhasznl6kmlkszntfellet tesztelst A funkcionlisprototpus nemfoglalkozika felhasznlifelillettcl,viszont kiprblhat-akolyankpessgek, mimpfldullevelek tovbbtsa vagy csatolt llomnyok kezelse. Vglpedig afelptsselkapcso];uos prototpus megadja alebet6o,;get egykisebb progr..1111fejlesztsre, valamintannakmegbecslsf:re,vajon a tervezs tkrbenk-s6bb hogyansklzhat aprogram. Rendkvl fontos,hogy vgig vilgos,lkmaradjan:lk aprototpus cljai.Dntsk el, hogya felhaszn lifelletetvizsgljlIk, afunkcionalitssShowl); 116 :IIdelegls 117 :private : US :TrnyObject ;IIMagaazobjektum 119 :Node*myNext ;IIalistakOvet kez6t ro16el emremuta t 120 :) ; 121 : 122 :IIAkonstruktorcsakinicializl 123 :tcrnplate 124 :InternaINode:: InternalNode IT*theObject,Node*next) : 125 :rnyObjectlthebject),myNext(next) 126:( 127 :) 128 : 129 :IIAlsitavelej e 130 :IIAmikoral i s t bajobjektumottesznk, 131 :IItadjukatro16elemnek,amelyki tal lja 1 470 11n,rszKiilnlegessg.k 132 :/1ahelyt.sbeszrj aalistba. 133 :templat c 134 :Node~InternalNode : : Insert(T*theObject) 135 : 136 :/1Azjszerzetkisebbvagynagyobbnlam? 137:i ntrcsult=myOhject->Colnpare(*thcObject) ; 138 : 139 :switch(result) 140 :{ 141 :1/11.tradiciszerint,haegyen16ekvagyunk,vazels6bbsg. 142 :casekisSame :/ I{gyezazgtvezetarraazesetre, ..amikornagyobbnlam 143:casekisLarger:1/Azjobjektumelmkerl 144 :( 145:IntcrnalNodeObjectNode= 146 :newInternalNode(thcObject ,t his): 147 :returnObjcct Nodc l 1.48 : 149 :IINagyobbnlam,tehtadjuktakOvetkez6tro16elcmnck 150 : 151 :casekisSmaller : 152 :myNext=rnyNext->Insert(thOObjcct) ; 153 :returnthis; 154: 155,returnthis; 156, 157: 158 ,IIATailtrolelerncsak r s z e mszC!repetjtszik 159 ,template 160:classTai1Node:publicNode 161 :( 162 :public : 163:TailNoda(){} 164 :virtuel-TailNode(){} 165 ,virtualNodeInsert (T..theObject) ; 166 :virtualvoidShow(){} 167 :private: 168 :}: 169 : 170 :IIHaazObjecttpusobjektumhozzmkerl,mindenkppenelm 171:/1leszbeszrva,hiszennvagyokazr6elem, ..akiIllOgOt tmrsemmisincs. 172 :templat e 173 :NodeTailNode :,Insert(T..LheObject} 174 : 175 :Interna1NodeObjectNode= 176 :newInternalNode(theObject,this); 177:returnObjectNode; 178 : 179 : 180 ,IIAkezddtro16elembennincsobjektum, 181 :1/csupnalista1egels6el emremutat 182 :templat e 183 :classHeadNode:publ icNode 184 : 185 :public: 186 :HeadNode(); 187 :virtual{deletemyNext;} 188 ,virtualNode*Insert(T*theObject) ; 189 :virtualvoidShow{)() 190 :private: 191 :NodemyNcxt; 192 :} ; 193 : 194 ,//Mihely16trejntikezd6elem, 195://aznyombanmagamgteszizr6elemctis 196:template 197 ,HeadNode:: HeadNodc() 198:{ 199:!lIyN!:lxt:newTailNode; 200 : 201 , 202 :/1Akezd6elemel6ttnincssemmi,:gyazobjektumot 203 :IIrgtntovbbadhatjukakvet kez6tro16el emnek . 204 ,template 205 :Node*HeadNode :: Insert (TtheObject) 206 :( 207 ,myNext:myNext - >Insert(theObject) ; 208 :returnthis; 209 , 210: 211 :IIMindenmunktdeleglok,deenymadics6sg 212 :template 213 :classLinkedList 214 ,{ 215 :public : 216 ,LinkedList(); 217 :-LinkedList(){deietemyHead ;} 218 :voidInsert(TtheObject) ; 219 ,voidShowl\l1()(myHead->Show() ; 220 :private : 221 :HeadNode*myHead ; 222 :} ; 223 , 23.raSablonok471 224 :IISzletsemkorltrehozomakezd6eleme t .amelymagamg 225 :IIhe lyeziazr6elemet . 226 ,IIAzreslistatehtegykezd6elcmb6lll .amelyetazonnala 227 :/1zr6elemkvet ,kztkpedignincssemmi . 228 :template 229 :LinkedList::LinkcdList() 230 :( 231 :myHead=newHeadNode ; 232 : 233 : 234 :1/oeleglj ,deleglj,deleglj 235 :template 236 :voidLinkedList :, Insert(T*pObject) 237 :{ 472 1 VI.rszKilI6nl'llossgek 238 :myHead->Insert(pObject ) ; 239 : 240: 241 :1/Tesztprogram 242:intmain () 243: 244:pCat; 245 :Data*pData; 246:intval ; 247 :Li nkedListListOfCats ; 248 :LinkedList ListOfOata: 249: 250:1/afelhaszn16t61 prrtket 251:1/selhelye2:zkazokatIIli stban 252 :for(;;) 253 :{ 254 :std:: cout"Adjmeg'egyrtket(Ovge):"; 255 :std:: cinval; 256 :if(ival) 257 :break: 258:pestncwCat(val); 259:pOata:newData (val) ; 260:ListOfCats.lnsert(pCat); 261:ListOfOata.lnsert(pData): 262: 263 : 264 :IIvgigmegyOnkalistnskirjukazel emekrtkt . 265:std: : cout' \n ' ; 266:ListOfCats.ShowAll(); 267:std: :cout"\n", 268:ListOfData.ShowAll(); 269 :std :: cout"\n****,,***." \n\n"; 270:returnO;IIAlistkkikerlnekahatkOrb61 ,smegsemmislnek. 271: Adjmeq """ rtket(ovge) :5 Adjmegegy'rtket(ovge) :13 Adjmegegyrtket{ovge}:2 Adjmegegyrtket{ovge}:9 Adjmegegyrtket(ovge):7 Adjmegegyrtket(ovge) :O E, amacsk.!!2ves "' amacska5ves E, amacska7ves "' amacska9ves E, amacska13ves Dataobjektumtrlse,melynek rt ke:13 Datoobjektumt r lse,melynek rtke :9 Dataobjektumtrlse,melynekrtke:7 Dataobjektumtrlse,mel ynekrtke:5 Dataobjektumtrl se,melynekrtke :2 13vesmacskat rlse 9vesmacskat Or lse 7vesmacskatrlse 5vesmacskat dse 3vesmacskatOrlse 23. raSablonok 1473 vegyk szre, mennyirehasonlta23.1Li staa19. rnbemutatOllhoz. A legnagyobb vltozs,hogy minden osztly- smetdusdcklarci6 el6tt akvetkez6 preAx ll: Lempl atec 1ass Ebb61 ludjaIIfordt,hogy olyan tpussalparnmtereztk alistl, amelyet c&1.kapld-nyostspillan:nhanfogunkmegmondani.A lrol6elem Nodeosztlynak deklarcija most pldulh'Ynzki: template classNode Eszerint:1 Nodeosztly nmagbrtnnemltezik,de pldnyostanifogjuk aCats s aData oszlll yaL A paramlCrczeshezhasznlt tpust T jelli. Hasonlail,azInternalNode helyettmostInternalNodell(T tpusInter-nalNode- ja).Tovbb,InternalNodenem egy Data objeklumra es egy msik Node-ramutat, h.mem egy T tpusobjektumra s egy Nodeobjektumm.Ezlmat a118. s a119.sorban. Nezzkmeg alaposabbana 133-156.sorban definiltInsert mel6duSl.A logika ugyanaz, deaholkorbban konkrt tpust (Data) hasznlrunk,Oltmost T szerepel.Te-ht,a134.sorban aparamter mulat egy T tpus objekrumra. apldnyos-t{\skor,afordtT helyrebehelyettestiIImegfelel6 tpust (Data s Cats). A lnyeg,hogy azInternal Nodeazadattpust fggetlenlelvgziafeladatt.Tudja, hogyanhasonllSa ssze az objektumokat.Egyltalnnem rdekli, hogy aCats objek-tumokpontosan gy hasonltjk ssze egymst, mint aData objekrumok. Valjban, a Cats osztlyt jrarhatjuk gy, hogy akortnemtrolja, hanem aszletsi id6bl szksg szerint kiszmt ja.AzInternalNode-l ez egy cseppet sem rdekli. 474 1VI. rszSablontpushasznlata A sablontpus gy hasznlh:tt6,ahogy a tbbi tpus.tadhat fggvnynekparamter-de lehet rtkis, mindkt esetben nkkel vagy referencivaLEzt mutatjabe a23.2Lista.Hasonltsuk ssze a23.1Li stval! 23.21J1111- Pa_1Isto ......... (16aCOIt- __6YoI1 f--. l 1 :II23 . 1plda 2 :II 3 :/1Paramtere2cttlistabemutatsa 4 :/I 5 :II 6 :II 7,/I 8 ,/ I 9:IIParamterezcttlistaobjektum-orientltmegva16s1tsa. 10,IIAListazabsztraktNodetro16elemnekdelcgljaamunkt. 11:IIHromf61ctro16elemethasznlunk:kczd6t.zr6ts 12,IIkOzba!s6t.Csakezutbbibantrolunkhasznosobjektumot. 13 :/1 14 :II 15 :IIADataosztlytazrthozzukltre,hogypldnyait 16 :IIalistbantroljuk. 17 :II 18 :II**** ************** ********* **.**** ****** -****** 19 : 20 :'inc1ude 21 : 22 ;enum{kIsSma1ler.kIsLarger ,kIsSame} ; 23 : 24 :IIAlistbantrolhatDataosztly 25 :IIMindenolyanosztlynak,melyetebbenalistbanszeretnnk ..trolni ,rendel kezni ekellakOvetkez6ktmetdussal , 26 :IIShow :Kirjaazobjektumrtkt. 27 :IICompare:OsszehasonHtjaktobjektumrtkt,smeghatrozza _arelatvpozicit . 28 :classData 29 : 30 ,public : 31 ,Data{intval),myValue{val){) 32 :-Data () 33 :( 34:std:: cout'DataobjektumtOrlse,melynekrtke:'; 35 :std: : coutmyVa 1ue'\n' ; 36 : 37 :intCompare(constDat a&) ; 38 ,voidShow()(std:: coutmyValuestd :: endl ;) 23.ra Sablonok 1475 - --- - - - - ---------=-=---==""'-''----------' .. 39 :prlvate: 40 :intrnyValue ; 41 :J ; 42 : 43 :IIAComparemet dustarrahasz n ljuk,hogyegyadottobjektum 44 :IIlistbanel f ogl al thelytmeg l l apitsuk . 45 :i ntDa t a : : Compare (constData&t he OtherObj ect ) 46 :{ 47 :if(myVa l uetheOtherObject . myValue) 50 :retur nkIsLarger ; 51 :else 52 :returnkIsSame; 53 :l 54 : 55 :1/Egymsikosztl y ,ami Lszint nalistbankvnunktrolni 56 :IIEbbenllncol tlisLbani sakorbbanemltettk tmet6dusra 57 :IIl esz58 :/1Show:Kirjaazobjektumrtkt . 59 :/1Compare :sszeha sonltjaktobjektumrtkt, ...srelatvpozicitadvissza . 60 : 61 :classCat 62 :( 63:public : 64 :Cat(intage) ,myAge(ag-e){} 65 :-Cat() 66 :( 67: 68 , std:: cout!nyl\ge'vesmacs kat Orlse\n" : 69 ,intCompar e(constCat&.) : 70 ,voidShow() 71 , 72 , 73 , 74 ,} 75 :private : std : : cout" E'ZIImacska . std : : coutmyAgeves\n" ; 76 :intmyl\ge ; 77 :} ; 78 : 79 : 80 :IIACompa r emet 6dustarraha!:\z n l juk,hogyegyadot tobj ektum 81 :IIlistbane lfogla l thelytmcg11api tsuk . 82 :intCat :: Compare(constCa t&theOther Ca t) 83 :{ 84 :if(myAgetheOtherCat.myAge ) 87 :r e t u r nki sLarger ; 88 :else 89 :returnkissame : 90 :} 91 :

476 1VI.rszKlnlegessgek 92 : 93 :IIAlistatrol60bjektumnakabsztraktadattipusa 94 :/IMindenszrmaztatotttipusnakfelalkelldefinilnia .. a zInsertsShowmetdusokat 95 :template 96 :classNode 97 : 98 :public : 99 :Node(){} 100 :virtual-Node () {} 101 :virtualNode*Insert{TtheObjectl"'O; 102 :virtualvoidShow()'"O, 103:private : 104 :) , 105 : 106:template 107:classInt crnalNode :publicNodo 108 : 109 :public : 110:InternalNode( T*theObj ect,Nodo*next) ; 111:virtual-I nternalNode ()(deleteIllyNext ;deletemyObject :l 112 :virtualNode*I nser t (T*theObjectl ; 113 :virtualvoi dShow ()I Idelegls 114 :( 115 :myObject->Show() ,myNext->Show() : 116 : 117 :private : 118 : 119 : 120:) ; 121 : T*myObject ;IIMagaazobjektum Node*myNext :IIalistakOvetkez6t6ro16clcmrcmutat 122:IIAkonstruktorcsakinicializl 123 :template 124 :InternalNode :: InternalNode (T*theObject,Node*next) : 125:myObjcct(theobject) .myNex t(next) 126 :{ 127 :} 128 : 129:IIAlistaveleje 130 :IIAmikoralistbajobjektumottesznk , 131 :IItadj ukatro16elemnek ,amelykitallja 132 :IIahelyt .sbeszr jaal iRt ba . 133 :template 134 :Node*I nternalNode :: Insert (T~theObject ) 135 :( 136 :IIAzjszerzetkisebbvagynagyobbnlam? 137 :introsul t'"myObject - >Compare( *theObject) ; 138 : 139 :switch{rcsu1t l 140 :{ 141 :IIAtradiciszerint,haegyen16ekvagyunk ,6vazels6bbsg. 142 :caseItlsSame :IIezazgtve zetarraa zesetre, .. amikornagyobbnlam 23.ra Sablonok 1477 143 :casekIsLarger :/1Azjobj ek tume lmkerul 144 :( InternalNode*ObjectNode:145 : 146 :newInternalNode(thebj ect,this) ; 147 :returnObjectNode; 148 : 149 :/1Nagyobbnlam.tehtadjuktakvetkez6tro16elemnek 150 : 151 :casekIsSmal1er: 152 : 153 : 154 : myNext=myNext->Insert( t hebject) ; rcturnthis ; 155 :rcturnthic ; 156 : 157 : 158 , 159 :/1ATailtrol el emcsakrszemszerepetjtszik 160 :temp] ate 161:classTuilNode:publicNode 162 :( 163 :publ ic : 164 :TailNode() (l 165 :vir t ual(j 166 :virtualNode.:T>*Insert(T*theobject) ; 167 :virtualvoidShow { ){} 168 :privata : 169 :); 170: 171 :IIHaazObjecttipu!'Iobjektumhozzmkerl,mindenkpptmelm 172:IIleszbeszrva,hiszennvagyokazr6e1em,akimOgOtt ..m6.rsemmisincs , 17] :temp1ate 174 ,NodeTai1Node :: Insert(TthCObject) 175 :( 176 :Interna1NodeObjectNode 177 :newInterna 1Node(thCObject,this) ; 178 :returnObjeCtNOde ; 179 : 180 : 181 :IIAkezd6tro16e1embenn incsobj ekt um, 182 :IIcsupnal i s t alege1s6e l em remut a t 183 :t emplate 184 :c l assHeadNode:pub l icNode 185 : 186 :public : 167 :HeadNode{) ; 168 :virtual-HeadNode(){d e letemyNext;} 169 :virtualNode..I nsert {T*t hebject) ; 190 :virtualvoidShow()(myNext- >Show() ;} 191 :private: 192 :Node*myNext ; 193 :}; 194 , 478 I VI.rszKlIlnl.g.ssg.k 195 :1/Mihelytltrejnilkezd6elelll,aznyomban 196 :1/magamgteszizr6elemetis 197 :template 198 :HeadNode : : HeadNode (J 199:( 200 :myNext'"newTailNode; 201 : 202 : 203 :IIAkezd6eleme16ttnincssemmi,igyazobjektumotrOgtOn 204 :IItovbbadhatjukatro16clemnek. 205 :template 206 :NodeHeadNode :: Insert(T"theObject) 207 ,{ 208 :myNcxt.,myNcxt->Inscrt (thcObject) ; 209 :returnthis ; 210 : 211 : 212 :IIMindenmunktdeleglok,deenyma213 :template 214 :elauGLinkedLi ot 215 : 216 :public : 217 :LinkedList() ; 218 :(deletemyHead;) 219 :voidInsert (T"theObject) ; 220:voidShowAll()(myHead->Show() ; 221 :private: 222 :HeadNodemyHead; 223 :) ; 224 : 225:IISzOletsemkorltrehozomakezd6elemet,magamOg 226:IIhelyeziazr6elemt. 227:IIAzOreslistatehtegykezd6elemb6lll .azonnala 228 :IIzrelemkOvet.kOztOkpedignincssemmi. 229: 230 :LinkedList :: LinkedList() 231 :( 232 :myHead=:newHeadNode ; 233 : 234 : 235 :/1Oalogl j .deleglj ,delegl j 236 :tcmplatc 237 :voidLinkedList : : Insert( T*pObject) 238 :( 239 :myHoad->Insert(pObject) ; 240: 241 : 242 :voidrnyFunction(LinkedList&ListOfCats); 243 :voidmyOtherFunction (LinkedList&ListOfData); 244 : 245 :IITesztprogram 246:intmain{) 247 : 248 :LinkedListListOf Cats ; 23.raSablonok479 249 : ListOfData ; 250 : 251 :myFunction(Lis t OfCats): 252 :myOtherFunction(ListOfData); 253: 254 :IIVgignzzOkalistt,skirjukazelemekrtkt. 255:std:: cout"\n" ; 256 :ListOfCats . ShowAll(); 257 :std : :cout"\n" ; 256 :!>lsLOfData . ShowAll (): 259 :std::cout"\ n.. *.\n\n"; 260 :returnO;I IAlistk kikerOlnekahat6kOrb6l,s megsel1lllislnek. 261 : 262 : 263 :voidmyFunction(LinkedList&ListOfCats) 264 : 265 :CatpCa t; 266 :intval; 267 : 268:1/Afelhasznl6adjonmegnhnyrtket, 269 :IIamitIIlistbatesznk 270:forl;:) 271:{ 272 :std : :cout" \nHnyvesamacskd?(Ovge): 273 :std: : cinval; 274 :if(Ivel) 275 :break: 276 :pCnt..newCat(val); 211 :ListOfCats . lnsert{pCat); 218 : 219: 280: 281: 282 :voidmyOtherFunction (LinkedT"ist&ListOfData) 283 :{ 28-t :Data..pData ; 285:intval; 286: 287:I IAfelhasznl6adjonmegnhnyrtket, 288:/1amitIIlistbatesznk 289:f or( :; ) 290 :{ 291 : 292 : 293: 294: 295 : 296: 297 : 298 : 299 : std : : cout'Adjmegegyrtket(Ovge) :' . std:: cinval; if(!val) break ; pData=newData{val); ListOfData . lnscrt(pData); 480 IVI.,sz' Hnyvesamacskd? (ovge):12 Hnyvesamacskd?(ov ge):2 Hnyves , macskd?(ovge):14 Hnyvesamacskd?(ovge):6 Hnyvesamacskd?(ovge):O Adjmegegyrtket(ovge):3 Adjmegegyrtkat(ovge): 9 Adjmegegyrtket10 vge):1 Adjmegegyrtket(ovge): 5 Adjmegegyrtket(ovge):O E, amacska2vec E, amacska6ves Ez , macska12ves E, amacska14ves Da\.aobjekt..umLOrlse ,melynekrtke :9 Dat aobjektumtrlse,melynek r tke :5 DataobjektumtOrlsc ,melynekrtke :3 Dl;ltuobjektumtOrlse ,melynekrtke :1 14vesmacskatOrlse 12vel:!macskatOrlse 6vesmacIJkatOrlse 2vesmacsk",tOrlsc Ez apldamajdnemugyanaz, mint az e16z6, azt leszmtva, hogyaLinkedList ob-jeknunokat refcrendvaladjuk t azazokal feldolgozfggvnyeknek.Ezrendkvl fontos tulajdonsg. Miut:nalistkat pld,nyostotluk, teljesen definilttpusobjckru-mokkntkezelhet6k:fggvnyparamtereknt s visszmrsi6nkeknt. A szabvnyossablon knyvtr A szabvnyos sablonknyvtn (Standard TemplateLibrary - STL)a C++ szabvny defi-nilja.Mindenfordt, azt llljk, hogy szabvnyos,tartalmazza az STL-l . Az STL sablonnalmegvalslott trol60sztlyok,pldultmbk,lisUk,sarok,vermek stb,tovbb szmos kzs algoritmus,pldulrcndez(:s,keress stb.gytijtemnye. AzSTL cljaaz, hogy ezeknl a gyakran feladatoknlne kelljen jrafeltall-nunk a spanyolviaszt.AzSTI.-t tesztelik s javtjk, j ateljestmnye, s nem utolssor-ban ingyenes! Ennlisfontosabb,hogy az STI jrahasznosthat.Mihelytmegtanulluk s megrtettk ahasznlatt, minden programunkban alkalmazhatjuk,ahelyett, hogy jras jramagunkmegirnnk. 23.6ra Sablonol1481 Mindig emlkezznkr,hogy a termelkenysg s a karbantarthatsgkulcsa az jrahasznosts! Krdsek svlaszok Kerds:Mi11hasznljunk sablonl,amikor makrval ismego/dhatunk egyjeladatot? Vlasz:A sablon!"...tpuscllcn6r..:svonatkozik, s integrlt rszt kpezi anyelvnek. Krds: Mi tia paramterezltetjggwllysablolls aszokvtillyosjligsvny panl1nterei kztt? Vlasz:Szokvnyos fggvny (nem fggvnysablon)megadott tpusparamte-rekenvgez /Jniveleteket, A fggvnysablonellenbenazl islehet6vleszi, hogyapa-mmtereket paramterezhessk. Krds:M/I...'Orhasz nljunk sablol/t, smikorVlasz:Hasznljunk s.1.blontakkor,haa halmaza azonos, csak az oszclly ms-mstpusm al kal ma zz.1.azokaLHaazon k:-tpjukm:lgunkat, hogy kclotm:'isolunk, s csak egy-kttag tpus.1t v:.\ ltoztatjuk meg,idejeelgondolkodnunk a s.1.blon haszn:'i. lat1n. Gyakorlatok A sablonok megismerse utnpr6bljuk megv:.\laszolni, ill etve megoldaniaz albbi krdseket sfeladatokat,hogy a trgyban szerzett ismeretekmegszilrdulj:mak. Kvrz 1.Honnan tudjaa fordt,hogy nem swkvnyOl:i osztlyt,hanem sablont definilunk? 2.A 22.1pldban szerepl6 lncoltlista-sablonhonnantudja,hogy az j elemeket milyen sorrendben kelJbeszrnia? 3.Hogyancl eklarlunkegy osztlysablonblobjektumot, shogyanjelezzk,mi -lyenosztlyt kellehhez hasznlnia? 4.Honnan tudjaa fordt,mikor kellmegsemmistenie a listbantrolt objekmmokat? 482 1 VI.rsz'K11lnl'g,ssg,k Feladatok 1.HasonlL'iukssze a21.1(parmlist . cpp) s 19. 1 (linkedlist . cpp) Hstkat! szre fogjukvenni, hogy milyenahasonlsg. 2. a fordtnkdokumentci6jban, hogy a szabvnyos sablonknyvtr mely osztlyai vannakmebJ\la16stva!Borland fordt esetben,hasznljaasg6t (Help)af6menben, majd vlasszontmakrt (HelpTopics)s vgl abalol-daliablakbanhivatkozst ( Reference)! 3.Hasonlt.'>assze II22.1pldalncolt listjnak sablonjtafordtdokument-ci6j{lban list STL-oszlllya\1Keressemcg ahasonlsgokat s ak-lnbsgeket! Vlaszoka kvfzkrdsekre l.A fordtatemplateprefIxmiatt tudja, hogy sablont defil1i{llunk. 2.A krdses objektumok Compare ()metdlls:'\n:lk hvsa:1137.sorban A fggvny rtelemmel megtltse aprogramozk, naz amifeladatunk (vc-gykszemgyre a44. s a81.sorban kezd6d6 filggvnyeke.Haegykutykat rcprczentl'ilosztlytisszeretnnk :Ilistbantrolni, ahhoz ismeg kellener-nunkaz sszehasonlt fggvnyt. 3.Nzzkmeg a22.1LiSla247.s 248. sorM A recept akvetkez(}:oablonnv sablonobjektumnv. 4.Amikor amain fggvny visszatr, alncoltli staelhagyjaal1at6krt':t,gy :IZosztly destruktor.!lesz vgrehajlv.l.Minthogy atrolt elemeket alistadina-mikusanhoztaltre, atrlskisali stafeladata.Eztot23:1 Lista110.soriiban lthatjuk. 24.RA Kivtelek,hibakezels snhny tancs Ebbenazrbana sz: Mik azok 1:1 kivtelek Hogyanhasznljuk akivteleket, s hasznlatukmilyenkrdseket vel fel Hogyanhibtlan kdot Merretovbb Programhibk.tvesztsek.kdrnegromls Knyvnk pldaprogramjaiilluszlrcis cllalszlettek.Szndkosan kerl tkahiba-forrsoktaglalst , hogy ne vonja elfigyelmnkeraz ppen trgyalt tmktLAzles programoknak azonban figyelnikkellahibalehet6sgekrcj avaldi veU programkdoklegnagyobb rszt ahibkra val felkszlss ahibakezels tesziki. 484 1VI. rszKlnlegessgek Aztmondjk,hogy haavrosok isgy plnnek, mint a szoftverek, akkor azar-r.:!.jr harkly romba dmen acivilizcil.Mindenesetre tny,hogy szinte minden kereskedelmi program,kztkalegnagyobb gyrtk termkeiistartalmaznakhibkat. Komolyprogramhibkat. Attlmg,hogy ezt tudjuk,ez nincs gy rendben.Brkinek,akikomolyanprogramo-zsraadjaafejt, fontossggalafntkelltrekednie,ho&'Yrobusztus,hib;1 nlkliprogramokat rjon.lltom,hogya szoftveri par legnagyobb s kiemelked6 problmjt ahibs,inswbilk6dok jelentik.Azmindenesetre tny,hogya program megrsnaklegklcsgesebb rs7.eatesztels,hibakeress s ahibkkijavtsa. Szmos olyan aprhibavan,ami gondot okozhat egy progr.lIn futsakor.Az arossz logika:aprogram azt csinlja,amit aprogr.HTloz6szeretne; csakhogy (5nem gondoltavgig dg alaposan IImcgval6stotlalgoritmust.A msodik IIszintaktika: rosszkifejezsm6dot, fggvnyt vagy struktrt hasznltunk.Ezakt leggYllkoribb, s alegtbb programoz ezektrekszik.Sokkalmvaszabbak azok :1hibk, medyekcsak akkor tkznek ki,amikor afelhasznlvalamivratlan dolgot mvel. Ezek apiciny, logikaitapos6aknk csendesen s zavartabnulmeglapulhatnak.Amikor mr gymindenrendben van, egyszer csakhirtelen - BUMM!- valakirossz helyre lp, s progr.uTlunk megfeneklik. A kutatsok s a gyakorlatitapasztalat egyarntazt mutatj k, hogya fejlesztsminl ks6bbi stdiumbankerlel6 egy hiba,annl drgbb akijavtsa.A lego1csbbak azok aprobl mk s hibk,amelyeket sikerl mg aprogmm megrsakor elkerlni. Csak alig drgbbak azok,melyeketafordt6programkidob.A C++szabvny afrat rekszik,hogy .1fordt6progmmokb61alehet6legtbbhibajelcntst s fi gyelmeztetst kiprselje (mg fordtsiA IcfordlOuprogramoknakazok ahibi sokkalolcsbbak,amelyekrgtn azfut-tatskor kideriiinek (amelyekmindig sszeomlst okoznak),mim amelyek csaknag)' ritkn okoznak problmt. A logikai s szintaktikaihibknlnagyobb gondot jelentenek azesetleges hibk;ami-kor pldul aprogramunkremeklmkdik,haszmol ad meg afelhasznl 6,dc sszeomlik,ha r be,Msprogmrnokakkor fagynakle,hakevsnek bizonyul amem6ria,vagy hakint felejtettilkahajlkonyJemezl, esetleg ha amodem ppen bontjaa vonalaI. A programozk az effajtatrkenysg ellen gy kzdenek,hogy prbljkprogramju-kat tenni.Goly1l6azaprogmm, amely mindenfutsidben elkpzel-het6 esetre felvanksztve,kezdve abizarr felhasznli egszen amem-riahinyig. Ezafajtaprogramozs hasonlt a"defenzv amely abblll, hogy nem bzunkamsik (esetnkben felhasznl6vagy rendszer)udvari assg:i-___ _ __________"'24"-"",6ra,,-0 -"Kiv.....'."""I.... ...s .., s"n..,h..,...nyL'...an...' ...csCJI,,48"'s '--__--""" ban, hanem azt felttelezzk,hogy brmilyen meglep esemny ismegtnnhet. Haazonban elrell6ak vagyunks felkszlnk az effajtadolgokra,akkor az sszetkzs. Fontos klnbsget tenni, aprogrdmhibkkzn.Vannak ol}"dnok, amelyek abbl addnak,hogy aprogramoz szintaktikai hibt vtelt.Vannak logikai hibk, amelyek onnan erednek, hogy aprogramoz flrertette afeladatot vagy amegolds mdjt.V-gl vannak olyan kivtelek,melyek szokatlan (m nemmegjsolhatatlan) esemnyek miatt lpnek fl,mintpldulaz (memria vagymerevlemezhc\y)hinya. Vratlanesemnyekkezelse A programozk hatkony fordt6progr.lmokat haszn:l nak, s biztostkokkal rakjkteleakdot, amelyIcbct6v teszi aprogramozsi hibkfelfedezst.jras jra uekintik atervet,6skimcrt6 tesztelst folytaUlak,hogy megtalljlikalogikaihibkat A kivtelekazonb:mmsjelleguek.A kivteleskrlmnyeket nem lehet teljesenkik-szblni,csakfelk(!szlnilehet clJuk,Felhasznlink szmtgpein id6nknt belelik amemria;ilyer,kor az il krdi!s,hogymit csinljon aprogram.Azalbbilehet6sgek kzllehet vJaszt:mi: Hagyjuk sszeomlani aprogramot Jelezzk ahelyzetet il relhasznlnak, s elegnsanlpnkki Jelezzk ahelyzetet arelhasznlnak, stesszk s7Jlmra,hogy megk-srclje ahelyrelltsI Safolytatst A progrnmmagajavtjaaproblmI, s tovbb futafelhasznlmegzavarsa nlkl Nemmuszj,S61nemiskvnatos,hogy mindenprogramunk automatikusan (!5csend-ben magaksz\)ljnkimindenvratlan helyzetet,az azonba nnyilvnval,hogy tbbet kelltennnk,mint hogyhagyjuk csak(Igysszeomlani aprogramot. A CH kivtelkezels tpusbiztos s szervesen mdszertbiztost arra,hogy megbi rkzzunkaprogramfutsakzben ritka,de megjsolhat esemnyekkel. Kivtelek A C++nyelvbenakivtel egy olyan objektum,amely akd egyikrszr61amsikra addik l:ahibtkivltreszr61 alubtrszre.Amikor bekvetkezik akivteles esemny,akkor aztmondjuk, hogy aprogram .tovbbdobon egy kivteltH;akivtel kezelst pedig .a kivtel elkapsnakH mondjuk. 486 1VI.rszKlnlegessgek A kivteltpusa dnti el,hogymelyik kdrszlet fogjakezelni aproblmt;atovbb-dobott objektum tartalma (havan),visszajelzst nyjthat a fdh