Vous êtes sur la page 1sur 706

http://www.free-livres.

com/

Sauf mention contraire, le contenu de cet ouvrage est publi sous la licence : Creative Commons BY-NC-SA 2.0 La copie de cet ouvrage est autorise sous rserve du respect des conditions de la licence Texte complet de la licence disponible sur :

http://creativecommons.org/licenses/by-nc-sa/2.0/fr/

Simple IT 2011 - ISBN : 978-2-9535278-5-8

Avant-propos

e tous les lngges de progrmmtion qui existentD le gCC est ertinement elui qui nourrit le plus de fntsmesF istEe pre que 9est un des lngges les plus utiliss u monde c yu pre que 9est un des lngges les plus puissnts et les plus rpides c oujours estEil que 9est le lngge de prdiletion de euoup de dveloppeurs X il est devenu qusiEinontournle dns l rtion de jeux vidoF yn l9enseigne d9illeurs dns l pluprt des oles d9informtiqueF elors vous y voil vous ussi c ous voulez tout svoir sur le gCC mis vous n9vez jmis progrmm c gel peut semler di0ile u premier ord tnt donn le nomre d9ouvrgesD ertes intressnts mis omplexesD qui existent sur le sujetF sl fut dire que le gCC est un lngge trs rihe qui demnde de l prision et de l9orgnistionF eutEon duter en progrmmtion ve le gCC c yuiD ien sr que oui 3 xous l9vons d9illeurs dj prouv es dernires nnes gre l version de e ours disponile en ligne sur le ite du roF ille permis de trs nomreux dutnts en progrmmtion de se former ve sus sur e lnggeF v9ouvrge que vous llez lire est le premier de l olletion vivre du ro rdig pr deux uteursF xous vons omin nos expertises pdgogiques et tehniques pour vous proposer un ours qui soit l fois X ! Accessible X 9est un ours pour dutntsD il tit don indispensle qu9il puisse tre lu sns di0ult pr tout le monde 3 ! Concret X nous ne sommes ps l pour vous ssommer de d(nitions stritesF xous essierons toujours d9ller vers du onret en prennt pour exemples des progrmmes que vous onnissez djF ve ours est jlonn de plusieurs trvux prtiques Y l9un d9eux vous permettr d9illeurs de rer votre propre nvigteur we 3 ! Attrayant X gre ux trvux prtiques qui se veulent musnts ien srD mis ussi gre l prsenttion de l iliothque t qui vous permettr de rer vos propres fentres ve une tonnnte filit 3 ! Complet X non ontent de s9dresser ux dutntsD e ours v vous prsenter des notions vnes du gCC telles que les exeptionsD les templtesD les itrteursD fonteursD lgorithmes de l iliothque stndrdF F F et ien d9utres hoses 3 rire e ours tit un pssionnnt d( que nous vons pris plisir releverF xous esprons que vous ressentirez e mme plisir lors de votre douverte du gCC 3 i

CHAPITRE 0.

AV ANT-PROPOS

Qu'allez-vous apprendre en lisant ce livre ?


ve pln de e livre mri pendnt plusieurs nnesF sl se veut l fois orient dutntsD progressif et ompletF oii les di'rentes prties qui vous ttendentF IF Dcouverte de la programmation en C++ X ette premire prtie dmrre tout en doueur en vous prsentnt le lngge gCC et ses domines d9ppliE tionF xous pprendrons ensuite instller et utiliser les outils nessires pour progrmmerD que e soit sous indowsD w y ou vinuxF ous serez lors prts douvrir les fondmentux de l progrmmtion en gCC et rer vos premiers progrmmesF PF La Programmation Oriente Objet X nous nous intresserons l programmation oriente objetF sl s9git d9une mnire d9orgniser ses progrmmes qui fit l fore du gCCF xous y verrons e que sont les ojetsD les lssesD l9hritgeD le polymorphismeD etF ges hpitres seront plus di0iles que eux de l preE mire prtieD mis ils sont essentiels l mtrise du lnggeF v di0ult ser nnmoins progressive (n de ne perdre personne en ours de routeF QF Crez vos propres fentres avec Qt X gre ux ses que vous urez quises prdemmentD nous pourrons psser des notions onrtes et musntesF qre l iliothque tD nous pprendrons rer des progrmmes utilisnt des fentresD des outonsD des menusD des zones de texteD etF eu ours de ette prtieD nous verrons omment rer notre propre nvigteur we 3 RF Utilisez la bibliothque standard X nous llons pprendre pprivoiser l fmeuse Standard Library du gCCF sl s9git d9un ensemle de riques de se utilisles dns de nomreux progrmmesF ous pourrez lors filement et rE pidement rire des progrmmes trs e0es F SF Notions avances X en(nD et ouvrge se terminer ve plusieurs notions plus vnesF xous y prlerons de gestion des erreurs et de templatesD un mnisme qusiment unique u gCC qui permet de rer des moreux de progrmme rutilislesF
1

Comment lire ce livre ?


Suivez l'ordre des chapitres
visez e livre omme on lit un romnF sl t onu de ette fonF gontrirement euoup de livres tehniques qu9il est ournt de prourir en diE gonle en sutnt prfois ertins hpitresD il est ii trs fortement reommnd de suivre l9ordre du oursD moins que vous ne soyez dj un peu exprimentsF
1. Notez qu'il est rare qu'un livre pour dbutants prsente ces notions !

ii

CE LIVRE EST ISSU DU SITE DU ZRO

Pratiquez en mme temps


rtiquez rgulirementF x9ttendez ps d9voir (ni l leture de e livre pour lluE mer votre ordinteur et fire vos propres essisF vorsque vous douvrez une nouvelle ommndeD essyezEl et testez de nouveux prmtres pour voir omment elle se omporteF

Utilisez les codes web !


e(n de tirer prti du ite du ro dont e livre est issuD eluiEi vous propose e que l9on ppelle des  odes we F ge sont des odes six hi'res qu9il fut sisir sur une pge du ite du ro pour tre utomtiquement redirig vers un site we sns voir en reopier l9dresseF our utiliser les odes weD rendezEvous sur l pge suivnte X
2

n formulire vous invite rentrer votre ode weF pites un premier essi ve le ode iEdessous X gode we X IPQRST ges odes we ont plusieurs intrts X ! ils vous redirigent vers les sites we prsents tout u long du oursD vous permettnt insi d9otenir les logiiels dns leur toute dernire version Y ! ils vous permettent de tlhrger les odes soures inlus dns e livreD e qui vous viter d9voir reopier ertins progrmmes un peu longsF ge systme de rediretion nous permet de tenir jour le livre que vous tenez entre vos mins sns que vous yez esoin d9heter systmtiquement hque nouvelle ditionF i un site we hnge d9dresseD nous modi(erons l rediretion mis le ode we utiliser rester le mmeF i un site we disprtD nous vous redirigerons vers une pge du ite du ro expliqunt e qui s9est pss et vous proposnt une lterntiveF i une pture d9rn n9est plus jourD nous vous indiquerons e qui hng et omment proderF in lirD 9est un moyen de nous ssurer de l prennit de et ouvrge sns que vous yez fire quoi que e soit 3

http://www.siteduzero.com/codeweb.html

Ce livre est issu du Site du Zro


get ouvrge reprend le ours de gCC du ite du ro dns une dition revue et orrigeD ugmente de nouveux hpitres plus vns et de notes de s de pgeF sl reprend les lments qui ont fit le sus des ours du siteD svoir leur pprohe
3

2. Vous pouvez aussi utiliser le formulaire de recherche du Site du Zro, section  Code web . 3. Vous y dcouvrirez notamment comment utiliser des itrateurs sur les ux, les chanes de caractres, les tableaux. . . et vous verrez que le C++ permet de faire du calcul scientique !

iii

CHAPITRE 0.

AV ANT-PROPOS

progressive et pdgogiqueD leur ton dontrtD insi que les nomreux shms perE mettnt de mieux omprendre le fontionnement de l progrmmtion en gCCF fien que e ours soit rdig qutre minsD vous verrez que nous nous exprimons l premire personne du singulierF gel renfore l proximit entre le leteur et l9uteur F smginez tout simplement que vous tes seuls ve votre professeur dns une mme pieF
4

Remerciements
xous tenons remerier toutes les personnes qui nous ont ids et soutenus dns l rlistion de e livreF

Mathieu Nebra
te souhite remerier X ! wes prentsD qui me font on(ne et ontinuent de suivre ttentivement mes projets Y ! lodieD qui est toujours l pour me donner l dose de ourge dont j9i esoin Y ! ierre huuD qui s9est mis en qutre pour que e livre soit puli dns les meilleures onditions possiles Y ! xotre infogrphisteD pn tiyongD pour s rlistion de l ouverture du livre et des illustrtions des hpitres Y ! wtthieu hllerD pour ses onseils viss qui ont permis e ours " dont il est devenu oEuteur " de ggner en rigueur et en prision Y ! v9quipe de imple s qui fit un trvil formidle pour mliorer le ite du ro Y ! it tous nos visiteurs qui nous font on(ne X meriD meriD meri 3

Matthieu Schaller
te souhite remerier X ! wes prents et m fmille pour leur soutien indfetile quel que soit le projet dns lequel je m9emrque Y ! wthieu xer pour s on(neD son enthousismeD ses leons de pdgogie et son temps pss orriger mon orthogrphe Y ! v9quipe du ite du ro et imple s pour leur trvil et leur ide lors de l releture des hpitres Y ! vu rermitte @lmghsA pour ses prieux onseils et son immense expriene du gCC Y ! tenEgdri ghppelierD mon professeur d9informtiqueD pour son enseignement et l rigueur qu9il su pporter mon gge tehniqueF
4. Il faut noter que nous nous sommes rparti la rdaction des chapitres. Ainsi, nous nous exprimons en  je  tour de rle.

iv

Sommaire

Avant-propos

u9llezEvous pprendre en lisnt e livre c F gomment lire e livre c F F F F F F F F F F F F ge livre est issu du ite du ro F F F F F F emeriements F F F F F F F F F F F F F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

ii ii iii iv

I Dcouverte de la programmation en C++


1 Qu'est-ce que le C++ ?

1
F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F R F S F U F IH F F F F
13 3

ves progrmmes F F F F F F F F F F ves lngges de progrmmtion F F ve gCC fe ux utres lngges F v petite histoire du gCC F F F F F

F F F F

F F F F

F F F F

F F F F

F F F F F F F F

F F F F F F F F

F F F F F F F F

F F F F F F F F

F F F F F F F F

F F F F F F F F

F F F F F F F F

F F F F F F F F

2 Les logiciels ncessaires pour programmer

ves outils nessires u progrmmeur F F gode: :floks @indowsD w yD vinuxA isul gCC @indows seulementA F F F F ode @w y seulementA F F F F F F F F

IR IT PI PU

3 Votre premier programme

ve monde merveilleux de l onsole F F F F F F F F F F F F F F F F F F F F F F F F QT grtion et lnement d9un premier projet F F F F F F F F F F F F F F F F F F F F QV v

35

SOMMAIRE

ixplitions sur e premier ode soure F F F F F F F F F F F F F F F F F F F F F RI gommentez vos progrmmes 3 F F F F F F F F F F F F F F F F F F F F F F F F F F F RS


4 Utiliser la mmoire

u9estEe qu9une vrile c F F F F hlrer une vrile F F F F F F F hlrer sns initiliser F F F F F e0her l vleur d9une vrile F ves rfrenes F F F F F F F F F F F

F F F F F

F F F F F

F F F F F

F F F F F

F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

49

SH SQ SU SV TH

5 Une vraie calculatrice

hemnder des informtions l9utilisteur wodi(er des vriles F F F F F F F F F F F ves onstntes F F F F F F F F F F F F F F F n premier exerie F F F F F F F F F F F F ves rouris F F F F F F F F F F F F F F F F inore plus de mths 3 F F F F F F F F F F F

65

TT UI UR US UV VH

6 Les structures de contrle

ves onditions F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F VT foolens et ominisons de onditions F F F F F F F F F F F F F F F F F F F F F WQ ves oules F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F WS grer et utiliser une fontion F F F F F F F F uelques exemples F F F F F F F F F F F F F F ssge pr vleur et pssge pr rfrene tiliser plusieurs (hiers F F F F F F F F F F F hes vleurs pr dfut pour les rguments F ves tleux sttiques F F F F F F ves tleux dynmiques F F F F ves tleux multiEdimensionnels ves strings omme tleux F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
101

85

7 Dcouper son programme en fonctions

IHP IHV III IIT IPQ IQH IQU IRP IRR

8 Les tableaux

F F F F

129

vi

SOMMAIRE

9 Lire et modier des chiers

rire dns un (hier F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F IRV vire un (hier F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F ISI uelques stues F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F ISR rprtifs et onseils F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F ITH gorretion F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F ITS eller plus loin F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F ITV ne question d9dresse F F F F ves pointeurs F F F F F F F F F v9llotion dynmique F F F und utiliser des pointeurs F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
171 159

147

10 TP : le mot mystre

11 Les pointeurs

IUP IUR IUW IVQ

II La Programmation Oriente Objet


12 Introduction : la vrit sur les strings enn dvoile

187
F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
189

hes ojetsF F F pour quoi fire c F F F v9horrile seret du type string F grer et utiliser des ojets string yprtions sur les string F F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

IWH IWQ IWS PHH

13 Les classes (Partie 1/2)

grer une lsse F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PHT hroits d9s et enpsultion F F F F F F F F F F F F F F F F F F F F F F F F F F PII prer prototypes et d(nitions F F F F F F F F F F F F F F F F F F F F F F F F F PIU gonstruteur et destruteur F F ves mthodes onstntes F F F F essoier des lsses entre elles F etion 3 F F F F F F F F F F F F F wg shm rsum F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
225

205

14 Les classes (Partie 2/2)

PPT PQP PQQ PQW PRP vii

SOMMAIRE

15 La surcharge d'oprateurs

etits prprtifs F F F F F F F F ves oprteurs rithmtiques F ves oprteurs de )ux F F F F F ves oprteurs de omprison

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

245

PRT PRV PST PTH

16 TP : La POO en pratique avec ZFraction

rprtifs et onseils F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PTT gorretion F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PUI eller plus loin F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F PUV ointeur d9une lsse vers une utre lsse F qestion de l9llotion dynmique F F F F F ve pointeur this F F F F F F F F F F F F F F F ve onstruteur de opie F F F F F F F F F F F ixemple d9hritge simple F v drivtion de type F F F rritge et onstruteurs F v porte protected F F F F ve msquge F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
281

265

17 Classes et pointeurs

PVP PVR PVT PVV PWV QHQ QHU QIH QII

18 L'hritage

297

19 Le polymorphisme

v rsolution des liens F F F F ves fontions virtuelles F F F F ves mthodes spiles F F F F ves olletions htrognes F F ves fontions virtuelles pures

317

QIV QPI QPQ QPT QQH

20 Elments statiques et amiti

ves mthodes sttiques F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QQR ves ttriuts sttiques F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QQS v9miti F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QQU

333

viii

SOMMAIRE

III Crez vos propres fentres avec Qt


21 Introduction Qt

343
345

his ppD omment on fit des fentres c F F F F F F F F F F F F F F F F F F F F F QRT rsenttion de t F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QRW snstlltion de t F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QSR rsenttion de t gretor F F F F F F F F F F F F F F F F F F F F F F F F F F F F QTH godons notre premire fentre 3 F F F F F F F F F F F F F F F F F F F F F F F F F F QTT hi'user le progrmme F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F QTW wodi(er les proprits d9un widget F t et l9hritge F F F F F F F F F F F F n widget peut en ontenir un utre rriter un widget F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
371 359

22 Compiler votre premire fentre Qt

23 Personnaliser les widgets

QUP QUW QVQ QVV QWT QWU RHH RHR

24 Les signaux et les slots

ve prinipe des signux et slots F F F F F gonnexion d9un signl un slot simple F hes prmtres dns les signux et slots grer ses propres signux et slots F F F F e0her un messge F F F F F F F F F isir une informtion F F F F F F F F letionner une polie F F F F F F F F letionner une ouleur F F F F F F F letion d9un (hier ou d9un dossier F F F F F F F F F F

395

25 Les botes de dialogue usuelles

411

RIP RPH RPP RPS RPU

26 Apprendre lire la documentation de Qt

y trouver l doumenttion c F F F F F F F F F F F F F F F F F F F F F F F F F F RQP ves di'rentes setions de l doumenttion F F F F F F F F F F F F F F F F F F F RQS gomprendre l doumenttion d9une lsse F F F F F F F F F F F F F F F F F F F RQT
445

431

27 Positionner ses widgets avec les layouts

ix

SOMMAIRE

ve positionnement solu et ses dfuts v9rhiteture des lsses de lyout F F F ves lyouts horizontux et vertiux F F ve lyout de grille F F F F F F F F F F F F ve lyout de formulire F F F F F F F F F gominer les lyouts F F F F F F F F F F F
28 Les principaux widgets

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

F F F F F F F F F F F

RRT RRV RRW RSR RSW RTI


465

ves fentres F F ves outons F F ves 0heurs F ves hmps F F ves onteneurs

F F F F F

F F F F F

F F F F F

F F F F F

F F F F F

F F F F F

F F F F F

F F F F F

F F F F F

F F F F F

F F F F F

F F F F F

F F F F F

F F F F F

RTT RUI RUS RUU RVI

29 TP : ZeroClassGenerator

xotre ojetif F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RVV gorretion F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RWP hes ides d9mliortions F F F F F F F F F F F F F F F F F F F F F F F F F F F F F RWT F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F


499

487

30 La fentre principale

rsenttion de QMainWindow F v zone entrle @hs et whsA ves menus F F F F F F F F F F F F v rre d9outils F F F F F F F F

SHH SHQ SHU SIP

31 Modliser ses fentres avec Qt Designer

rsenttion de t hesigner F F F F F F F ler des widgets sur l fentre F F F F gon(gurer les signux et les slots F F F F tiliser l fentre dns votre pplition ves nvigteurs et les moteurs we yrgnistion du projet F F F F F F F qnrtion de l fentre priniple ves slots personnliss F F F F F F F F F F F F F F F F F F F

515

SIT SPH SPS SPU

32 TP : zNavigo, le navigateur web des Zros !

F F F F

F F F F

F F F F

533

SQR SQV SRI SRS

SOMMAIRE

gonlusion et mliortions possiles F F F F F F F F F F F F F F F F F F F F F F F SSH

IV Utilisez la bibliothque standard


33 Qu'est-ce que la bibliothque standard ?

551
F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
553

n peu d9histoire F F F F F ve ontenu de l v F F F e doumenter sur l v F v9hritge du g F F F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F F F F F

F F F F F F F F

F F F F F F F F

F F F F F F F F

F F F F F F F F

F F F F F F F F

F F F F F F F F F F F F

SSR SST SSU SSV

34 Les conteneurs

toker des lments F F F F F F F F ves squenes et leurs dptteurs ves tles ssoitives F F F F F F F ghoisir le on onteneur F F F F F F

565

STT STW SUR SUT

35 Itrateurs et foncteurs

strteurs X des pointeurs oosts F F F F v pleine puissne des list et map F F ponteur X l version ojet des fontions pusion des deux onepts F F F F F F F F

F F F F

F F F F

F F F F

579

SVH SVR SVU SWP

36 La puissance des algorithmes

n premier exemple F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F SWV gompterD herherD trier F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F THH inore plus d9lgos F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F THS ves itrteurs de )ux F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TIH ve retour des lgorithmes F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TIQ inore un retour sur les strings 3 F F F F F F F F F F F F F F F F F F F F F F F F F TIT lus loin ve les strings F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TPH wnipuler les tleux sttiques F F F F F F F F F F F F F F F F F F F F F F F F F TPI pire du lul sienti(que F F F F F F F F F F F F F F F F F F F F F F F F F F F F F TPQ xi
619 609

597

37 Utiliser les itrateurs sur les ux

38 Aller plus loin avec la SL

SOMMAIRE

V Notions avances
39 La gestion des erreurs avec les exceptions

627
F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F
629

n prolme ien ennuyeux v gestion des exeptions F ves exeptions stndrd F F ves ssertions F F F F F F F F

TQH TQP TQU TRQ TRV TSI TSQ TSS

40 Crer des templates

ves fontions templtes F F F F hes fontions plus ompliques v spilistion F F F F F F F F ves lsses templtes F F F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

F F F F

647

41 Ce que vous pouvez encore apprendre

lus loin ve le lngge gCC F F F F F F F F F F F F F F F F F F F F F F F F F F TTP lus loin ve d9utres iliothques F F F F F F F F F F F F F F F F F F F F F F F TTT

661

xii

Premire partie

Dcouverte de la programmation en C++

Chapitre

1
Dicult :

Qu'est-ce que le C++ ?

'informatique vous passionne et vous aimeriez apprendre programmer ? Et pourquoi pas aprs tout ! La programmation peut sembler dicile au premier abord mais c'est un univers beaucoup plus accessible qu'il n'y parat ! Vous vous demandez srement par o commencer, si le C++ est fait pour vous, s'il n'est pas prfrable de dmarrer avec un autre langage. Vous vous demandez si vous allez pouvoir faire tout ce que vous voulez, quelles sont les forces et les faiblesses du C++. . . Dans ce chapitre, je vais tenter de rpondre toutes ces questions. N'oubliez pas : c'est un cours pour dbutants. Aucune connaissance pralable n'est requise. Mme si vous n'avez jamais programm de votre vie, tout ce que vous avez besoin de faire c'est de lire ce cours progressivement, sans brler les tapes et en pratiquant rgulirement en mme temps que moi !

CHAPITRE 1.

QU'EST-CE QUE LE C++ ?

Les programmes
ves progrmmes sont l se de l9informtiqueF ge sont eux qui vous permettent d9exuter des tions sur votre ordinteurF renons pr exemple l (gure IFI qui reprsente une pture d9rn de mon ordinteurF yn y distingue Q fentres orrespondnt Q progrmmes di'rentsF hu premier pln l9rrireEpln X

Figure IFI ! hes progrmmes

! le nvigteur we qoogle ghromeD qui permet de onsulter des sites we Y ! l9explorteur de (hiersD qui permet de grer les (hiers sur son ordinteur Y ! le tritement de texte wirosoft ordD qui permet de rdiger lettres et doumentsF gomme vous le voyezD hun de es progrmmes est onu dns un ut prisF yn pourrit ussi iter les jeuxD pr exempleD qui sont prvus pour s9muser X trrft ss @(gure IFPAD orld of rrftD ormsD em portress PD etF ghun d9eux orrespond un progrmme di'rentF
Tous les programmes ne sont pas forcment visibles. C'est le cas de ceux qui surveillent les mises jour disponibles pour votre ordinateur ou, dans une moindre mesure, de votre antivirus. Ils tournent tous en  tche de fond , ils n'achent pas toujours une fentre ; mais cela ne les empche pas d'tre actifs et de travailler !

LES LANGAGES DE PROGRAMMATION

Figure IFP ! ves jeux vido @ii trrft ssA sont le plus souvent dvelopps en gCC
Moi aussi je veux crer des programmes ! Comment dois-je m'y prendre ?

out d9ordD ommenez pr mesurer vos mitionsF n jeu tel que trrft ss nE essite des dizines de dveloppeurs plein tempsD pendnt plusieurs nnesF xe vous mettez don ps en tte des ojetifs trop di0iles tteindreF in revnheD si vous suivez e oursD vous urez de solides ses pour dvelopper des progrmmesF eu ours d9un D nous rliserons mme notre propre nvigteur we @simpli(A omme wozill pirefox et qoogle ghrome 3 ous surez rer des proE grmmes dots de fentresF eve un peu de trvil supplmentireD vous pourrez mme rer des jeux Ph et Qh si vous le dsirezF frefD ve le temps et fore de persvrneD vous pourrez ller loinF elors ouiD je n9oulie ps votre question X vous vous demndez omment rliser des progrmmesF v progrmmtion est un univers trs riheF yn utilise des langages de programmation qui permettent d9expliquer l9ordinteur e qu9il doit fireF oyons plus en dtil e que sont les lngges de progrmmtionF

Les langages de programmation


otre ordinteur est une mhine tonnnte et omplexeF l seD il ne omprend qu9un lngge trs simple onstitu de H et de IF einsiD un messge tel que eluiEi X S

CHAPITRE 1.

QU'EST-CE QUE LE C++ ?

1010010010100011010101001010

F F F peut signi(er quelque hose omme  e0he une fentre l9rn F


Ouah ! Mais c'est super compliqu ! On va tre oblig d'apprendre ce langage ?

reureusement nonF 9il fllit rire dns e lngge @qu9on ppelle langage binaire AD il ne fudrit ps des nnes pour onevoir un jeu omme trrft ss mis plutt des millnires @sns rire 3AF our se simpli(er l vieD les informtiiens ont r des lngges intermdiiresD plus simples que le inireF sl existe ujourd9hui des entines de lngges de progrmmtionF our vous fire une ideD vous pouvez onsulter une liste des lngges de progrmmtion sur ikipdiF ghun de es lngges des spi(itsD nous y reviendronsF  vngges de progrmmtion gode we X TRWRWR  ous les lngges de progrmmtion ont le mme ut X vous permettre de prler l9ordinteur plus simplement qu9en inireF oii omment el fontionne X IF ous rivez des instrutions pour l9ordinteur dns un lngge de progrmmE tion @pr exemple le gCCA Y PF ves instrutions sont trduites en inire gre un progrmme de  trdution Y QF v9ordinteur peut lors lire le inire et fire e que vous vez demnd 3 sumons es tpes dns un shm @(gure IFQAF

Figure IFQ ! v ompiltion

ve fmeux  progrmme de trdution s9ppelle en rlit le compilateurF g9est un outil indispensleF sl vous permet de trnsformer votre odeD rit dns un lngge de progrmmtionD en un vri progrmme exutleF eprenons le shm prdent et utilisons un vri voulire d9informtiien @(gure IFRAF oil e que je vous demnde de retenir pour le moment X e n9est ps ien ompliqu mis 9est l se onntre solument 3 T

LE C++ FACE AUX AUTRES LANGAGES

Figure IFR ! v ompiltion en dtil


Mais justement, comment dois-je faire pour choisir le langage de programmation que je vais utiliser ? Tu as dit toi-mme qu'il en existe des centaines ! Lequel est le meilleur ? Est-ce que le C++ est un bon choix ?

ves progrmmeurs @ussi ppels dveloppeurs A onnissent en gnrl plusieurs lnE gges de progrmmtion et non ps un seulF yn se onentre rrement sur un seul lngge de progrmmtionF fien entenduD il fut ien ommener pr l9un d9euxF v onne nouvelleD 9est que vous pouvez ommener pr elui que vous voulez 3 ves prinipes des lngges sont souvent les mmesD vous ne serez ps trop dpyss d9un lngge l9utreF xnmoinsD voyons plus en dtil e qui rtrise le gCC pr rpport ux utres lngges de progrmmtionF F F it ien ouiD 9est un ours de gCC ne l9ouliez ps 3 ue vut le gCC pr rpport ux utres lngges c

Le C++ face aux autres langages


Le C++ : langage de haut ou de bas niveau ?
rmi les entines de lngges de progrmmtion qui existentD ertins sont plus poE pulires que d9utresF ns uun douteD le gCC est un lngge trs populaireF hes sites omme lngpopFom tiennent jour un lssement des lngges les plus ourmment utilissD si ette informtion vous intresseF gomme vous pourrez le onstterD le gD le tv et le gCC oupent rgulirement le hut du lssementF v question est X futEil hoisir un lngge pre qu9il est populire c sl existe des lngges trs intressnts mis peu utilissF ve soui ve les lngges peu utilissD 9est qu9il est di0ile de trouver des gens pour vous ider et vous onseiller qund vous vez un prolmeF oil entre utres pourquoi le gCC est un on hoix pour qui veut duter X il y su0smment de gens qui dveloppent en gCC pour que vous n9yez ps rindre de vous retrouver tous seuls 3 fien entenduD il y d9utres ritres que l populritF ve plus importnt mes yeux est le niveu du lnggeF sl existe des lngges de haut niveau et d9utres de plus bas niveauF U

CHAPITRE 1.

QU'EST-CE QUE LE C++ ?

Qu'est-ce qu'un langage de haut niveau ?

g9est un lngge ssez loign du inire @et don du fontionnement de l mhineAD qui vous permet gnrlement de dvelopper de fon plus souple et rpideF r oppositionD un lngge de s niveu est plus prohe du fontionnement de l mhine X il demnde en gnrl un peu plus d9e'orts mis vous donne ussi plus de ontrle sur e que vous fitesF g9est doule trnhntF ve gCC c yn onsidre qu9il fit prtie de l seonde tgorie X 9est un lngge dit  de s niveu F wis que el ne vous fsse ps peur 3 wme si progrmmer en gCC peut se rvler ssez omplexeD vous urez entre les mins un lngge trs puissnt et prtiulirement rpideF in e'etD si l9immense mjorit des jeux sont dvelopps en gCCD 9est pre qu9il s9git du lngge qui llie le mieux puissne et rpiditF oil e qui en fit un lngge inontournleF ve shm iEdessous reprsente quelques lngges de progrmmtion lsss pr  niE veu @(gure IFSAF

Figure IFS ! ves niveux des lngges

ous onstterez qu9il est en fit possile de progrmmer en inire gre un lngge trs sique ppel l9ssemleurF tnt donn qu9il fut dployer des e'orts surhumins pour oder ne seritEe qu9une lultrieD on prfre le plus souvent utiliser un lngge de progrmmtionF
En programmation, la notion de  niveau  est relative. Globalement, on peut dire que le C++ est  bas niveau  par rapport au Python, mais il est plus  haut niveau  que l'assembleur. Tout dpend de quel point de vue on se place.

LE C++ FACE AUX AUTRES LANGAGES

Rsum des forces du C++ ! sl est trs rpanduF gomme nous l9vons vuD il fit prtie des lngges de progrmE mtion les plus utiliss sur l plnteF yn trouve don euoup de doumenttion sur snternet et on peut filement voir de l9ide sur les forumsF sl prt mme qu9il y des gens symps qui rivent des ours pour dutnts dessusF XE ! sl est rapideD trs rpide mmeD e qui en fit un lngge de hoix pour les pE plitions ritiques qui ont esoin de performnesF g9est en prtiulier le s des jeux vidoD mis ussi des outils (nniers ou de ertins progrmmes militires qui doivent fontionner en temps relF ! sl est portable X un mme ode soure peut thoriquement tre trnsform sns prolme en exutle sous indowsD w y et vinuxF ous n9urez ps esoin de rrire votre progrmme pour d9utres pltesEformes 3 ! sl existe de nombreuses bibliothques pour le gCCF ves iliothques sont des extensions pour le lnggeD un peu omme des plugEinsF he seD le gCC ne sit ps fire grnd hose misD en le ominnt ve de onnes iliothquesD on peut rer des progrmmes QhD rseuxD udioD fentrsD etF ! sl est multi-paradigmes @outh 3AF ge mot rre signi(e qu9on peut progrmmer de di'rentes fons en gCCF ous tes enore un peu trop dutnts pour que je vous prsente tout de suite es tehniques de progrmmtion mis l9une des plus lres est l Programmation Oriente Objet @yyAF g9est une tehnique qui permet de simpli(er l9orgnistion du ode dns nos progrmmes et de rendre filement ertins moreux de odes rutilislesF v prtie ss de e ours ser entirement ddie l yy 3 fien entenduD le gCC n9est ps vi lngge inontournleF sl luiEmme ses dfuts pr rpport d9utres lnggesD s omplexit en prtiulierF ous vez euoup de ontrle sur le fontionnement de votre ordinteur @et sur l gestion de l mmoireA X el o're une grnde puissne misD si vous l9utilisez mlD vous pouvez plus filement fire plnter votre progrmmeF xe vous en fites psD nous douvrirons tout el progressivement dns e oursF Petit aperu du C++
our vous donner une ideD voii un progrmme trs simple 0hnt le messge  rello world 3 l9rnF ge ser l9un des premiers odes soure que nous tudierons dns les prohins hpitresF
1

5inlude `iostremb using nmespe stdY int min@A { out `` 4rello world34 `` endlY
1.  Hello World  est traditionnellement le premier programme que l'on eectue lorsqu'on commence la programmation.

CHAPITRE 1.

QU'EST-CE QUE LE C++ ?

return HY

La petite histoire du C++


v progrmmtion dj une longue histoire derrire elleF eu dutD il n9existit mme ps de lvier pour progrmmer 3 yn utilisit des rtes perfores omme elle iEdessous pour donner des instrutions l9ordinteur @(gure IFTAF

Figure IFT ! grte perfore

eutnt vous dire que 9tit long et fstidieux 3

De l'Algol au C++
ves hoses ont ensuite voluD heureusementF ve lvier et les premiers lngges de progrmmtion sont pprus X ! IWSV X il y longtempsD l9poque o les ordinteurs pesient des tonnes et fisient l tille de votre misonD on ommen inventer un lngge de progrmmtion ppel l'AlgolF ! IWTHEIWUH X ensuiteD les hoses voluntD on r un nouveu lngge ppel le CPLD qui volu luiEmme en BCPLD puis qui prit le nom de langage B @vous n9tes ps oligs de retenir tout pr oeurAF ! IWUH X puisD un eu jourD on en est rriv rer enore un utre lngge qu9on ppelF F F le langage CF ge lnggeD s9il sui quelques modi(tionsD reste enore un des lngges les plus utiliss ujourd9huiF ! IWVQ X un peu plus trdD on propos d9jouter des hoses u lngge gD de le fire voluerF ge nouveu lnggeD que l9on ppel  gCC D est entirement s sur le gF Le langage C++ n9est en fit rien d9utre que le lngge g ve plusieurs nouE veutsF sl s9git de onepts de progrmmtion pousss omme l progrmmtion oriente ojetD le polymorphismeD les )uxF F F frefD des hoses ien ompliques pour nous pour le moment mis dont nous urons l9osion de reprler pr l suite 3 IH

LA PETITE HISTOIRE DU C++

Une minute. . . Si le C++ est en fait une amlioration du C, pourquoi y a-t-il encore tant de gens qui dveloppent en C ?

out le monde n9 ps esoin des mliortions pportes pr le lngge gCCF ve g est lui seul su0smment puissnt pour tre l se des systmes d9exploittion omme vinuxD w y et indowsF geux qui n9ont ps esoin des mliortions @mis ussi de l omplexit 3A pportes pr le lngge gCC se ontentent don trs ien du lngge g et eD mlgr son geF gomme quoiD un lngge peut tre vieux et rester d9tulitF

Le concepteur
g9est fjrne troustrupD un informtiien originire du hnemrkD qui onu le lnE gge gCCF snstisfit des possiilits o'ertes pr le gD il r en IWVQ le gCC en y joutnt les possiilits quiD selon luiD mnquientF Bjarne Stroustrup est ujourd9hui professeur d9informtique l9universit exs e8wD ux ittsEnisF sl s9git d9une importnte (gure de l9univers informtique qu9il fut onntreD u moins de nom F he nomreux lngges de progrmmtion se sont pr l suite inspirs du gCCF g9est notmment le s du lngge tvF ve lngge gCCD ien que reltivement nienD ontinue tre mliorF ne nouvelle versionD ppele  gCCIx D est d9illeurs en ours de prprtionF sl ne s9git ps d9un nouveu lngge mis d9une mise jour du gCCF ves nouveuts qu9elle pporte sont ependnt trop omplexes pour nousD nous n9en prlerons don ps ii 3
2

En rsum
! ves progrmmes permettent de rliser toutes sortes d9tions sur un ordinteur X nvigtion sur le eD rdtion de textesD mnipultion des (hiersD etF ! our rliser des progrmmesD on rit des instrutions pour l9ordinteur dns un lngge de progrmmtionF g9est le ode soureF ! ve ode doit tre trduit en inire pr un outil ppel ompilteur pour qu9il soit possile de lner le progrmmeF v9ordinteur ne omprend en e'et que le inireF ! ve gCC est un lngge de progrmmtion trs rpndu et rpideF g9est une volution du lngge g r il o're en prtiulier l possiilit de progrmmer en orient ojetD une tehnique de progrmmtion puissnte qui ser prsente dns e livreF

2. Du moins si vous arrivez le retenir !

II

CHAPITRE 1.

QU'EST-CE QUE LE C++ ?

IP

Chapitre

2
Dicult :

Les logiciels ncessaires pour programmer

aintenant que l'on en sait un peu plus sur le C++, si on commenait pratiquer pour entrer dans le vif du sujet ? Ah mais oui, c'est vrai : vous ne pouvez pas programmer tant que vous ne disposez pas des bons logiciels ! En eet, il faut installer certains logiciels spciques pour programmer en C++. Dans ce chapitre, nous allons les mettre en place et les dcouvrir ensemble. Un peu de patience : ds le prochain chapitre, nous pourrons enn commencer vritablement programmer !

IQ

CHAPITRE 2.

LES LOGICIELS NCESSAIRES POUR PROGRAMMER

Les outils ncessaires au programmeur


elors votre visD de quels outils un progrmmeur EtEil esoin c i vous vez ttentiE vement suivi le hpitre prdentD vous devez en onntre u moins un 3 ous voyez de quoi je prle c ih ouiD il s9git du compilateurD e fmeux progrmme qui permet de trduire votre lngge gCC en lngge inire 3 sl en existe plusieurs pour le lngge gCCF wis nous llons voir que le hoix du ompilteur ne ser ps trs ompliqu dns notre sF fonD de quoi d9utre EtEon esoin c te ne vis ps vous lisser deviner plus longtempsF oii le strit minimum pour un progrmmeur X ! Un diteur de texte pour rire le ode soure du progrmme en gCCF in thorie un logiiel omme le floExotes sous indows ou vi sous vinux fit l9'ireF v9idlD 9est d9voir un diteur de texte intelligent qui olore tout seul le odeD e qui vous permet de vous y reprer ien plus filementF oil pourquoi uun progrmmeur sin d9esprit n9utilise le floExotesF ! Un compilateur pour trnsformer @ ompiler A votre ode soure en inireF ! Un dbugger pour vous ider trquer les erreurs dns votre progrmme @on n9 mlheureusement ps enore invent le  orreteur D un tru qui orrigerit tout seul nos erreursAF A prioriD si vous tes un sseEou de l9extrmeD vous pourriez vous psser de duggerF wis onD je sis pertinemment que S minutes plus trd vous reviendriez me demnder o on peut trouver un dugger qui mrhe ienF prtir de mintennt on P possiilits X ! oit on rupre hun de es Q progrmmes sparmentF g9est l mthode l plus ompliqueD mis elle fontionneF ous vinux en prtiulierD on nomre de proE grmmeurs prfrent utiliser es Q progrmmes sprmentF te ne dtilleri ps ette solution iiD je vis plutt vous prler de l mthode simpleF ! oit on utilise un progrmme  QEenEI @oui ouiD omme les liquides visselleA qui omine diteur de texteD ompilteur et duggerF ges progrmmes  QEenEI sont ppels IDE @ou en frnis  ihs pour  invironnement de hveloppement snE tgr AF sl existe plusieurs environnements de dveloppementF eu dutD vous urez peutEtre un peu de ml hoisir elui qui vous pltF ne hose est sre en tout s X vous pouvez faire n'importe quel type de programme, quel que soit l'IDE que vous choisissezF
1

Les projets
und vous rlisez un progrmmeD on dit que vous trvillez sur un projetF n projet est onstitu de plusieurs (hiers de ode soure X des (hiers .cppD .hD les imges du progrmmeD etF
1.  Dbogueur  ou  Dbugueur  en franais

IR

LES OUTILS NCESSAIRES AU PROGRAMMEUR

ve rle d9un shi est de rssemler tous es (hiers d9un projet u sein d9une mme interfeF einsiD vous vez s tous les lments de votre progrmme porte de liF oil pourquoiD qund vous voudrez rer un nouveu progrmmeD il fudr demnder l9shi de vous prprer un  nouveau projet F

Choisissez votre IDE


sl m9 seml intressnt de vous montrer quelques shi prmi les plus onnusF ous sont disponiles grtuitementF ersonnellementD je nvigue un peu entre tous euxEl et j9utilise l9shi qui me plt selon l9humeur du jourF ! n des shi que je prfre s9ppelle Code: :BlocksF sl est grtuit et disponile pour l pluprt des systmes d9exploittionF Je conseille d'utiliser celui-ci pour dbuter @et mme pour l suite s9il vous plt ien 3AF pontionne sous indowsD w et vinuxF ! ve plus lre shi sous indowsD 9est elui de wirosoft X Visual C++F sl existe l se en version pynte @hre 3A misD heureusementD il en existe une version grtuite intitule Visual C++ Express qui est vriment trs ien @il y peu de di'renes ve l version pynteAF sl est trs omplet et possde un puissnt module de orretion des erreurs @dugggeAF pontionne sous indows uniquementF ! ur w y D vous pouvez ussi utiliser godeD gnrlement fourni sur le gh d9instlltion de w y F g9est un shi trs ppri pr tous eux qui font de l progrmmtion sur wF pontionne sous w y uniquementF
Note pour les utilisateurs de Linux : il existe de nombreux IDE sous Linux, mais les programmeurs expriments prfrent parfois se passer d'IDE et compiler  la main , ce qui est un peu plus dicile. Vous aurez le temps d'apprendre faire cela plus tard. En ce qui nous concerne nous allons commencer par utiliser un IDE. Si vous tes sous Linux, je vous conseille d'installer Code: :Blocks pour suivre mes explications. Vous pouvez aussi jeter un coup d'il du ct de l'IDE Eclipse pour les dveloppeurs C/C++, trs puissant et qui, contrairement l'ide rpandue, ne sert pas qu' programmer en Java !

ilipse pour les dveloppeurs gGgCC gode we X TVVIWV  


Quel est le meilleur de tous ces IDE ?

ous es shi vous permettront de progrmmer et de suivre le reste de e ours sns prolmeF gertins sont plus omplets u niveu des optionsD d9utres un peu plus intuitifs utiliserD mis dns tous les s les progrmmes que vous rerez seront les mmes quel que soit l9shi que vous utilisezF ge hoix n9est don ps si ruil qu9on pourrit le roireF IS

CHAPITRE 2.

LES LOGICIELS NCESSAIRES POUR PROGRAMMER

hurnt tout e oursD j9utiliseri gode: :floksF i vous voulez voir extement les mmes rns que moiD surtout u dut pour ne ps tre perdusD je vous reommnde don de ommener pr instller gode: :floksF

Code: :Blocks (Windows, Mac OS, Linux)


gode: :floks est un shi lire et grtuitD disponible pour Windows, Mac et LinuxF sl n9est disponile pour le moment qu9en nglisF Cela ne devrait PAS vous dcourager de l'utiliserF in fitD nous utiliserons trs peu les menusF hez toutefois queD qund vous progrmmerezD vous serez de toute fon onfront ien souvent des doumenttions en nglisF oil don une rison de plus pour s9entrner utiliser ette lngueF

Tlcharger Code: :Blocks


endezEvous sur l pge de tlhrgements de gode: :floksF  lhrger gode: :floks gode we X RHSQHW  ! i vous tes sous indowsD reprez l setion  indows un peu plus s sur ette pgeF lhrgez le logiiel en choisissant le programme dont le nom contient mingw @exF X codeblocks-10.05mingw-setup.exeAF v9utre version tnt sns ompilteurD vous urez du ml ompiler vos progrmmesF ! i vous tes sous vinuxD le mieux est enore d9instller gode: :floks vi les dpts @pr exemple ve l ommnde apt-get sous untuAF sl vous fudr ussi instller le ompilteur prt X 9est le pquet uildEessentilF our instller le ompilteur et l9shi gode: :floksD vous devriez don tper l ommnde suivnte X
ptEget instll uildEessentil odeloks

! in(nD sous wD hoisissez le (hier le plus rent de l listeF


J'insiste l-dessus : si vous tes sous Windows, tlchargez la version du programme d'installation dont le nom inclut mingw (gure 2.1). Si vous prenez la mauvaise version, vous ne pourrez pas compiler vos programmes par la suite !

v9instlltion est trs simple et rpideF vissez toutes les options pr dfut et lnez le progrmme @(gure PFPAF yn distingue dns l fentre R grndes setions @numrotes dns l (gure PFPA X IF La barre d'outils X elle omprend de nomreux outonsD mis seuls quelquesEuns d9entre eux nous seront rgulirement utilesF t9y reviendri plus loinF IT

CODE

: :BLOCKS

(WINDOWS, MAC OS, LINUX)

Figure PFI ! godefloks ve mingw

Figure PFP ! gode floks

IU

CHAPITRE 2.

LES LOGICIELS NCESSAIRES POUR PROGRAMMER

PF La liste des chiers du projet X 9est guhe que s90he l liste de tous les (hiers soure de votre progrmmeF xotez queD sur ette ptureD uun projet n9 t r X on ne voit don ps enore de (hier l9intrieur de l listeF ous verrez ette setion se remplir dns inq minutes en lisnt l suite du oursF QF La zone principale X 9est l que vous pourrez rire votre ode en lngge gCC 3 RF La zone de notication X ussi ppele l  one de l mort D 9est ii que vous verrez les erreurs de ompiltion s90her si votre ode omporte des erreursF gel rrive trs rgulirement 3 sntressonsEnous mintennt une setion prtiulire de l rre d9outilsF ous trouE verez dns l9ordre les outons suivnts X CompilerD ExcuterD Compiler & Excuter et Tout recompiler @(gure QFSAF etenezElesD nous les utiliserons rgulirementF

Figure PFQ ! snes de ompiltion

! Compiler X tous les (hiers soure de votre projet sont envoys u ompilteur qui se hrge de rer un exutleF 9il y des erreurs @e qui de fortes hnes d9rriverAD l9exutle n9est ps r et on vous indique les erreurs en s de gode: :floksF ! Excuter X ette ine lne juste le dernier exutle que vous vez ompilF gel vous permet don de tester votre progrmme et voir insi e qu9il donneF hns l9ordreD si vous vez ien suiviD on doit d9ord ompiler puis exuter le inire otenu pour le testerF yn peut ussi utiliser le Qme outonF F F ! Compiler & Excuter X ps esoin d9tre un gnie pour omprendre que 9est l ominison des P outons prdentsF g9est d9illeurs e outon que vous utiliserez le plus souventF xotez que s9il y des erreurs pendnt l ompiltion @pendnt l gnrtion de l9exutleAD le progrmme n9est ps exutF l pleD vous vez droit une liste d9erreurs orrigerF ! Tout reconstruire X qund vous hoisissez de CompilerD gode: :floks ne reompile en fit que les (hiers modi(s depuis l dernire ompiltion et ps les utresF rfois @je dis ien parfois A vous urez esoin de demnder gode: :floks de vous reompiler tous les (hiersF yn verr plus trd qund on esoin de e outon et vous verrez plus en dtil le fontionnement de l ompiltion dns un hpitre futurF our l9instntD on se ontente d9pprendre le minimum nessire pour ne ps tout mlngerF ge outon ne nous ser don ps utile de suiteF
Je vous conseille d'utiliser les raccourcis plutt que de cliquer sur les boutons, parce que c'est quelque chose qu'on fait vraiment trs trs souvent. Retenez en particulier qu'il faut appuyer sur la touche F9 pour Compiler & Excuter.

IV

CODE

: :BLOCKS

(WINDOWS, MAC OS, LINUX)

Crer un nouveau projet


our rer un nouveu projetD 9est trs simple X llez dns le menu File b New b ProjectF hns l fentre qui s9ouvreD hoisissez Console application @(gure PFRAF

Figure PFR ! xouveu projet


Comme vous pouvez le voir, Code: :Blocks propose de raliser bon nombre de types de programmes dirents qui utilisent des bibliothques connues comme la SDL (2D), OpenGL (3D), Qt et wxWidgets (Fentres) etc. Pour l'instant, ces icnes n'ont d'intrt que cosmtique car les bibliothques ne sont pas installes sur votre ordinateur, vous ne pourrez donc pas les faire marcher. Nous nous intresserons ces autres types de programmes bien plus tard. En attendant il faudra vous contenter de Console car vous n'avez pas encore le niveau ncessaire pour crer les autres types de programmes.

gliquez sur Go pour rer le projetF n ssistnt s9ouvreF v premire pge ne servnt rienD liquez sur NextF yn vous demnde ensuite si vous llez fire du g ou du gCC X rpondez gCC @(gure PFSAF yn vous demnde le nom de votre projet et dns quel dossier seront enregistrs les (hiers soure @(gure PFTAF in(nD l dernire pge vous permet de hoisir de quelle fon le progrmme doit tre ompilF ous pouvez lisser les options pr dfutD el n9ur ps d9inidene pour e que nous llons fire dns l9immdit @(gure PFUAF
2

2. Veillez ce qu'au moins Debug ou Release soit coch.

IW

CHAPITRE 2.

LES LOGICIELS NCESSAIRES POUR PROGRAMMER

Figure PFS ! xouveu projet gCC

Figure PFT ! xom et dossier du projet

PH

VISUAL C++ (WINDOWS SEULEMENT)

Figure PFU ! wodes de ompiltion

gliquez sur FinishD 9est on 3 gode: :floks vous re un premier projet ontennt dj un tout petit peu de ode soureF hns le pnneu de guhe intitul ProjectsD dveloppez l9roresene en liqunt sur le petit + pour 0her l liste des (hiers du projetF ous devriez voir u moins un (hier main.cpp que vous pouvez ouvrir en fisnt un douleEli dessusF it voil 3

Visual C++ (Windows seulement)


uelques petits rppels sur isul gCC X ! 9est l9shi de wirosoftF ! il est l se pyntD mis wirosoft en sorti une version grtuite intitule isul gCC ixpressF xous llons ien entendu voir ii l version grtuiteD isul gCC ixpress @(gure PFVAF
Quelles sont les dirences avec le  vrai  Visual ?

sl n9y ps d9diteur de ressoures @vous permettnt de dessiner des imgesD des ines ou des fentresAF wis onD entre nousD on s9en moque pre qu9on n9ur ps esoin de s9en servir dns e livreF ge ne sont ps des fontionnlits indispenslesD ien u PI

CHAPITRE 2.

LES LOGICIELS NCESSAIRES POUR PROGRAMMER

Figure PFV ! isul gCC ixpress

PP

VISUAL C++ (WINDOWS SEULEMENT)

ontrireF  isul gCC ixpress idition gode we X UQUTPH  letionnez isul gCC ixpress prnis un peu plus s sur l pgeF isul gCC ixpress est en franais et est totalement gratuitF ge n9est don ps une version d9essi limite dns le tempsF

Installation
v9instlltion devrit normlement se psser sns enomreF ve progrmme d9instlE ltion v tlhrger l dernire version de isul sur snternetF te vous onseille de lisser les options pr dfutF l (nD on vous dit qu9il fut vous enregistrer dns les QH joursF s de pniqueD 9est grtuit et rpide mis il fut le fireF gliquez sur le lien qui vous est donn X vous rrivez sur le site de wirosoftF gonnetezEvous ve votre ompte indows vive sh @quivlent du ompte rotmil ou wxA ou rezEen un si vous n9en vez psD puis rpondez u petit questionnireF l (n du proessusD on vous donne l (n une l d9enregistrementF ous devez reopier ette l dns le menu ? b Inscrire le produitF

Crer un nouveau projet


our rer un nouveu projet sous isulD llez dns le menu Fichier b Nouveau b ProjetF letionnez Win32 dns le pnneu de guhe puis Application console Win32 droiteF intrez un nom pour votre projetD pr exemple  test @(gure PFWAF lidezF ne nouvelle fentre s9ouvre @(gure PFIHAF gette fentre ne sert rienF r ontreD liquez sur Paramtres de l'application dns le pnneu de guhe @(gure PFIIAF eillez e que l9option Projet vide soit ohe omme l (gure PFIIF uisD liquez sur TerminerF

Ajouter un nouveau chier source


sources

otre projet est pour l9instnt ien videF pites un li droit sur le dossier Fichiers situ dns le pnneu de guhe puis llez dns Ajouter b Nouvel lment @(gure PFIPAF ne fentre s9ouvreF letionnez Fichier C++ (.cpp)F intrez le nom  minFpp pour votre (hier @(gure PFIQAF gliquez sur AjouterF g9est onD vous llez pouvoir ommener rire du ode 3 PQ

CHAPITRE 2.

LES LOGICIELS NCESSAIRES POUR PROGRAMMER

Figure PFW ! ejout d9un projet

Figure PFIH ! essistnt pplition

PR

VISUAL C++ (WINDOWS SEULEMENT)

Figure PFII ! rmtrge du projet

Figure PFIP ! ejout d9un nouvel lment

PS

CHAPITRE 2.

LES LOGICIELS NCESSAIRES POUR PROGRAMMER

Figure PFIQ ! ejout d9un (hier

La fentre principale de Visual


oyons ensemle le ontenu de l fentre priniple de isul gCC ixpress @(gure PFIRAF yn v rpidement se penher sur e que signi(e hune des prties X IF La barre d'outils X tout e qu9il y de plus stndrdF OuvrirD EnregistrerD Enregistrer toutD CouperD CopierD Coller etF r dfutD il semle qu9il n9y it ps de outon de rre d9outils pour ompilerF ous pouvez les rjouter en fisnt un li droit sur l rre d9outils puis en hoisissnt Dboguer et Gnrer dns l listeF outes es ines de ompiltion ont leur quivlent dns les menus Gnrer et DboguerF i vous hoisissez GnrerD el re l9exutle @el signi(e  gompiler pour isulAF i vous sletionnez Dboguer / ExcuterD on vous proposer de ompiler d9exuter le progrmmeF v touhe vnt devrit F7 permet de gnrer le projet et F5 de l9exuterF PF La liste des chiers du projet X dns ette zone trs importnteD vous voyez normlement l liste des (hiers de votre projetF gliquez sur l9onglet Explorateur de solutionsD en sD si e n9est dj fitF ous devriez voir que isul re dj des dossiers pour sprer les di'rents types de (hiers de votre projet @ soures D  enEttes et  ressoures AF xous verrons un peu plus trd quels sont les di'rentes sortes de (hiers qui onstituent un projetF QF La zone principale X 9est l qu9on modi(e les (hiers soureF RF La zone de notication X 9est l enore l  zone de l mort D elle o l9on voit pprtre toutes les erreurs de ompiltionF g9est glement dns le s de PT

XCODE (MAC OS SEULEMENT)

Figure PFIR ! pentre de isul gCC

l9rn que isul 0he les informtions de duggge qund vous essyez de orriger un progrmme uggF te vous i d9illeurs dit tout l9heure que j9imis euoup le dugger de isul et je pense que je ne suis ps le seulF oilD on fit le tour de isul gCCF ous pouvez ller jeter un il dns les options @Outils b OptionsA si el vous hnteD mis n9y pssez ps Q heuresF sl fut dire qu9il y tellement de ses oher prtout qu9on ne sit plus trop o donner de l tteF

Xcode (Mac OS seulement)


sl existe plusieurs shi omptiles wF sl y gode: :floks ien srD mis e n9est ps le seulF te vis vous prsenter ii l9shi le plus lre sous w X ode F
3

Xcode, o es-tu ?
ous les utilisteurs de w y ne sont ps des progrmmeursF epple l9 ien ompris etD pr dfutD n9instlle ps d9shi ve w yF reureusementD pour eux qui vouE drient progrmmerD tout est prvuF in e'etD ode est prsent sur le gh d9instlltion
3. Merci prs513rosewood pour les captures d'crans et ses judicieux conseils pour raliser cette section.

PU

CHAPITRE 2.

LES LOGICIELS NCESSAIRES POUR PROGRAMMER

de w yF snsrez don le gh dns le leteurF our instller odeD il fut ouvrir le pquet Xcode Tools dns le rpertoire Installation facultative du disque d9instlltionF v9insE tlleur dmrre @(gure PFISAF

Figure PFIS ! snstlltion de ode

r illeursD je vous onseille de mettre en fvori l pge ddie ux dveloppeurs sur le site d9eppleF ous y trouverez une foule d9informtions utiles pour le dveloppement sous wF ous pourrez notmment y tlhrger plusieurs logiiels pour dvelopperF x9hsitez ps vous insrire l9ehg @epple hevelopment gonnetionAD 9est grtuit et  vous serez insi tenus u ournt des nouveutsF ge dveloppeurs epple gode we X URSSUU 

Lancement
v9pplition ode se trouve dns le rpertoire /Developer/Applications/ @(gure PFITAF PV

XCODE (MAC OS SEULEMENT)

Figure PFIT ! vnement de ode

PW

CHAPITRE 2.

LES LOGICIELS NCESSAIRES POUR PROGRAMMER

Nouveau projet
our rer un nouveu projetD on lique sur Create b New ProjectF sl fut hoisir le type Command Line dns le petit menu droulnt @(gure PFIUAF
a new Xcode projectD ou File Tool et sletionner C++ sdtc++

Figure PFIU ! xouveu projet ode

ne fois le projet rD l fentre priniple de ode pprt @PFIVAF ve (hier sdz-test @ine noireA est l9exutle et le (hier sdz-test.1 est un (hier de doumenttionF ve (hier main.cpp ontient le ode soure du progrmmeF ous pouvez fire un douleEli dessus pour l9ouvrirF ous pouvez jouter de nouveux (hiers gCC u projet vi le menu File b New FileF QH

XCODE (MAC OS SEULEMENT)

Figure PFIV ! pentre priniple de ode

QI

CHAPITRE 2.

LES LOGICIELS NCESSAIRES POUR PROGRAMMER

Compilation
evnt de ompilerD il fut hnger un rglge dns les prfrenes de odeF our ouvrir les prfrenesD liquez sur Preferences dns le menu XcodeF hns l9onglet debuggingD sletionnez Show console dns l liste droulnte intitule On startF g9est une mnipultion nessire pour voir l sortie d9un progrmme en onsole @(gure PFIWAF

Figure PFIW ! yptions de ode

Cette manipulation n'a besoin d'tre faite qu'une seule fois en tout.

our ompilerD on lique sur le outon Build and Run @en forme de mrteu ve une petite ine verte devntA dns l fentre du projetF v onsole s90he lors @(gure PFPHAF oil 3 ous onnissez dsormis l9essentiel pour rer un nouveu projet gCC et le ompiler ve odeF QP

XCODE (MAC OS SEULEMENT)

Figure PFPH ! gompiltion sous ode

En rsum
! n shi est un outil toutEenEun destintion des dveloppeursD qui permet de rer des progrmmesF ! n shi est ompos d9un diteur de texteD d9un ompilteur et d9un debuggerF ! gode: :floksD isul gCC et ode sont prmi les shi les plus onnus pour proE grmmer en gCCF ! xous prendrons gode: :floks omme se dns l suite de e oursF

QQ

CHAPITRE 2.

LES LOGICIELS NCESSAIRES POUR PROGRAMMER

QR

Chapitre

3
Dicult :

Votre premier programme

ous avez appris en quoi consiste la programmation et ce qu'est le C++, vous avez install un IDE (le logiciel qui va vous permettre de programmer) et maintenant vous vous demandez : quand allons-nous commencer coder ? Bonne nouvelle : c'est maintenant ! Alors bien sr, ne vous mettez pas imaginer que vous allez tout d'un coup faire des choses folles. La 3D temps rel en rseau n'est pas vraiment au programme pour le moment ! la place, votre objectif dans ce chapitre est d'acher un message l'cran. Et vous allez voir. . . c'est dj du travail !

QS

CHAPITRE 3.

VOTRE PREMIER PROGRAMME

Le monde merveilleux de la console


und je vous nnone que nous llons ommener progrmmerD vous vous dites srement  Chouette, je vais pouvoir faire a, a et a ; et j'ai toujours rv de faire a aussi ! F sl est de mon devoir de lmer un peu vos rdeurs et de vous expliquer omment el v se psserF xous llons ommener douementF xous n9vons de toute fon ps le hoix r les proE grmmes omplexes Qh en rseu que vous imginez peutEtre nessitent de onntre les basesF sl fut svoir qu9il existe P types de progrmmes X les progrmmes grphiques et les progrmmes onsoleF

Les programmes graphiques


sl s9git des progrmmes qui 0hent des fentresF ge sont eux que vous onnissez srement le mieuxF sls gnrent l9rn des fentres que l9on peut ouvrirD rduireD fermerD grndirF F F ves progrmmeurs prlent de qs @(gure QFIAF
1

Figure QFI ! n progrmme qs @grphiqueA X ord


1.

Graphical User Interface - Interface Utilisateur Graphique

QT

LE MONDE MERVEILLEUX DE LA CONSOLE

Les programmes console


ves progrmmes en onsole sont plus frquents sous vinux que sous indows et w y F sls sont onstitus de simples textes qui s90hent l9rnD le plus souvent en ln sur fond noir @(gure QFPAF

Figure QFP ! n progrmme en onsole

ges progrmmes fontionnent u lvierF v souris n9est ps utiliseF sls s9exutent gnrlement linirement X les messges s90hent u fur et mesureD de hut en sF

Notre premire cible : les programmes console


ih ouiD j9imgine que vous l9vez vue venirD elleEl 3 te vous nnone que nous llons ommener pr rliser des progrmmes onsoleF in e'etD ien qu9ils soient un peu usE tres a prioriD es progrmmes sont euoup plus simples rer que les progrmmes grphiquesF our les dutnts que nous sommesD il fudr don d9ord en psser pr l 3 fien entenduD je sis que vous ne voudrez ps en rester lF ssurezEvous sur e point X je m9en voudris de m9rrter ux progrmmes onsole r je sis que euoup d9entre vous prfrerient rer des progrmmes grphiquesF gel tome ien X une prtie toute entire de e ours ser ddie l rtion de qs ve tD une sorte d9extension du gCC qui permet de rliser e type de progrmmes 3 wis vnt elD il v flloir retrousser ses mnhes et se mettre u trvilF elors u oulot 3 QU

CHAPITRE 3.

VOTRE PREMIER PROGRAMME

Cration et lancement d'un premier projet


eu hpitre prdentD vous vez instll un shiD e fmeux logiiel qui ontient tout e qu9il fut pour progrmmerF xous vons douvert qu9il existit plusieurs shi @gode: :floksD isul gCCD odeF F FAF te ne vous en i it que quelquesEuns prmi les plus onnus mis il y en ien d9utres 3 gomme je vous l9vis nnonD je trville essentiellement ve gode: :floksF wes explitions s9ttrderont don le plus souvent sur et shi mis je reviendri sur ses onurrents si nessireF reureusementD es logiiels se ressemlent euoup et emE ploient le mme voulireD don dns tous les s vous ne serez ps perdusF

Cration d'un projet


our ommener progrmmerD l premire tpe onsiste demnder son shi de rer un nouveu projetF g9est un peu omme si vous demndiez ord de vous rer un nouveu doumentF our elD pssez pr l suession de menus File b New b Project @(gure QFQAF

Figure QFQ ! xouveu projet gode: :floks

n ssistnt s9ouvreD nous l9vons vu u hpitre prdentF grez un nouveu proE grmme onsole gCC omme nous vons ppris le fireF l (n des tpes de l9ssistntD le projet est r et ontient un premier (hierF hployez l9roresene guhe pour voir pprtre le (hier main.cpp et fites un douleEli dessus pour l9ouvrirF ge (hier est notre premier ode soure et il est dj un peu rempli @(gure QFRA 3 gode: :floks vous r un premier progrmme trs simple qui 0he l9rn le mesE sge  rello world 3 @el signi(e quelque hose omme  fonjour tout le monde 3 AF
Il y a dj une dizaine de lignes de code source C++ et je n'y comprends rien !

yuiD el peut prtre un peu di0ile l premire fois mis nous llons voir ensemleD QV

CRATION ET LANCEMENT D'UN PREMIER PROJET

Figure QFR ! remier progrmme dns gode: :floks

QW

CHAPITRE 3.

VOTRE PREMIER PROGRAMME

un peu plus loinD e que signi(e e odeF

Lancement du programme
our le momentD j9imeris que vous fssiez une hose simple X essyez de ompiler et de lner e premier progrmmeF ous vous souvenez omment fire c sl y un outon  gompiler et exuter @Build and run AF ge outon se trouve dns l rre d9outils @(gure QFSAF
Figure QFS ! ves outons de ompiltion

v ompiltion se lne lorsF ous llez voir quelques messges s90her en s de l9shi @dns l setion Build logAF
Si la compilation ne fonctionne pas et que vous avez une erreur de ce type :  "My-program - Release" uses an invalid compiler. Skipping... Nothing to be done. , cela signie que vous avez tlcharg la version de Code: :Blocks sans mingw (le compilateur). Retournez sur le site de Code: :Blocks pour tlcharger la version avec mingw.

i tout v ienD une onsole pprt ve notre progrmme @(gure QFTAF

Figure QFT ! remier progrmme en onsole

ous voyez que le progrmme 0he el et ien  rello world 3 dns l onsole 3 x9estEe ps eu 3 c ous venez de ompiler votre tout premier progrmme 3 RH

EXPLICATIONS SUR CE PREMIER CODE SOURCE

Un chier excutable a t gnr sur votre disque dur. Sous Windows, c'est un chier .exe. Vous pouvez le retrouver dans un sous-dossier release (ou parfois debug), situ dans le dossier de votre projet. Au fait, que signie le message la n de la console :  Process
returned 0 (0x0) execution time : 0.004 s Press any key to continue.  ?

ehD onne question 3 ge messge n9 ps t rit pr votre progrmme mis pr votre shiF in l9ourreneD 9est gode: :floks qui 0he un messge pour signler que le progrmme s9est ien droul et le temps qu9 dur son exutionF ve ut de gode: :floks est ii surtout de  mintenir l onsole ouverteF in e'etD sous indows en prtiulierD ds qu9un progrmme onsole est terminD l fentre de l onsole se fermeF yrD le progrmme s9tnt exut ii en HFHHRsD vous n9uriez ps eu le temps de voir le messge s90her l9rn 3 gode: :floks vous invite don  ppuyer sur n9importe quelle touhe pour ontinuer D e qui ur pour e'et de fermer l onsoleF
Lorsque vous compilez et excutez un programme  console  comme celuici avec Visual C++, la console a tendance s'ouvrir et se refermer instantanment. Visual C++ ne maintient pas la console ouverte comme Code: :Blocks. Si vous utilisez Visual C++, la solution consiste ajouter la ligne system("PAUSE"); avant la ligne return 0; de votre programme.

Explications sur ce premier code source


vorsque gode: :floks re un nouveu projetD il gnre un (hier main.cpp ontennt e ode X
5inlude `iostremb using nmespe stdY int min@A { out `` 4rello world34 `` endlY return HY }

RI

CHAPITRE 3.

VOTRE PREMIER PROGRAMME

Tous les IDE proposent en gnral de dmarrer avec un code similaire. Cela permet de commencer programmer plus vite. Vous retrouverez les 3 premires lignes (include, using namespace et int main) dans quasiment tous vos programmes C++. Vous pouvez considrer que tous vos programmes commenceront par ces lignes.

ns trop entrer dns les dtils @r el pourrit devenir ompliqu pour un dut 3AD je vis vous prsenter quoi sert hune de es lignesF
include

v toute premire ligne est X


5inlude `iostremb

g9est e qu9on ppelle une directive de prprocesseurF on rle est de  hrger des fontionnlits du gCC pour que nous puissions e'etuer ertines tionsF in e'etD le C++ est un langage trs modulaireF he seD il ne sit ps fire grndEhose @ps mme 0her un messge l9rn 3AF yn doit don hrger des extensions que l9on ppelle bibliothques et qui nous o'rent de nouvelles possiilitsF siD on hrge le (hier iostreamD e qui nous permet d9utiliser une iliothqueF F F d9fE (hge de messges l9rn dns une onsole 3 uelque hose de vriment trs siqueD omme vous le voyezD mis qui nessite qund mme l9utilistion d9une iliothqueF
Appeler iostream nous permet en fait de faire un peu plus qu'acher des messages l'cran : on pourra aussi rcuprer ce que saisit l'utilisateur au clavier, comme nous le verrons plus tard. iostream signie  Input Output Stream , ce qui veut dire  Flux d'entre-sortie . Dans un ordinateur, l'entre correspond en gnral au clavier ou la souris, et la sortie l'cran. Inclure iostream nous permet donc en quelque sorte d'obtenir tout ce qu'il faut pour changer des informations avec l'utilisateur.

lus trdD nous douvrirons de nouvelles iliothques et il fudr e'etuer des inE lusions en hut des odes soure omme iiF r exempleD lorsque nous tudierons tD qui permet de rliser des progrmmes grphiques @qsAD on insrer une ligne omme elleEi X
5inlude `tb

xotez qu9on peut hrger utnt de iliothques que l9on veut l foisF
using namespace

v ligne X RP

EXPLICATIONS SUR CE PREMIER CODE SOURCE

using nmespe stdY

F F F permet en quelque sorte d9indiquer dns quel lot de fontionnlits notre (hier soure v ller pioherF i vous hrgez plusieurs iliothquesD hune v proposer de nomreuses fontionE nlitsF rfoisD ertines fontionnlits ont le mme nomF smginez une ommnde  e0herwessge qui s9ppellerit insi pour iostream mis ussi pour Qt 3 i vous hrgez les deux iliothques en mme temps et que vous ppelez  e0herwessge D l9ordinteur ne sur ps s9il doit 0her un messge en onsole ve iostream ou dns une fentre ve Qt 3 our viter e genre de prolmesD on r des namespaces @espes de nomsAD qui sont des sortes de dossiers nomsF v ligne using namespace std; indique que vous llez utiliser l9espe de noms std dns l suite de votre (hier de odeF get espe de noms est un des plus onnus r il orrespond l iliothque stndrd @stdAD une iliothque livre pr dfut ve le lngge gCC et dont iostream fit prtieF
int main()

g9est ii que ommene vriment le ur du progrmmeF ves progrmmesD vous le verrezD sont essentiellement onstitus de fontionsF ghque fontion un rle et peut ppeler d9utres fontions pour e'etuer ertines tionsF ous les progrmmes posE sdent une fontion dnomme  min D e qui signi(e  priniple F g9est don l fontion prinipleF ne fontion l forme suivnte X
2

int min@A { }

ves oldes dterminent le dut et l (n de l fontionF gomme vous le voyez dns le ode soure qui t gnr pr gode: :floksD il n9y rien prs l fontion mainF g9est norml X l (n de l fontion main le progrmme s9rrte 3 out progrmme ommene u dut de l fontion main et se termine l (n de elleEiF
Cela veut dire qu'on va crire tout notre programme dans la fonction main ?

xon 3 fien que e soit possileD e serit trs dlit grerD surtout pour de gros progrmmesF l pleD l fontion main ppelle d9utres fontions quiD leur tourD ppellent d9utres fontionsF frefD elle dlgue le trvilF gependntD dns un premier tempsD nous llons surtout trviller dns l fontion main r nos progrmmes resteront ssez simplesrF
2. Qui se prononce  mne  en anglais.

RQ

CHAPITRE 3.

VOTRE PREMIER PROGRAMME

cout

oii en(n l premire ligne qui fit quelque hose de onret 3 g9est l premire ligne de mainD don l premire tion qui ser exute pr l9ordinteur @les lignes que nous vons vues prdemment ne sont en fit que des prprtifs pour le progrmmeAF
out `` 4rello world34 `` endlY

ve rle de cout @ prononer  i oute A est d90her un messge l9rnF g9est e qu9on ppelle une instructionF ous nos progrmmes seront onstitus d9instrutions omme elleEiD qui donnent des ordres l9ordinteurF xotez que cout est fourni pr iostreamF i vous n9inluez ps iostream u dut de votre progrmmeD le ompilteur se plindr de ne ps onntre cout et vous ne pourrez ps gnrer votre progrmme 3
Notez bien : chaque instruction se termine par un point-virgule ! C'est d'ailleurs ce qui vous permet de direncier les instructions du reste. Si vous oubliez le point-virgule, la compilation ne fonctionnera pas et votre programme ne pourra pas tre cr !

sl y Q lments sur ette ligne X ! cout X ommnde l90hge d9un messge l9rn Y ! "Hello world!" X indique le messge 0her Y ! endl X re un retour l ligne dns l onsoleF sl est possile de ominer plusieurs messges en une instrutionF r exemple X
out `` 4fonjour tout le monde 34 `` endl `` 4gomment llezEvous c4 `` endlY

F F F 0he es deux phrses sur deux lignes di'rentesF issyez e odeD vous verrez 3
Sous Windows, les caractres accentus s'achent mal (essayez d'acher  Bonjour Grard  pour voir !). C'est un problme de la console de Windows (problme qu'on peut retrouver plus rarement sous Mac OS X et Linux). Il existe des moyens de le rgler mais aucun n'est vraiment satisfaisant. la place, je vous recommande plutt d'viter les accents dans les programmes console sous Windows. Rassurez-vous : les GUI que nous crerons plus tard avec Qt n'auront pas ce problme !
return

v dernire ligne est X


return HY

RR

COMMENTEZ VOS PROGRAMMES !

ge type d9instrution lt gnrlement les fontionsF in fitD l pluprt des fontions renvoient une vleur @un nomre pr exempleAF siD l fontion main renvoie H pour indiquer que tout s9est ien pss @toute vleur di'rente de H urit indiqu un proE lmeAF ous n9vez ps esoin de modi(er ette ligneD lissezEl telle quelleF xous urons d9utres osions d9utiliser return pour d9utres fontionsD nous en reprlerons 3

Commentez vos programmes !


in plus du ode qui donne des instrutions l9ordinteurD vous pouvez rire des ommentires pour expliquer le fontionnement de votre progrmmeF ves ommentires n9ont uun impt sur le fontionnement de votre logiiel X en fitD le ompilteur ne les lit mme ps et ils n9pprissent ps dns le progrmme gnrF ourtntD es ommentires sont indispensles pour les dveloppeurs X ils leur permettent d9expliquer e qu9ils font dns leur ode 3 hs que vos progrmmes vont devenir un petit peu omplexes @et royezEmoiD el ne trder psAD vous risquez d9voir du ml vous souvenir de leur fontionnement quelque temps prs voir rit le ode soureF he plusD si vous envoyez votre ode un miD il ur des di0ults pour omprendre e que vous vez essy de fire juste en lisnt le ode soureF g9est l que les ommentires entrent en jeu 3

Les dirents types de commentaires


sl y deux fons d9rire des ommentires selon leur longueurF te vis vous les prsenter toutes les deuxF
Les commentaires courts

our rire un ommentire ourtD sur une seule ligneD il su0t de ommener pr // puis d9rire votre ommentireF gel donne X
GG gei est un ommentire

wieuxD vous pouvez ussi jouter le ommentire l (n d9une ligne de ode pour expliquer e qu9elle fit X
out `` 4rello world34 `` endlY GG effihe un messge l9rn

Les commentaires longs

i votre ommentire tient sur plusieurs lignesD ouvrez l zone de ommentire ve /* et fermezEl ve */ X RS

CHAPITRE 3.

VOTRE PREMIER PROGRAMME

GB ve ode qui suit est un peu omplexe lors je prends mon temps pour l9expliquer pre que je sis que sinonD dns quelques seminesD j9uri tout ouli et je seri perdu pour le modifier BG

in gnrlD on n9rit ps un romn dns les ommentires non plusF F F suf si l sitution le justi(e vrimentF

Commentons notre code source !


eprenons le ode soure que nous vons tudi dns e hpitre et ompltonsEle de quelques ommentires pour nous souvenir de e qu9il fitF
5inlude `iostremb GG snlut l iliothque iostrem @ffihge de texteA using nmespe stdY GG sndique quel espe de noms on v utiliser GB pontion priniple 4min4 ous les progrmmes ommenent pr l fontion min BG int min@A { out `` 4rello world34 `` endlY GG effihe un messge return HY GG ermine l fontion min et don le progrmme }

i vous lnez e progrmmeD vous ne verrez uune nouveutF ves ommentires sontD omme je vous le disisD purement ignors pr le ompilteurF
J'ai volontairement comment chaque ligne de code ici mais, dans la pratique il ne faut pas non plus commenter tout-va. Si une ligne de code fait quelque chose de vraiment vident, inutile de la commenter. En fait, les commentaires sont plus utiles pour expliquer le fonctionnement d'une srie d'instructions plutt que chaque instruction une une.

En rsum
! yn distingue deux types de progrmmes X les progrmmes grphiques @qsA et les progrmmes onsoleF ! sl est plus simple de rliser des progrmmes onsole pour ommenerD 9est don e type de progrmme que nous tudierons en premierF ! n progrmme possde toujours une fontion main() X 9est son point de dmrrgeF ! v diretive cout permet d90her du texte dns une onsoleF RT

COMMENTEZ VOS PROGRAMMES !

! yn peut jouter des ommentires dns son ode soure pour expliquer son fonE tionnementF sls prennent l forme // Commentaire ou /* Commentaire */F

RU

CHAPITRE 3.

VOTRE PREMIER PROGRAMME

RV

Chapitre

4
Dicult :

Utiliser la mmoire

usqu' prsent, vous avez dcouvert comment crer et compiler vos premiers programmes en mode console. Pour l'instant ces programmes sont trs simples. Ils afchent des messages l'cran. . . et c'est peu prs tout. Cela est principalement d au fait que vos programmes ne savent pas interagir avec leurs utilisateurs. C'est ce que nous allons apprendre faire dans le chapitre suivant. Mais avant cela, il va nous falloir travailler dur puisque je vais vous prsenter une notion fondamentale en informatique. Nous allons parler des variables. Les variables permettent d'utiliser la mmoire de l'ordinateur an de stocker une information pour pouvoir la rutiliser plus tard. J'imagine que vous avez tous dj eu une calculatrice entre les mains. Sur ces outils, il y a gnralement des touches M+ , M- , MC , etc. qui permettent de stocker dans la mmoire de la calculatrice le rsultat intermdiaire d'un calcul et de reprendre ce nombre plus tard. Nous allons apprendre faire la mme chose avec votre ordinateur qui n'est, aprs tout, qu'une grosse machine calculer.

RW

CHAPITRE 4.

UTILISER LA MMOIRE

Qu'est-ce qu'une variable ?


te vous i donn l9exemple de l mmoire de l lultrie preD que dns le monde de l9informtiqueD le prinipe de se est le mmeF sl y quelque prt dns votre ordinteur des omposnts letroniques qui sont ples de ontenir une vleur et de l onserver pendnt un ertin tempsF v mnire dont tout el fontionne extement est trs omplexeF te vous rssure tout de suiteD nous n9vons solument ps esoin de omprendre omment el mrhe pour pouvoirD nous ussiD mettre des vleurs dns l mmoire de l9ordinteurF oute l prtie omplique ser gre pr le ompilteur et le systme d9exploittionF ille n9est ps elle l vie c v seule et unique hose que vous yez esoin de svoirD 9est qu9une variable est une prtie de l mmoire que l9ordinteur nous prte pour y mettre des vleursF smginez que l9ordinteur possde dns ses entrilles une grnde rmoire @(gure RFIAF gette dernire possde des milliers @des millirds 3A de petits tiroirs Y e sont des endroits que nous llons pouvoir utiliser pour mettre nos vrilesF

Figure RFI ! v mmoire d9un ordinteur fontionne omme une grosse rmoire ve euoup de tiroirs

hns le s d9une lultrie toute simpleD on ne peut gnrlement stoker qu9un seul nomre l foisF ous vous doutez ien queD dns le s d9un progrmmeD il v flloir onserver plus d9une hose simultnmentF sl fut don un moyen de di'renier les vriles pour pouvoir y der pr l suiteF ghque vrile possde don un nomF g9est en quelque sorte l9tiquette qui est olle sur le tiroirF v9utre hose qui distingue l lultrie de l9ordinteurD 9est que nous imerions pouvoir stoker des ts de hoses di'rentesD des nomresD des lettresD des phrsesD des imgesD etF g9est e qu9on ppelle le type d9une vrileF ous pouvez vous imginez el omme tnt l forme du tiroirF in e'etD on n9utilise ps les mmes tiroirs pour stoker des outeilles ou des livresF SH

QU'EST-CE QU'UNE VARIABLE ?

Les noms de variables

gommenons pr l question du nom des vrilesF in gCCD il y quelques rgles qui rgissent les di'rents noms utoriss ou interditsF ! les noms de vriles sont onstitus de lettresD de hi'res et du tiretEs uniqueE ment Y ! le premier rtre doit tre une lettre @mjusule ou minusuleA Y ! on ne peut ps utiliser d9ents Y ! on ne peut ps utiliser d9espes dns le nomF ve mieux est enore de vous donner quelques exemplesF ves noms ageZeroD nom_du_zero ou enore NOMBRE_ZEROS sont tous des noms vlidesF AgeZro et _nomzeroD en revnheD ne le sont psF el s9joute une rgle supplmentireD vlle pour tout e que l9on rit en gCC et ps seulement pour les vrilesF ve lngge fit l di'rene entre les mjusules et les minusulesF in termes tehniquesD on dit que gCC est sensible la casseF honD nomZeroD nomzeroD NOMZERO et NomZeRo sont tous des noms de vriles di'rentsF
Pour des questions de lisibilit, il est important d'utiliser des noms de variables qui dcrivent bien ce qu'elles contiennent. On prfrera donc choisir comme nom de variable ageUtilisateur plutt que maVar ou variable1. Pour le compilateur, cela ne fait aucune dirence. Mais, pour vous et pour les gens qui travailleront avec vous sur le mme programme, c'est trs important.

ersonnellementD j9utilise une  onvention prtge pr euoup de progrmmeursF hns tous les gros projets regroupnt des milliers de progrmmeursD on trouve des rgles trs strites et prfois di0iles suivreF gelles que je vous propose ii permettent de grder une onne lisiilit et surtoutD elles vous permettront de ien omprendre tous les exemples dns l suite de e oursF ! les noms de vriles ommenent pr une minusule Y ! si le nom se dompose en plusieurs motsD euxEi sont olls les uns ux utres Y ! hque nouveu mot @exept le premierA ommene pr une mjusuleF oyons el ve des exemplesF renons le s d9une vrile ense ontenir l9ge de l9utilisteur du progrmmeF ! AgeUtilisateur X nonD r l premire lettre est une mjusule Y ! age_utilisateur X nonD r les mots ne sont ps olls Y ! ageutilisateur X nonD r le deuxime mot ne ommene ps pr une mjusule Y ! maVar X nonD r le nom ne drit ps e que ontient l vrile Y ! ageUtilisateur X okF te vous onseille fortement d9dopter l mme onventionF endre son ode lisile et filement omprhensile pr d9utres progrmmeurs est trs importntF SI

CHAPITRE 4.

UTILISER LA MMOIRE

Les types de variables


eprenonsF xous vons ppris qu9une vrile un nom et un typeF xous svons omment nommer nos vrilesD voyons mintennt leurs di'rents typesF v9ordinteur ime svoir e qu9il dns s mmoireD il fut don indiquer quel type d9lment v ontenir l vrile que nous imerions utiliserF istEe un nomreD un motD une lettre c sl fut le spi(erF oii don l liste des types de vriles que l9on peut utiliser en gCCF
Nom du type Ce qu'il peut contenir
bool char int unsigned int double string

ne vleur prmi deux possilesD vri @trueA ou fux @falseAF n rtreF n nomre entierF n nomre entier positif ou nulF n nomre virguleF ne hne de rtresD 9estEEdire un mot ou une phrseF

i vous tpez un de es noms de types dns votre shiD vous devriez voir le mot se olorerF v9shi l9 reonnuD 9est ien l preuve que je ne vous ronte ps des sldesF ve s de string est di'rentD nous verrons plus loin pourquoiF te peux vous ssurer qu9on v euoup en reprlerF
Ces types ont des limites de validit, des bornes, c'est--dire qu'il y a des nombres qui sont trop grands pour un int par exemple. Ces bornes dpendent de votre ordinateur, de votre systme d'exploitation et de votre compilateur. Sachez simplement que ces limites sont bien assez grandes pour la plupart des utilisations courantes. Cela ne devrait donc pas vous poser de problme, moins que vous ne vouliez crer des programmes pour tlphones portables ou pour des micro-contrleurs, qui ont parfois des bornes plus basses que les ordinateurs. Il existe galement d'autres types avec d'autres limites mais ils sont utiliss plus rarement.

und on esoin d9une vrileD il fut don se poser l question du genre de hoses qu9elle v ontenirF i vous vez esoin d9une vrile pour stoker le nomre de perE sonnes qui utilisent votre progrmmeD lors utilisez un int ou unsigned intD Y pour stoker le poids d9un gigotD on utiliser un double et pour onserver en mmoire le nom de votre meilleur miD on hoisir une hne de rtres stringF
Mais quoi sert le type bool ? Je n'en ai jamais entendu parler.

g9est e qu9on ppelle un boolenD 9estEEdire une vrile qui ne peut prendre que deux vleursD vri @true en nglisA ou fux @false en nglisAF yn les utilise pr exemple pour stoker des informtions indiqunt si l lumire est llumeD si l9utilisteur SP

DCLARER UNE V ARIABLE

le droit d9utiliser une fontionnlit donneD ou enore si le mot de psse est orretF i vous vez esoin de onserver le rsultt d9une question de e genreD lors pensez e type de vrileF

Dclarer une variable


essez prlD il est temps d9entrer dns le vif du sujet et de demnder l9ordinteur de nous prter un de ses tiroirsF in termes tehniquesD on prle de dclaration de variableF sl nous fut indiquer l9ordinteur le type de l vrile que nous voulonsD son nom et en(n s vleurF our e fireD 9est trs simple X on indique les hoses extement dns l9ordre prsent l (gure RFPF
Figure RFP ! yntxe d9initilistion d9une vrile en gCC

yn peut ussi utiliser l mme syntxe que dns le lngge g @(gure RFQAF
Figure RFQ ! yntxe d9initilistion d9une vrileD hrite du g

ves deux versions sont strictement quivalentesF te vous onseille ependnt d9utiliser l premire pour des risons qui deviendront lires plus trdF v deuxime version ne ser ps utilise dns l suite du oursD je vous l9i prsente ii pour que vous puissiez omprendre les nomreux exemples que l9on peut trouver sur le we et qui utilisent ette version de l dlrtion d9une vrileF
N'oubliez pas le point-virgule (;) la n de la ligne ! C'est le genre de choses que l'on oublie trs facilement et le compilateur n'aime pas cela du tout.

eprenons le moreu de ode miniml et joutonsEy une vrile pour stoker l9ge de l9utilisteurF
5inlude `iostremb using nmespe stdY int min@A { int getilisteur@ITAY return HY }

SQ

CHAPITRE 4.

UTILISER LA MMOIRE

ue se psseEtEil l ligne T de e progrmme c v9ordinteur voit que l9on imerit lui emprunter un tiroir dns s mmoire ve les proprits suivntes X ! il peut ontenir des nomres entiers Y ! il une tiquette indiqunt qu9il s9ppelle ageUtilisateur Y ! il ontient l vleur ITF prtir de ette ligneD vous tes don l9heureux possesseur d9un tiroir dns l mmoire de l9ordinteur @(gure RFRAF

Figure RFR ! n tiroir dns l mmoire de l9ordinteur ontennt le hi're IT

gomme nous llons voir esoin de euoup de tiroirs dns l suite du oursD je vous propose d9utiliser des shms un peu plus simples @(gure RFSAF yn v euoup les utiliser pr l suiteD il est don ien de s9y hituer ttF

Figure RFS ! hm de l9tt de l mmoire prs l dlrtion d9une vrile

te vis vous drire e qu9on voit sur le shmF ve gros retngle leu reprsente l mmoire de l9ordinteurF our l9instntD elle est presque videF ve rr june est l zone de mmoire que l9ordinteur nous prteF g9est l9quivlent de notre tiroirF sl ontientD omme vntD le nomre IT et on peut lire le nom ageUtilisateur sur l9tiquette qui y est roheF te ne suis ps on en dessinD don il fut un peu d9imgintionD mis le prinipe est lF SR

DCLARER UNE V ARIABLE

xe nous rrtons ps en si on heminF hlrons d9utres vrilesF


5inlude `iostremb using nmespe stdY int min@A { int getilisteur@ITAY int nomreemis@RQPAY doule pi@QFIRISWAY ool estwonemi@trueAY hr lettre@99AY } return HY GGget utilisteur estEil mon mi c

GGve nomre d9mis de l9utilisteur

sl y deux hoses importntes remrquer iiF v premire est que les vriles de type bool ne peuvent voir pour vleur que true ou falseD 9est don une de es deux vleurs qu9il fut mettre entre les prenthsesF ve deuxime point soulignerD 9est queD pour le type charD il fut mettre l lettre souhite entre postrophesF sl fut rire char lettre('a'); et ps char lettre(a);F g9est une erreur que tout le monde fitD moi le premierF
Il est toujours bien de mettre un commentaire pour expliquer quoi va servir la variable.

te peux don omplter mon shm en lui joutnt nos nouvelles vriles @(gure RFTAF ous pouvez videmment ompiler et tester le progrmme iEdessusF ous onstterez qu9il ne fit stritement rienF t9espre que vous n9tes ps trop dusF sl se psse en rlit normment de hoses misD omme je vous l9i dit u dutD es oprtions sont hes et ne nous intressent ps vrimentF in voii qund mme un rsum hronologiqueF IF votre progrmme demnde u systme d9exploittion de lui fournir un peu de mmoire Y PF l9y regrde s9il en enore disposition et indique u progrmme quel tiroir utiliser Y QF le progrmme rit l vleur IT dns l se mmoire Y RF il reommene ensuite pour les qutre utres vriles Y
1

1. Operating System ou, en franais, systme d'exploitation.

SS

CHAPITRE 4.

UTILISER LA MMOIRE

Figure RFT ! hm de l9tt de l mmoire prs plusieurs dlrtions

SF en rrivnt l dernire ligneD le progrmme vide ses tiroirs et les rend l9ordiE nteurF it tout el sns que rien ne se psse du tout l9rn 3 g9est normlD on n9 nulle prt indiqu qu9on voulit 0her quelque hoseF

Le cas des strings


ves hnes de rtres sont un petit peu plus omplexes dlrer mis rien d9inE surmontleD je vous rssureF v premire hose fire est d9jouter une petite ligne u dut de votre progrmmeF sl futD en e'etD indiquer u ompilteur que nous souE hitons utiliser des stringsF ns elD il n9inlurit ps les outils nessires leur gestionF v ligne jouter est #include <string>F oii e que el donneF
5inlude `iostremb 5inlude `stringb using nmespe stdY int min@A {

ST

DCLARER SANS INITIALISER

string nomtilisteur@4elert iinstein4AY return HY

v9utre di'rene se situe u niveu de l dlrtion elleEmmeF gomme vous l9vez ertinement onsttD j9i pl des guillemets utour de l vleurF n peu omme pour les char misD ette foisD e sont des guillemets doules @"A et ps juste des postrophes @'AF h9illeurs votre shi devrit olorier les mots "Albert Einstein" d9une ouleur di'rente du 'a' de l9exemple prdentF gonfondre ' et " est une erreurD l enoreD trs ournte qui fer hurler de douleur votre ompilteurF wis ne vous en fites ps pour luiD il en vu d9utresF

Une astuce pour gagner de la place


evnt de psser l suiteD il fut que je vous prsente une petite stue utilise pr ertins progrmmeursF i vous vez plusieurs vriles du mme type dlrerD vous pouvez le fire sur une seule ligne en les sprnt pr une virgule @,AF oii omment X
int @PAD@RAD@EIAY GGyn dlre trois ses mmoires nommes D et et qui ontiennent respetivement les vleurs PD R et EI string prenom@4elert4AD nom@4iinstein4AY GGyn dlre deux ses pouvnt ontenir des hnes de rtres

peut tre prtique qund on esoin de euoup de vriles d9un oupF yn onomise l rptition du type hque vrileF wis je vous donseille qund mme de trop user de ette stue X le progrmme devient moins lisile et moins omprhensileF

Dclarer sans initialiser


wintennt que nous vons vu le prinipe gnrlD il est temps de plonger un petit peu plus dns les dtilsF vors de l dlrtion d9une vrileD votre progrmme e'etue en rlit deux oprE tions suessivesF IF sl demnde l9ordinteur de lui fournir une zone de stokge dns l mmoireF yn prle llors d9allocation de l vrileF PF sl remplit ette se ve l vleur fournieF yn prle lors d9initialisation de l vrileF ges deux tpes s9e'etuent utomtiquement et sns que l9on it esoin de rien fireF oil pour l prtie voulire de e hpitreF SU

CHAPITRE 4.

UTILISER LA MMOIRE

sl rrive prfois que l9on ne she ps quelle vleur donner une vrile lors de s dlrtionF sl est lors possile d9e'etuer uniquement l9llotion sns l9initilistionF sl su0t d9indiquer le type et le nom de l vrile sns spi(er de vleur @(gure RFUAF
Figure RFU ! hlrtion d9une vrile sns initilistion

it sous forme de ode gCC ompletD voil e que el donne X


5inlude `iostremb 5inlude `stringb using nmespe stdY int min@A { string nomtoueurY int nomretoueursY ool qgneY } return HY

GGve joueur EtEil ggn c

Une erreur courante est de mettre des parenthses vides aprs le nom de la variable, comme ceci : int nombreJoueurs(). C'est incorrect, il ne faut pas mettre de parenthses, juste le type et le nom.

imple non c te svis que el llit vous plireF it je vous o're mme un shm en onus @(gure RFVA 3 yn ien trois ses dns l mmoire et les trois tiquettes orrespondntesF v hose nouvelle est que l9on ne sit ps e que ontiennent es trois sesF xous verrons dns le hpitre suivnt omment modi(er le ontenu d9une vrile et don rempler es points d9interrogtion pr d9utres vleurs plus intressntesF
Je viens de vous montrer comment dclarer des variables sans leur donner de valeur initiale. Je vous conseille par contre de toujours initialiser vos variables. Ce que je vous ai montr l n'est utiliser que dans les cas o l'on ne sait vraiment pas quoi mettre comme valeur, ce qui est trs rare.

sl est temps d9pprendre e'etuer quelques oprtions ve nos vriles pre que vous en onviendrezD pour l9instntD on n9 ps ppris grnd hose d9utileF xotre rn est rest dsesprment videF SV

AFFICHER LA V ALEUR D'UNE VARIABLE

Figure RFV ! v mmoire prs voir llou Q vriles sns les initiliser

Acher la valeur d'une variable


eu hpitre prdentD vous vez ppris 0her du texte l9rnF t9espre que vous vous souvenez enore de e qu9il fut fireF yuiD 9est ien elF sl fut utiliser cout et les hevrons @AF rfitF in e'etD pour 0her le ontenu d9une vrileD 9est l mme hoseF l ple du texte 0herD on met simplement le nom de l vrileF
out `` getilisteurY

pile non c renons un exemple omplet pour essyerF


5inlude `iostremb using nmespe stdY int min@A { int getilisteur@ITAY out `` 4otre ge est X 4Y out `` getilisteurY return HY }

SW

CHAPITRE 4.

UTILISER LA MMOIRE

ne fois ompilD e ode 0he ei l9rn X


otre ge est X IT

ixtement e que l9on voulit 3 yn peut mme fire enore plus simple X tout mettre sur une seule ligne 3 it on peut mme jouter un retour l ligne l (nF
Pensez mettre un espace la n du texte. Ainsi, la valeur de votre variable sera dtache du texte lors de l'achage.
5inlude `iostremb using nmespe stdY int min@A { int getilisteur@ITAY out `` 4otre ge est X 4 `` getilisteur `` endlY return HY }

it on peut mme 0her le ontenu de plusieurs vriles l foisF


5inlude `iostremb 5inlude `stringb using nmespe stdY int min@A { int qitilisteur@ISHAY string nomtilisteur@4elert iinstein4AY out `` 4ous vous ppelez 4 `` nomtilisteur `` 4 et votre s vut 4 `` qitilisteur `` endlY return HY }

ge qui 0he le rsultt esomptF


ous vous ppelez elert iinstein et votre s vut ISH

wis je pense que vous n9en doutiez ps vrimentF xous verrons u prohin hpitre omment fire le ontrireD 9estEEdire ruprer l sisie d9un utilisteur et l stoker dns une vrileF TH

LES RFRENCES

Les rfrences
evnt de terminer e hpitreD il nous reste une notion importnte voirF sl s9git des rfrencesF te vous i expliqu u tout dut de e hpitre qu9une vrile pouvit tre onsidre omme une se mmoire ve une tiquette portnt son nomF hns l vrie vieD on peut trs ien mettre plusieurs tiquettes sur un ojet donnF in gCCD 9est l mme hoseD on peut oller une deuxime @troisimeD diximeD etFA tiquette une se mmoireF yn otient lors un deuxime moyen d9der l mme se mmoireF n petit peu omme si on donnit un surnom une vrile en plus de son nom normlF yn prle prfois d9aliasD mis le mot orret en gCC est rfrenceF hmtiquementD on peut se reprsenter une rfrene omme l (gure RFWF

Figure RFW ! ne vrile et une rfrene sur ette vrile

yn une seule se mmoire mis deux tiquettes qui lui sont rohesF eu niveu du odeD on utilise une esperluette @&A pour dlrer une rfrene sur une vrileF oyons el ve un petit exempleF
int getilisteur@ITAY GGhlrtion d9une vrileF

int8 mrile@getilisteurAY GGhlrtion d9une rfrene nomme mrile qui est rohe l vrile getilisteur

e l ligne ID on dlre une se mmoire nomme ageUtilisateur dns lquelle on met le nomre ITF it l ligne QD on rohe une deuxime tiquette ette se mmoireF yn don dornvnt deux moyens d9der u mme espe dns l mmoire de notre ordinteurF yn dit que maVariable fait rfrence ageUtilisateurF TI

CHAPITRE 4.

UTILISER LA MMOIRE

La rfrence doit imprativement tre du mme type que la variable laquelle elle est accroche ! Un int& ne peut faire rfrence qu' un int, de mme qu'un string& ne peut tre associ qu' une variable de type string.

issyons pour voirF yn peut 0her l9ge de l9utilisteur omme d9hitude et via une rfreneF
5inlude `iostremb using nmespe stdY int min@A { int getilisteur@IVAY GGne vrile pour ontenir l9ge de l9utilisteur int8 meferene@getilisteurAY GGit une rfrene sur l vrile 9getilisteur9 GGyn peut utiliser prtir d9ii GG9getilisteur9 ou 9meferene9 indistintement GGuisque e sont deux tiquettes de l mme se en mmoire out `` 4ous vez 4 `` getilisteur `` 4 GGyn ffiheD de l mnire hituelle nsF @vi vrileA4 `` endlY

out `` 4ous vez 4 `` meferene `` 4 nsF @vi refereneA4 `` endlY GGit on ffihe en utilisnt l rfrene } return HY

ge qui donne videmment le rsultt esomptF


ous vez IV nsF @vi vrileA ous vez IV nsF @vi refereneA

ne fois qu9elle t dlreD on peut mnipuler l rfrene omme si on mnipulit l vrile elleEmmeF sl n9y aucune dirence entre les deuxF
Euh. . . Mais quoi est-ce que cela peut bien servir ?

fonne question 3 g9est vri queD dns l9exemple que je vous i donnD on peut trs ien s9en psserF wis imginez que l9on it esoin de ette vrile dns deux prties trs di'rentes du progrmmeD des prties res pr di'rents progrmmeursF hns une des prtiesD un des progrmmeurs v s9ouper de l dlrtion de l vrile lors que l9utre progrmmeur v juste l90herF ge deuxime progrmmeur ur juste esoin TP

LES RFRENCES

d9un s l vrile et un lis ser don su0sntF our l9instntD el vous prt trs strit et inutile c sl fut juste svoir que 9est un des lments importnts du gCC qui pprtr de trs nomreuses reprises dns e oursF sl est don essentiel de se fmiliriser ve l notion vnt de devoir l9utiliser dns des s plus ompliqusF

En rsum
! ne vrile est une informtion stoke en mmoireF ! sl existe di'rents types de vriles en fontion de l nture de l9informtion stoker X intD charD boolF F F ! ne vrile doit tre dlre vnt utilistionF ixemple X int ageUtilisateur(16); ! v vleur d9une vrile peut tre 0he tout moment ve coutF ! ves rfrenes sont des tiquettes qui permettent d9ppeler une vrile pr un utre nomF ixemple X int& maReference(ageUtilisateur);

TQ

CHAPITRE 4.

UTILISER LA MMOIRE

TR

Chapitre

5
Dicult :

Une vraie calculatrice

'ai commenc vous parler de variables au chapitre prcdent en vous prsentant la mmoire d'une calculatrice. Un ordinateur tant une super-super-super-calculatrice, on doit pouvoir lui faire faire des calculs et pas uniquement sauvegarder des donnes. J'espre que cela vous intresse, parce que c'est ce que je vais vous apprendre faire. Nous allons commencer en douceur avec la premire tche qu'on eectue sur une calculette. Vous voyez de quoi je veux parler ? Oui c'est cela, crire des nombres pour les mettre dans la machine. Nous allons donc voir comment demander des informations l'utilisateur et comment les stocker dans la mmoire. Nous aurons donc besoin de. . . variables ! Dans un deuxime temps, je vais vous prsenter comment eectuer de petits calculs. Finalement, comme vous savez dj comment acher un rsultat, vous pourrez mettre tout votre savoir en action avec un petit exercice.

TS

CHAPITRE 5.

UNE VRAIE CALCULATRICE

Demander des informations l'utilisateur


eu hpitre prdentD je vous i expliqu omment 0her des vriles dns l onsoleF oyons mintennt omment fire le ontrireD 9estEEdire demnder des inE formtions l9utilisteur pour les stoker dns l mmoireF

Lecture depuis la console


ous l9urez remrquD le gCC utilise euoup de mots tirs de l9nglisF g9est noE tmment le s pour le )ux sortnt coutD qui doit se lire  Eout F ge qui est ienD 9est qu9on peut immditement en dduire le nom du )ux entrntF eve coutD les donnes sortent du progrmmeD d9o l9lment outF ve ontrire de out en nglis tnt inD qui signi(e  vers l9intrieur D on utilise cin pour fire entrer des informtions dns le progrmmeF cin se dompose ussi sous l forme  Ein et se pronone  siEinne F g9est importnt pour les soires entre progrmmeursF ge n9est ps tout 3 essois coutD il y vit les hevrons @AF hns le s de cinD il y en ussiD mis dans l'autre sens @AF oyons e que el donne ve un premier exempleF
5inlude `iostremb using nmespe stdY int min@A { out `` 4uel ge vezEvous c4 `` endlY int getilisteur@HAY GGyn prepre une se mmoire pour stoker un entier in bb getilisteurY GGyn fit entrer un nomre dns ette se out `` 4ous vez 4 `` getilisteur `` 4 ns 34 `` l9ffihe } return HY endlY GGit on

te vous invite tester e progrmmeF oii e que el donne ve mon ge X


uel ge vezEvous c PQ ous vez PQ ns 3

Que s'est-il pass exactement ?

TT

DEMANDER DES INFORMATIONS L'UTILISATEUR

ve progrmme 0h le texte Quel age avez-vous ?F tusqueElD rien de ien sorierF uisD omme on l9 vu prdemmentD l ligne VD le progrmme demnde l9ordinteur une se mmoire pour stoker un int et il ptise ette se ageUtilisateurF insuiteD el devient vriment intressntF v9ordinteur 0he un urseur ln lignotnt et ttend que l9utilisteur rive quelque hoseF und eluiEi termin et ppuy sur l touhe Entre de son lvierD le progrmme prend e qui t rit et le ple dns l se mmoire ageUtilisateur la place du H qui s9y trouvitF pinlementD on retome sur quelque hose de onnuD puisque le progrmme 0he une petite phrse et le ontenu de l vrileF

Une astuce pour les chevrons


sl rrive souvent que l9on se trompe dns le sens des hevronsF ous ne seriez ps les premiers rire cout  ou cin D e qui est fuxF our se souvenir du sens orretD je vous onseille de onsidrer les hevrons omme si 9tient des )hes indiqunt l diretion dns lquelle les donnes se dplentF hepuis l vrile vers cout ou depuis cin vers votre vrileF ve mieux est de prendre un petit shm mgique @(gure SFIAF

Figure SFI ! hm mnmotehnique indiqunt le sens utiliser pour les hevrons

und on 0he l vleur d9une vrileD les donnes sortent du progrmmeD on utilise don une )he llnt de l vrile vers coutF und on demnde une informtion l9utilisteurD 9est le ontrireD l vleur vient de cin et v dns l vrileF eve elD plus moyen de se tromper 3 TU

CHAPITRE 5.

UNE VRAIE CALCULATRICE

D'autres variables
videmmentD e que je vous i prsent mrhe ussi ve d9utres types de vrilesF oyons el ve un petit exempleF
5inlude `iostremb 5inlude `stringb using nmespe stdY int min@A { out `` 4uel est votre prenom c4 `` endlY string nomtilisteur@4ns nom4AY GGyn re une se mmoire pour ontenir une hine de rtres in bb nomtilisteurY GGyn remplit ette se ve e qu9rit l9utilisteur out `` 4gomien vut pi c4 `` endlY doule pitilisteur@EIFAY GGyn re une se mmoire pour stoker un nomre rel in bb pitilisteurY GGit on remplit ette se ve e qu9rit l9utilisteur out `` 4ous vous ppelez 4 `` nomtilisteur `` 4 et vous pensez que pi vut 4 `` pitilisteur `` 4F4 `` endlY } return HY

te rois que je n9i mme ps esoin de donner d9explitionsF te vous invite nnmoins tester pour ien omprendre en dtil e qui se psseF

Le problme des espaces


evezEvous test le ode prdent en mettnt vos nom et prnom c egrdons e que el donneF
uel est votre prenom c elert iinstein gomien vut pi c ous vous ppelez elert et vous pensez que pi vut HF

g9est un prolme d9espesF und on ppuie sur l touhe Entre D l9ordinteur oE TV

L'ordinateur n'a rien demand pour pi et le nom de famille a disparu ! Que s'est-il pass ?

DEMANDER DES INFORMATIONS L'UTILISATEUR

pie e qui t rit pr l9utilisteur dns l se mmoireF wis il s9rrte u premier espace ou retour la ligneF und il s9git d9un nomreD el ne pose ps de proE lme puisqu9il n9y ps d9espe dns les nomresF our les stringD l question se poseF sl peut trs ien y voir un espe dns une hne de rtresF it don l9orE dinteur v ouper u muvis endroitD 9estEEdire prs le premier motF it omme il n9est ps trs mlinD il v roire que le nom de fmille orrespond l vleur de pi 3 in fitD il fudrit pouvoir ruprer toute l ligne plutt que seulement le premier motF it si je vous le proposeD 9est qu9il y une solution pour le fire 3 sl fut utiliser l fonction getline()F xous verrons plus loin e que sont extement les fontions misD pour l9instntD voyons omment fire dns e s prtiulierF sl fut rempler l ligne cin  nomUtilisateur; pr un getline()F
5inlude `iostremb 5inlude `stringb using nmespe stdY int min@A { out `` 4uel est votre nom c4 `` endlY string nomtilisteur@4ns nom4AY GGyn re une se mmoire pour ontenir une hine de rtres getline@inD nomtilisteurAY GGyn remplit ette se ve toute l ligne que l9utilisteur rit out `` 4gomien vut pi c4 `` endlY doule pitilisteur@EIFAY GGyn re une se mmoire pour stoker un nomre rel in bb pitilisteurY GGit on remplit ette se ve e qu9rit l9utilisteur out `` 4ous vous ppelez 4 `` nomtilisteur `` 4 et vous pensez que pi vut 4 `` pitilisteur `` 4F4 `` endlY } return HY

yn retrouve les mmes lments qu9uprvntF sl y cin et il y le nom de l vrile @nomUtilisateurA suf queD ette foisD es deux lments se retrouvent endrs pr des prenthses et sprs pr une virgule u lieu des hevronsF
L'ordre des lments entre les parenthses est trs important. Il faut absolument mettre cin en premier !

gette fois le nom ne ser ps tronqu lors de l leture et notre mi elert pourr utiliser notre progrmme sns souisF TW

CHAPITRE 5.

UNE VRAIE CALCULATRICE

uel est votre nom c elert iinstein gomien vut pi c QFIR ous vous ppelez elert iinstein et vous pensez que pi vut QFIRF

Demander d'abord la valeur de pi


i l9on utilise d9ord cin  puis getline()D pr exemple pour demnder l vleur de pi vnt de demnder le nomD le ode ne fontionne psF v9ordinteur ne demnde ps son nom l9utilisteur et 0he n9importe quoiF our pllier e prolmeD il fut jouter l ligne cin.ignore() prs l9utilistion des hevronsF
5inlude `iostremb 5inlude `stringb using nmespe stdY int min@A { out `` 4gomien vut pi c4 `` endlY doule pitilisteur@EIFAY GGyn re une se mmoire pour stoker un nomre rel in bb pitilisteurY GGit on remplit ette se ve e qu9rit l9utilisteur inFignore@AY out `` 4uel est votre nom c4 `` endlY string nomtilisteur@4ns nom4AY GGyn re une se mmoire pour ontenir une hine de rtres getline@inD nomtilisteurAY GGyn remplit ette se ve toute l ligne que l9utilisteur rit out `` 4ous vous ppelez 4 `` nomtilisteur `` 4 et vous pensez que pi vut 4 `` pitilisteur `` 4F4 `` endlY } return HY

eve elD plus de souiF und on mlnge l9utilistion des hevrons et de getline()D il fut toujours pler l9instrution cin.ignore() prs l ligne cinaF g9est une rgle pprendreF oyons mintennt e que l9on peut fire ve des vrilesD pr exemple dditionner deux nomresF UH

MODIFIER DES V ARIABLES

Modier des variables


Changer le contenu d'une variable
te vous i expliqu dns l9introdution de e hpitre que l mmoire de l9ordinteur ressemleD dns s mnire de fontionnerD elle d9une lultrieF ge n9est ps l seule similitudeF yn peut videmment e'etuer des oprtions de lul sur un ordinteurF it el se fit en utilisnt des vrilesF gommenons pr voir omment modi(er le ontenu d9une vrileF yn utilise le symole = pour e'etuer un hngement de vleurF i j9i une vrile de type int dont je veux modi(er le ontenuD j9ris le nom de m vrile suivi du symole = et en(n de l nouvelle vleurF g9est e qu9on ppelle l9aectation d'une variableF
int unxomre@HAY GGte re une se mmoire nomme 9unxomre9 et qui ontient le nomre H unxomre a SY GGte mets S dns l se mmoire 9unxomre9

yn peut ussi diretement 'eter le ontenu d9une vrile une utre


int @RAD @SAY GGhlrtion de deux vriles a Y GGeffettion de l vleur de 99 99F

Que se passe-t-il exactement ?

und il rrive l ligne Q du ode prdentD l9ordinteur lit le ontenu de l se mmoire nomme bD soit le nomre 5F sl ouvre ensuite l se dont le nom est a et y rit l vleur 5 en remplnt le 4 qui s9y trouvitF oyons el ve un shm @(gure SFPAF yn peut d9illeurs 0her le ontenu des deux vriles pour vri(erF
5inlude `iostremb using nmespe stdY int min@A { int @RAD @SAY GGhlrtion de deux vriles out `` 4 vut X 4 `` `` 4 et vut X 4 `` `` endlY out `` 4effettion 34 `` endlY a Y GGeffettion de l vleur de 99 99F

UI

CHAPITRE 5.

UNE VRAIE CALCULATRICE

Figure SFP ! e'ettion d9une vrile une utre


out `` 4 vut X 4 `` `` 4 et vut X 4 `` `` endlY } return HY

evezEvous test c xon c x9ouliez ps qu9il est importnt de tester les odes proposs pour ien omprendreF fonD omme je suis gentilD je vous donne le rsulttF
vut X R et vut X S effettion 3 vut X S et vut X S

ixtement e que je vous vis prditF


La valeur de b n'a pas chang ! Il est important de se rappeler que, lors d'une aectation, seule la variable gauche du symbole = est modie. Cela ne veut pas dire que les deux variables sont gales ! Juste que le contenu de celle de droite est copi dans celle de gauche.

g9est un on dut mis on est enore loin d9une lultrieF sl nous mnqueF F F les oprtions 3

Une vraie calculatrice de base !


gommenons ve l9oprtion l plus simple X l9ddition ien srF it je pense que je ne vis ps trop vous surprendre en vous disnt qu9on utilise le symole +F UP

MODIFIER DES V ARIABLES

g9est vriment trs simple fire X


int @SAD @VAD resultt@HAY resultt a C Y GGit hop une ddition pour l route3

gomme 9est votre premire oprtionD je vous dris e qui se psse prismentF l ligne ID le progrmme re dns l mmoire trois sesD dnommes aD b et resultatF sl remplit glement es ses respetivement ve les vleurs 5D 8 et 0F out elD on ommene onntreF yn rrive ensuite l ligne QF v9ordinteur voit qu9il doit modi(er le ontenu de l vrile resultatF sl regrde lors e qu9il y de l9utre t du symole = et il remrque qu9il doit fire l somme des ontenus des ses mmoire a et bF sl regrde lors le ontenu de a et de b sans le modierD e'etue le lul et rit l somme dns l vrile resultatF out el en un lirF our lulerD l9ordinteur est un vri hmpionF i vous voulezD on peut mme vri(er que el fontionneF
5inlude `iostremb using nmespe stdY int min@A { int resultt@HAD @SAD @VAY resultt a C Y out `` 4S C V a 4 `` resultt `` endlY return HY

ur votre rn vous devriez voir X


S C V a IQ

ge n9est ps toutD il existe enore qutre utres oprtionsF te vous i mis un rsum des possiilits dns un tleu rpitultifF
Opration

eddition oustrtion wultiplition hivision wodulo

Symbole + * / %

Exemple
resultat resultat resultat resultat resultat

= = = = =

a a a a a

+ * / %

b; b; b; b; b;

UQ

CHAPITRE 5.

UNE VRAIE CALCULATRICE

Mais qu'est-ce que le modulo ? Je n'ai pas vu cela l'cole.

te suis sr que siD mis ps forment sous e nom lF sl s9git en fit du reste de l division entireF r exempleD si vous ressortez vos hiers d9oleD vous devriez reE trouver des luls tels que 13 divis pr 3F yn otient un nomre entier dnomm  quotient @en l9ourreneD il vut 4 misD omme 13 n9est ps un multiple de 3D il fut omplter 3 4 pr quelque hose @iiD 1A pour otenir extement 13F g9est e  quelque hose qu9on ppelle le reste de l divisionF eve notre exempleD on peut don rire 13 = 4 3 + 1D 9estEEdire 13 = quotient 3 + resteF v9oprteur modulo lule e reste de l divisionF eutEtre en urezEvous esoin un jourF
Cet oprateur n'existe que pour les nombres entiers !

prtir des oprtions de seD on peut tout fit rire des expressions mthmE tiques plus omplexes qui nessitent plusieurs vrilesF yn peut glement utiliser des prenthses si nessireF
int @PAD @RAD @SAD dY GGuelques vriles d a @@CA B A E Y GGn lul ompliqu 3

v seule limite est votre imgintionF oute expression vlide en mths l9est ussi en gCCF

Les constantes
te vous i prsent omment modi(er des vrilesF t9espre que vous vez ien omE pris 3 re qu9on v fire le ontrireD en quelque sorteF te vis vous montrer omment dlrer des vriles non modi(lesF in termes tehniquesD on prle de constantesF gel fit euoup de termes tehniques pour un seul hpitre mis je vous promets queD dns l suiteD el v se lmerF
Euh, mais quoi peuvent bien servir des variables non modiables ?

ehD je svis que vous lliez poser ette questionF te vous i don prpr une rponse ux petits oignonsF renons le futur jeu vido rvolutionnire que vous llez rerF gomme vous tes trs fortsD je pense qu9il y ur plusieurs niveuxD disons IHF ih ien e nomre de niveux ne v jmis hnger durnt l9exution du progrmmeF intre le moment o l9utilisteur lne le jeu et le moment o il le quitteD il y en permnene IH niveux dns votre jeuF UR

UN PREMIER EXERCICE

ge nomre est onstntF in gCCD on pourrit don rer une vrile nombreNiveaux qui serit une onstnteF ge n9estD ien srD ps le seul exempleF ensez une lultrieD qui ur esoin de l onstnte D ou ien un jeu dns lequel les personnges toment et o il fudr utiliser l onstnte d9lrtion de l pesnteur g = 9.81D et insi de suiteF ges vleurs ne vont jmis hngerF vudr toujours 3.14 et l9lrtion sur erre est prtout identiqueF ge sont des onstntesF yn peut mme jouter que e sont des onstntes dont on onnt l vleur lors de l rdtion du ode soureF wis e n9est ps toutF sl existe ussi des vriles dont l vleur ne hnge jmis mis dont on ne onnt ps l vleur l9vneF renons le rsultt d9une oprtion dns une lultrieF ne fois que le lul est e'etuD le rsultt ne hnge plusF v vrile qui ontient le rsultt est don une onstnteF oyons don omment dlrer une telle vrileF

Dclarer une constante


g9est trs simpleF yn dlre une vrile normle et on joute le motEl const entre le type et le nomF
int onst nomrexiveux@IHAY

gel mrhe ien sr ve tous les types de vrilesF


string onst mothesse@4wesssw4AY GGve mot de psse seret doule onst pi@QFIRAY unsigned int onst pointsheiewximum@IHHAY GGve nomre mximl de points de vie

te pourris ontinuer enore longtemps mis je pense que vous vez sisi le prinipeF ous n9tes ps des futurs gnies de l9informtique pour rienF
Dclarez toujours const tout ce qui peut l'tre. Cela permet non seulement d'viter des erreurs d'inattention lorsque l'on programme, mais cela peut aussi aider le compilateur crer un programme plus ecace.

ous verrezD on reprler des onstntes dns les prohins hpitresF in ttendntD prprezEvous pour votre premier exerieF

Un premier exercice
te rois qu9on en(n toutes les ls en min pour rliser votre premier vri progrmmeF hns l9exemple prdentD le progrmme e'etuit l9ddition de deux nomres (xs l9vneF sl serit ien mieux de demnder l9utilisteur quels nomres il veut dE ditionner 3 oil don le sujet de notre premier exerie X demnder deux nomres US

CHAPITRE 5.

UNE VRAIE CALCULATRICE

l9utilisteurD luler l somme de es deux nomres et (nlement 0her le rsulttF ssurezEvousD je vis vous iderD mis je vous invite essyer pr vousEmmes vnt de regrder l solutionF g9est le meilleur moyen d9pprendreF hns un premier tempsD il fut toujours r)hir ux vriles qu9il v flloir utiliser dns le odeF
De quoi avons-nous besoin ici ?

sl nous fut une vrile pour stoker le premier nomre entr pr l9utilisteur et une utre pour stoker le deuximeF in se snt sur l9exemple prdentD on peut simplement ppeler es deux ses mmoires a et bF insuiteD on doit se poser l question du type des vrilesF xous voulons fire des lulsD il nous fut don opter pour des intD unsigned int ou double selon les nomres que nous voulons utiliserF te vote pour double (n de pouvoir utiliser des nomres virguleF yn peut don dj rire un out de notre progrmmeD 9estEEdire l struture de se et l dlrtion des vrilesF
5inlude `iostremb using nmespe stdY int min@A { doule @HAD @HAY GGhlrtion des vriles utiles GGFFF return HY

v9tpe suivnte onsiste demnder des nomres l9utilisteurF te pense que vous vous en souvenez enoreD el se fit gre cin F yn peut don ller plus loin et rire X
5inlude `iostremb using nmespe stdY int min@A { doule @HAD @HAY GGhlrtion des vriles utiles out `` 4fienvenue dns le progrmme d9ddition C 34 `` endlY out `` 4honnez une vleur pour X 4Y GGyn demnde le premier nomre in bb Y out `` 4honnez une vleur pour X 4Y GGyn demnde le deuxime nomre

UT

UN PREMIER EXERCICE

in bb Y GGFFF } return HY

sl ne nous reste plus qu9 e'etuer l9ddition et 0her le rsulttF sl nous fut don une vrileF gomme le rsultt du lul ne v ps hngerD nous pouvons @et mme deE vonsA dlrer ette vrile omme une onstnteF xous llons remplir ette onstnteD que j9ppelle resultatD ve le rsultt du lulF pinlementD pour e'etuer l9dditionD 9est ien sr le symole + qu9il v flloir utiliserF
5inlude `iostremb using nmespe stdY int min@A { doule @HAD @HAY GGhlrtion des vriles utiles out `` 4fienvenue dns le progrmme d9ddition C 34 `` endlY out `` 4honnez une vleur pour X 4Y GGyn demnde le premier nomre in bb Y out `` 4honnez une vleur pour X 4Y GGyn demnde le deuxime nomre in bb Y doule onst resultt@ C AY GGyn effetue l9oprtion out `` `` 4 C 4 `` `` 4 a 4 `` resultt `` endlY GGyn ffihe le rsultt } return HY

wmmhD el l9ir rudement ien tout el 3 gompilons et testons pour voirF


fienvenue dns le progrmme d9ddition C 3 honnez une vleur pour X IPQFUVR honnez une vleur pour X SIFUTS IPQFUVR C SIFUTS a IUSFSRW

wgni(que 3 ixtement e qui tit prvu 3 fonD j9i ssez trvillF vous mintennt de progrmmerF te vous propose de vous entrner en modi(nt et exerieF oii quelques ides X ! luler le produit de a et b plutt que leur somme Y UU

CHAPITRE 5.

UNE VRAIE CALCULATRICE

! fire une oprtion plus omplexe omme a b + c Y ! demnder deux nomres entiers et luler leur quotient et le reste de l divisionF fon ourge et musezEvous ien 3

Les raccourcis
eprs et exerieD vous svez mnipuler toutes les oprtions de seF g9est peutEtre surprennt pour vous mis il n9en existe ps d9utre 3 eve es S oprtionsD on peut tout fireD mme des jeux vido omme eux prsents dns le hpitre d9introdutionF sl existe qund mme quelques vrintes quiD j9en suis srD vont vous plireF

L'incrmentation
ne des oprtions les plus ourntes en informtique onsiste jouter  I une vrileF ensez pr exemple ux s suivnts X ! psser du niveu R u niveu S de votre jeu Y ! ugmenter le nomre de points de vie du personnge Y ! jouter un joueur l prtie Y ! etF gette oprtion est tellement ournte qu9elle porte un nom spilF yn prle en rE lit d9incrmentationF eve vos onnissnes tuellesD vous svez dj omment inrmenter une vrileF
int nomretoueur@RAY GGsl y R joueurs dns l prtie nomretoueur a nomretoueur C IY GGyn en joute un GG prtir d9iiD il y S joueurs

fien 3 wis omme je vous l9i ditD les informtiiens sont des finnts et l deuxime ligne de e ode est un peu trop longue rireF ves rteurs du gCC ont don invent une nottion spile pour jouter I une vrileF oii ommentF
int nomretoueur@RAY GGsl y R joueurs dns l prtie CCnomretoueurY GG prtir d9iiD il y S joueurs

yn utilise le symole ++F yn rit ++ suivi du nom de l vrile et on onlut pr le pointEvirgule hituelF ge ode exactement le mme eet que le prdentF sl est juste plus ourt rireF yn peut glement rire nombreJoueur++D 9estEEdire pler l9oprteur ++ prs le nom de l vrileF yn ppelle el l postEinrmenttionD l9oppos de l prE inrmenttion qui onsiste pler ++ vnt le nom de l vrileF ous trouvez peutEtre el ridiule mis je suis sr que vous llez rpidement dorer e genre de hoses 3 UV

LES RACCOURCIS

Cette astuce est tellement utilise qu'elle gure mme dans le nom du langage ! Oui, oui, C++ veut en quelque sorte dire  C incrment  ou, dans un franais plus correct,  C amlior . Ils sont fous ces informaticiens !

La dcrmentation
v dcrmentation est l9oprtion inverseD soustrire I une vrileF v version sns rouri s9rit omme elF
int nomretoueur@RAY GGsl y R joueurs dns l prtie nomretoueur a nomretoueur E IY GGyn en enlve un GG prtir d9iiD il y Q joueurs

te suis presque sr que vous onnissez l version ourteF yn utilise ++ pour jouter ID 9est don  qu9il fut utiliser pour soustrire IF
int nomretoueur@RAY GGsl y R joueurs dns l prtie EEnomretoueurY GGyn en enlve un GG prtir d9iiD il y Q joueurs

impleD non c

Les autres oprations


fonF ejouter ou enlever ID 9est ien mis e n9est ps non plus su0snt pour tout fireF sl existe des rouris pour toutes les oprtions de seF i l9on souhite diviser une vrile pr QD on devrit rireD en version longue X
doule nomre@RSTAY nomre a nomre G QY GG prtir d9iiD nomre vut RSTGQ a ISP

v version ourte utilise le symole /= pour otenir exactement le mme rsulttF


doule nomre@RSTAY nomre Ga QY GG prtir d9iiD nomre vut RSTGQ a ISP

sl existe des rouris pour les S oprtions de seD 9estEEdire +=D -=D *=D /= et %=F te suis sr que vous n9llez plus pouvoir vous en psserF ves essyerD 9est les dopterF te vous propose un petit exemple pour l routeF UW

CHAPITRE 5.

UNE VRAIE CALCULATRICE

5inlude `iostremb using nmespe stdY int min@A { doule nomre@SFQAY nomre Ca RFPY GG9nomre9 vut mintennt nomre Ba PFY GG9nomre9 vut mintennt nomre Ea IFY GG9nomre9 vut mintennt nomre Ga QFY GG9nomre9 vut mintennt return HY }

WFS IW IV T

ges oprtions sont utiles qund il fut jouter ou soustrire utre hose que IF

Encore plus de maths !


ous en voulez enore c eh je voisD vous n9tes ps stisfits de votre lultrieF g9est vri qu9elle est enore un peu puvreD elle ne onnt que les oprtions de seF s vriment gnil pour l superEsuperElultrie qu9est votre ordinteurF xe prtez ps 3 t9i mieux vous proposerF

L'en-tte cmath
our voir s plus de fontions mthmtiquesD il su0t d9jouter une ligne en tte de votre progrmmeD omme lorsque l9on dsire utiliser des vriles de type stringF v diretive insrer est X
5inlude `mthb

tusque lD 9est trs simpleF it dns cmath il y  mth D e qui devrit vous rjouirF yn est sur l onne voieF
Je vais vous prsenter comment utiliser quelques fonctions mathmatiques en C++. Il se peut trs bien que vous ne sachiez pas ce que sont ces fonctions : ce n'est pas grave, elles ne vous seront pas utiles dans la suite du cours. Vous saurez ce qu'elles reprsentent quand vous aurez fait un peu plus de maths.

gommenons ve une fontion utilise trs souventD l rine rreF in nglisD rine rre se dit square root etD en rgD on rit prfois sqrtF gomme le gCC utilise l9nglisD 9est e mot l qu9il v flloir retenir et utiliserF our utiliser une fontion mthmtiqueD on rit le nom de l fontion suiviD entre prenthsesD de l vleur lulerF yn utilise lors l9'ettion pour stoker le rsultt dns une vrileF VH

ENCORE PLUS DE MATHS !

resultt a fontion@vleurAY

g9est omme en mth qund on rit y = f (x)F sl fut juste se souvenir du nom omE pliqu des fontionsF our l rine rreD el donnerit resultat = sqrt(valeur);F
N'oubliez pas le point-virgule la n de la ligne !

renons un exemple ompletD je pense que vous llez omprendre rpidement le prinE ipeF
5inlude `iostremb 5inlude `mthb GGxe ps oulier ette ligne using nmespe stdY int min@A { doule onst nomre@ITAY GGve nomre dont on veut l rine GGgomme s vleur ne hnger ps on met 9onst9 doule resulttY GGne se mmoire pour stoker le rsultt resultt a sqrt@nomreAY GGyn effetue le lul 3

out `` 4v rine de 4 `` nomre `` 4 est 4 `` resultt `` endlY } return HY

oyons e que el donneF


v rine de IT est R

otre ordinteur lule orretementF wis je ne pense ps que vous en doutiezF oyons s9il y d9utres fontions dispositionF

Quelques autres fonctions prsentes dans cmath


gomme il y euoup de fontionsD je vous propose de tout rnger dns un tleuF
Les fonctions trigonomtriques (sin(), comme unit d'angles.
cos(),. . .

) utilisent les radians

sl existe enore euoup d9utres fontions 3 te ne vous i mis que les priniples pour ne ps qu9on se perdeF VI

CHAPITRE 5.

UNE VRAIE CALCULATRICE

Nom de la fonction

ine rre inus gosinus ngente ixponentielle vogrithme nprien vogrithme en se IH leur solue errondi vers le s errondi vers le hut

Symbole Fonction Mini-exemple


x sin(x) cos(x) tan(x) ex ln x log10 x |x| x x

sqrt() sin() cos() tan() exp() log() log10() fabs() floor() ceil()

resultat resultat resultat resultat resultat resultat resultat resultat resultat resultat

= = = = = = = = = =

sqrt(valeur); sin(valeur); cos(valeur); tan(valeur); exp(valeur); log(valeur); log10(valeur); fabs(valeur); floor(valeur); ceil(valeur);

On parle de mathmatiques, ces fonctions ne sont donc utilisables qu'avec des variables qui reprsentent des nombres (double, int et unsigned int). Prendre la racine carre d'une lettre ou calculer le cosinus d'une phrase n'a de toute faon pas de sens.

Le cas de la fonction puissance


gomme toujoursD il y un s prtiulier X l fontion puissneF gomment luler 45 c sl fut utiliser l fontion pow() qui est un peu spileF ille prend deux argumentsD 9estEEdire qu9il fut lui donner deux vleurs entre les prenthsesF gomme pour l fontion getline() dont je vous i prl vntF i je veux luler 45 D je vis devoir proder insi X
doule onst @RAY doule onst @SAY doule onst resultt a pow@DAY

te dlre une vrile @onstnteA pour mettre le 4D une utre pour stoker le 5 et (nlement une dernire pour le rsulttF ien de nouveu jusque lF t9utilise l fonE tion pow() pour e'etuer le lul et j9utilise le symole = pour initiliser l vrile resultat ve l vleur lule pr l fontionF xous pouvons don reprendre l9exerie prdent et rempler l9ddition pr notre nouvelle mieD l fontion puissneF te vous lisse essyerF oii m version X
5inlude `iostremb 5inlude `mthb GGxe ps oulier 3 using nmespe stdY int min@A {

VP

ENCORE PLUS DE MATHS !

doule @HAD @HAY GGhlrtion des vriles utiles out `` 4fienvenue dns le progrmme de lul de 34 `` endlY out `` 4honnez une vleur pour X 4Y GGyn demnde le premier nomre in bb Y out `` 4honnez une vleur pour X 4Y GGyn demnde le deuxime nomre in bb Y doule onst resultt@pow@D AAY GGyn effetue l9oprtion GGyn peut ussi rire omme vnt X GGdoule onst resultt a pow@DAY GGouvenezEvous des deux formes possiles GGhe l9initilistion d9une vrile out `` `` 4 4 `` `` 4 a 4 `` resultt `` endlY GGyn ffihe le rsultt } return HY

ous vez fit l mme hose c rfit 3 ous tes de futurs hmpions du gCC 3 oyons qund mme e que el donneF
fienvenue dns le progrmme de lul de 3 honnez une vleur pour X R honnez une vleur pour X S R S a IHPR

t9espre que vous tes stisfits ve toutes es fontions mthmtiquesF te ne sis ps si vous en urez esoin un jour misD si 9est le sD vous surez o en trouver une desriptionF

En rsum
! our demnder l9utilisteur de sisir une informtion u lvierD on utilise cin  variable;F v vleur sisie ser stoke dns l vrileF ! sl ne fut ps onfondre le sens des hevrons cout  et cin F ! yn peut fire toutes sortes d9oprtions mthmtiques de se en gCC X dditionD soustrtionD multiplitionF F F ixemple X resultat = a + b; ! ves onstntes sont des vriles qu9on ne peut ps modi(er une fois qu9elles ont t resF yn utilise le mot const pour les d(nirF ! our jouter I l vleur d9une vrileD on e'etue e qu9on ppelle une inrmenE ttion X variable++;F v9oprtion inverseD ppele drmenttionD existe ussiF VQ

CHAPITRE 5.

UNE VRAIE CALCULATRICE

! i vous souhitez utiliser des fontions mthmtiques plus omplexesD omme l rine rreD il fut inlure l9enEtte <cmath> dns votre ode et fire ppel l fontion omme dns et exemple X resultat = sqrt(100);

VR

Chapitre

6
Dicult :

Les structures de contrle

es programmes doivent tre capables de prendre des dcisions. Pour y parvenir, les dveloppeurs utilisent ce qu'on appelle des structures de contrle. Ce nom un peu barbare cache en fait deux lments que nous verrons dans ce chapitre :  les conditions : elles permettent d'crire dans le programme des rgles comme  Si ceci arrive, alors fais cela  ;  les boucles : elles permettent de rpter plusieurs fois une srie d'instructions. Savoir manier les structures de contrle est fondamental ! Bien que ce chapitre ne soit pas rellement dicile, il faut faire attention bien comprendre ces notions de base. Elles vous serviront durant toute votre vie de dveloppeurs C++. . . mais aussi dans d'autres langages car le principe y est le mme !

VS

CHAPITRE 6.

LES STRUCTURES DE CONTRLE

Les conditions
our qu9un progrmme soit ple de prendre des disionsD on utilise dns le ode soure des conditions @on prle ussi de  strutures onditionnelles AF ve prinipe est simple X vous voulez que votre progrmme rgisse di'remment en fontion des ironstnesF xous llons douvrir ii omment utiliser es fmeuses onditions dns nos progrmmes gCCF our ommenerD il fut svoir que les onditions permettent de tester des vrilesF ous vous souvenez de es vriles stokes en mmoire que nous vons douvertes u hpitre prdent c ih ien nous llons mintennt pprendre les nlyser X  istEe que ette vrile est suprieure IH c D  istEe que ette vrile ontient ien le mot de psse seret c D etF our e'etuer es testsD nous utilisons des symolesF oii le tleu des symoles onntre par cur X
Symbole Signication

aa b ` ba `a 3a

ist gl ist suprieur ist infrieur ist suprieur ou gl ist infrieur ou gl ist di'rent de

Faites trs attention : en C++, il y a bien 2 symboles  =  pour tester l'galit. Les dbutants oublient souvent cela et n'crivent qu'un seul  = , ce qui n'a pas la mme signication.

xous llons utiliser es symoles pour e'etuer des omprisons dns nos onditionsF sl fut svoir qu9il existe en gCC plusieurs types de onditions pour fire des testsD mis l plus importnteD qu9il fut imprtivement onntreD est sns uun doute l ondition ifF

La condition if
gomme je vous le disisD les onditions permettent de tester des vrilesF te vous propose don de rer un petit progrmme en mme temps que moi et de fire des tests pour vri(er que vous vez ien ompris le prinipeF yn v ommener ve e ode X
5inlude `iostremb using nmespe stdY

VT

LES CONDITIONS

int min@A { int ninfnts@PAY } return HY

ge odeEl ne fit rien pour le momentF sl se ontente de dlrer une vrile nbEnfants @qui indique don un nomre d9enfntsAD puis il s9rrteF
Une premire condition if

smginons qu9on souhite 0her un messge de fliittions si l personne des enE fntsF yn v jouter une ondition qui regrde si le nomre d9enfnts est suprieur H et quiD dns e sD 0he un messgeF
5inlude `iostremb using nmespe stdY int min@A { int ninfnts@PAY if @ninfnts b HA { out `` 4ous vez des enfntsD rvo 34 `` endlY } out `` 4pin du progrmme4 `` endlY return HY

ge ode 0he X
ous vez des enfntsD rvo 3 pin du progrmme

egrdez ien l ligne suivnte X if (nbEnfants > 0) ille e'etue le test X  Si le nombre d'enfants est suprieur 0 F i e test est vri( @don si l personne ien des enfntsAD lors l9ordinteur v lire les lignes qui se trouvent entre les oldes X il v don 0her le messge  ous vez des enfntsD rvo 3 F
1

1.  if , en anglais, veut dire  si .

VU

CHAPITRE 6.

LES STRUCTURES DE CONTRLE

Et si la personne n'a pas d'enfants, qu'est-ce qui se passe ?

hns le s o le rsultt du test est ngtifD l9ordinteur ne lit ps les instrutions qui se trouvent entre les oldesF sl sute don l ligne qui suit l fermeture des oldesF hns notre sD si l personne n9 uun enfntD on verr seulement e messge ppE rtre X
pin du progrmme

Faites le test !

ghngez l vleur de l vrile nbEnfantsD pssezEl H et regrdez e qui se produitF


else

: ce qu'il faut faire si la condition n'est pas vrie

ous souhitez que votre progrmme fsse quelque hose de pris si l ondition n9est ps vri(e c g9est vri queD pour le momentD le progrmme est plutt silenieux si vous n9vez ps d9enfnt 3 reureusementD vous pouvez utiliser le motEl else qui signi(e  sinon F yn v pr exemple 0her un utre messge si l personne n9 ps d9enfnt X
5inlude `iostremb using nmespe stdY int min@A { int ninfnts@HAY if @ninfnts b HA { out `` 4ous vez des enfntsD rvo 34 `` endlY } else { out `` 4ih ien lorsD vous n9vez ps d9enfnt c4 `` endlY } out `` 4pin du progrmme4 `` endlY return HY

ge ode 0he X VV

LES CONDITIONS

ih ien lorsD vous n9vez ps d9enfnt c pin du progrmme

F F F r j9i hng l vleur de l vrile nbEnfants u dutD regrdez ienF i vous mettez une vleur suprieure HD le messge redeviendr elui que nous vons vu vnt 3 gomment el fontionneEtEil c g9est trs simple en fit X l9ordinteur lit d9ord l ondition du if et se rend ompte que l ondition est fusseF sl vri(e si l personne u moins I enfnt et e n9est ps le sF v9ordinteur  sute tout e qui se trouve entre les premires oldes et tome sur l ligne else qui signi(e  sinon F sl e'etue don les tions indiques prs else @(gure TFIAF

Figure TFI ! gondition if E else


else if

: eectuer un autre test

sl est possile de fire plusieurs tests l suiteF smginez qu9on souhite fire le test suivnt X ! si le nomre d9enfnts est gl HD 0her e messge  F F F Y ! sinonD si le nomre d9enfnts est gl ID 0her e messge  F F F Y ! sinonD si le nomre d9enfnts est gl PD 0her e messge  F F F Y ! sinonD 0her e messge  F F F F our fire tous es tests un un dns l9ordreD on v voir reours l ondition else if qui signi(e  sinon si F ves tests vont tre lus dns l9ordre jusqu9 e que l9un d9entre eux soit vri(F
5inlude `iostremb using nmespe stdY int min@A { int ninfnts@PAY

VW

CHAPITRE 6.

LES STRUCTURES DE CONTRLE

if @ninfnts aa HA { out `` 4ih ien lorsD vous n9vez ps d9enfnt c4 `` endlY } else if @ninfnts aa IA { out `` 4elorsD 9est pour qund le deuxieme c4 `` endlY } else if @ninfnts aa PA { out `` 4uels eux enfnts vous vez l 34 `` endlY } else { out `` 4fonD il fut rreter de fire des gosses mintennt 34 `` endlY } out `` 4pin du progrmme4 `` endlY return HY

gel se omplique c s tnt que elF hns notre sD nous vons P enfnts X IF v9ordinteur teste d9ord si on en HF PF gomme e n9est ps le sD il psse u premier else if X estEe qu9on I enfnt c xon plus 3 QF v9ordinteur teste don le seond else if X estEe qu9on P enfnts c yui 3 hon on 0he le messge  uels eux enfnts vous vez l 3 F i uune des onditions n9vit t vri(eD 9est le messge du else  fonD il fut rreter de fire des gosses mintennt 3 qui serit 0h @(gure TFPAF

La condition switch
in thorieD l ondition if permet de fire tous les tests que l9on veutF in prtiqueD il existe d9utres fons de fire des testsF v ondition switchD pr exempleD permet de simpli(er l9riture de onditions qui testent plusieurs vleurs possiles pour une mme vrileF renez pr exemple le test qu9on vient de fire sur le nomre d9enfnts X eEtEil H enfnt c eEtEil I enfnt c eEtEil P enfnts c F F F yn peut fire e genre de tests ve des ifF F F else ifF F F elseF F FD mis on peut fire l mme hose ve une ondition switch quiD dns e genre de sD tendne rendre le ode plus lisile dns e genre de sF oii e que donnerit le ode prdent ve switch X WH

LES CONDITIONS

Figure TFP ! gonditions if E else

if E else

WI

CHAPITRE 6.

LES STRUCTURES DE CONTRLE

5inlude `iostremb using nmespe stdY int min@A { int ninfnts@PAY swith @ninfntsA { se HX out `` 4ih ien lorsD vous n9vez ps d9enfnt c4 `` endlY rekY se IX out `` 4elorsD 9est pour qund le deuxieme c4 `` endlY rekY se PX out `` 4uels eux enfnts vous vez l 34 `` endlY rekY defultX out `` 4fonD il fut rreter de fire des gosses mintennt 34 `` endlY rekY } } return HY

ge qui 0he X
uels eux enfnts vous vez l 3

v forme est un peu di'rente X on indique d9ord qu9on v nlyser l vrile nbEnfants@ligne WAF insuiteD on teste tous les s @caseA possiles X si l vrile vut HD si elle vut ID si elle vut PF F F ves break sont oligtoires si on veut que l9ordinteur rrte les tests une fois que l9un d9eux russiF in prtiqueD je vous onseille d9en mettre omme moi l (n de hque caseF in(nD le default l (n orrespond u else @ sinon A et s9exute si uun des tests prdents n9est vri(F WP

BOOLENS ET COMBINAISONS DE CONDITIONS

switch ne permet de tester que l'galit. Vous ne pouvez pas tester  Si le nombre d'enfants est suprieur 2  avec switch : il faut dans ce cas utiliser if. De plus, switch ne peut travailler qu'avec des nombres entiers (int, unsigned int, char). Il est impossible de tester des nombres dcimaux (double). switch est donc limit en termes de possibilits mais cette instruction propose une criture alternative parfois plus pratique dans des cas simples.

Boolens et combinaisons de conditions


ellons un peu plus loin ve les onditionsF xous llons douvrir deux notions plus vnes et nnmoins essentielles X les oolens et les ominisons de onditionsF

Les boolens
ous vous souvenez du type bool c ge type de donnes peut stoker deux vleurs X IF true @vriA Y PF false @fuxAF ge type est souvent utilis ve les onditionsF und on y penseD 9est logique X une ondition est soit vrieD soit fusseF ne vrile oolenne ussiF i je vous prle du type boolD 9est pre qu9on peut l9utiliser d9une fon un peu prtiulire dns les onditionsF our ommenerD regrdez e ode X
ool dulte@trueAY if @dulte aa trueA { out `` 4ous etes un dulte 34 `` endlY }

gette onditionD qui vri(e l vleur de l vrile adulteD 0he un messge si elleEi vut vri @trueAF ous vous demndez peutEtre o je veux en venir c in fitD il est possile d9omettre l prtie  == true dns l onditionD el revient u mme 3 egrdez e odeD qui est quivlent X
ool dulte@trueAY if @dulteA { out `` 4ous etes un dulte 34 `` endlY }

WQ

CHAPITRE 6.

LES STRUCTURES DE CONTRLE

v9ordinteur comprend que vous voulez vri(er si l vrile oolenne vut trueF sl n9est ps nessire de rjouter  == true F
Est-ce que cela ne rend pas le code plus dicile lire ?

xonD u ontrire X le ode est plus ourt et plus file lire 3 if (adulte) se lit tout simplement  9il est dulte F te vous invite utiliser ette nottion rourie qund vous testerez des vriles oolennesF gel vous ider lri(er votre ode et rendre ertines onditions plus  digestes lireF

Combiner des conditions


our les onditions les plus omplexesD shez que vous pouvez fire plusieurs tests u sein d9un seul et mme ifF our elD il v flloir utiliser de nouveux symoles X 88 i || y 3 xyx
Test ET

smginons X on veut tester si l personne est dulte et si elle u moins I enfntF yn v don rire X
if @dulte 88 ninfnts ba IA

ves deux symoles && signi(ent  i F xotre ondition se dirit en frnis X  i l personne est dulte i si le nomre d9enfnts est suprieur ou gl I F
Notez que j'aurais galement pu crire cette condition ainsi : if (adulte == true && nbEnfants >= 1). Cependant, comme je vous l'ai expliqu un peu plus tt, il est facultatif de prciser  == true  sur les boolens et c'est

une habitude que je vous invite prendre.


Test OU

our fire un yD on utilise les P signes ||F te dois vouer que e signe n9est ps filement essile sur nos lviersF our le tper sur un lvier AZERTY frnisD il fut ppuyer sur les touhes Alt Gr C 6 F ur un lvier elgeD il fut ppuyer sur WR

LES BOUCLES

les touhes Alt Gr C & et en(nD pour les uissesD 9est l ominison Alt 7 qu9il fut utiliserF yn peut pr exemple tester si le nomre d9enfnts est gl I y P X
if @ninfnts aa I || ninfnts aa PA

Gr C

Test NON

sl fut mintennt que je vous prsente un dernier symole X le point d9exlmtionF in informtiqueD le point d9exlmtion signi(e  xon F ous devez mettre e signe avant votre ondition pour pouvoir dire  i el n9est pas vri X
if @3dulteA

gel pourrit se trduire pr  i l personne n9est ps dulte F

Les boucles
ves boucles vous permettent de rpter les mmes instrutions plusieurs fois dns votre progrmmeF ve prinipe est reprsent en (gure TFQF

Figure TFQ ! ne oule permet de rpter des instrutions

IF l9ordinteur lit les instrutions de hut en s @omme d9hitudeA Y PF puisD une fois rriv l (n de l ouleD il reprt l premire instrution Y QF il reommene lors lire les instrutions de hut en sF F F Y RF F F F et il reprt u dut de l ouleF ves oules sont rptes tnt qu9une ondition est vrieF r exemple on peut fire une oule qui dit X  nt que l9utilisteur donne un nomre d9enfnts infrieur HD redemnder le nomre d9enfnts F sl existe Q types de oules onntre X ! while Y ! do ... while Y ! forF WS

CHAPITRE 6.

LES STRUCTURES DE CONTRLE

La boucle while
gette oule s9utilise omme ei X
while @onditionA { GB snstrutions rpter BG }

out e qui est entre oldes ser rpt tnt que l ondition est vri(eF issyons de fire e que j9i dit plus tt X on redemnde le nomre d9enfnts l9utiliE steur tnt que eluiEi est infrieur HF ge genre de oule permet de s9ssurer que l9utilisteur rentre un nomre orretF
int min@A { int ninfnts@EIAY GG xomre ngtif pour pouvoir entrer dns l oule while @ninfnts ` HA { out `` 4gomien d9enfnts vezEvous c4 `` endlY in bb ninfntsY } out `` 4weri d9voir indique un nomre d9enfnts orretF ous en vez 4 `` ninfnts `` endlY } return HY

oii un exemple d9utilistion de e progrmme X


gomien d9enfnts vezEvous c EQ gomien d9enfnts vezEvous c ES gomien d9enfnts vezEvous c P weri d9voir indique un nomre d9enfnts orretF ous en vez P

nt que vous sisissez un nomre ngtifD l oule reommeneF in e'etD elle teste while (nbEnfants < 0)D 9estEEdire  nt que le nomre d9enfnts est infrieur H F hs que le nomre devient suprieur ou gl HD l oule s9rrte et le progrmme ontinue prs l9olde fermnteF
Vous noterez que j'ai initialis la variable nbEnfants -1. En eet, pour que l'ordinateur veuille bien entrer une premire fois dans la boucle, il faut faire en sorte que la condition soit vraie la premire fois.

WT

LES BOUCLES

La boucle do ... while


gette oule est trs similire l prdenteF F F si e n9est que l ondition n9est teste qu9 l (nF gel signi(e que le ontenu de l oule ser toujours lu au moins une foisF gette oule prend l forme suivnte X
do { GB snstrutions BG } while @onditionAY

xotez ien l prsene du pointEvirgule tout l (n 3 eprenons le ode prdent et utilisons ette fois un do
int min@A { int ninfnts@HAY do {

... while

out `` 4gomien d9enfnts vezEvous c4 `` endlY in bb ninfntsY } while @ninfnts ` HAY out `` 4weri d9voir indique un nomre d9enfnts orretF ous en vez 4 `` ninfnts `` endlY } return HY

ve prinipe est le mmeD le progrmme le mme omportementF ve gros intrt de do ... while est qu9on s9ssure que l oule ser lue u moins une foisF h9illeursD du oupD il n9est ps nessire d9initiliser nbEnfants EI @9est le prinipl vntge que proure ette solutionAF in e'etD le nomre d9enfnts est initilis ii H @omme on l9hitude de fireA etD omme l ondition n9est teste qu9prs le premier pssge de l ouleD les instrutions sont ien lues u moins une foisF

La boucle for
ge type de ouleD que l9on retrouve frquemmentD permet de ondenser X ! une initilistion Y ! une ondition Y ! une inrmenttionF oii s forme X WU

CHAPITRE 6.

LES STRUCTURES DE CONTRLE

for @initilistion Y ondition Y inrementtionA { }

egrdons un exemple onret qui 0he des nomres de H W X


int min@A { int ompteur@HAY for @ompteur a H Y ompteur ` IH Y ompteurCCA { out `` ompteur `` endlY } } return HY

ge ode 0he X
H I P Q R S T U V W

yn retrouve sur l ligne du for les Q instrutions que je vous i indiques X ! ne initilistion @compteur = 0A X l vrile compteur est mise H u tout dut de l ouleF xotez que el vit t fit l ligne immditement uEdessusD e n9tit don ps vriment nessire iiF ! ne ondition @compteur < 10A X on vri(e que l vrile compteur est infrieure IH hque nouveu tour de ouleF ! ne inrmenttion @compteur++A X hque tour de ouleD on joute I l vrile compteur 3 oil pourquoi on voit s90her l9rn des nomres de H WF
Vous pouvez faire autre chose qu'une incrmentation si vous le dsirez. La dernire section du for est rserve la modication de la variable et vous pouvez donc y faire une dcrmentation (compteur--) ou avancer de 2 en 2 (compteur += 2), etc.

xotez qu9il est ournt d9initiliser l vrile diretement l9intrieur du forD omme ei X WV

LES BOUCLES

int min@A { for @int ompteur@HA Y ompteur ` IH Y ompteurCCA { out `` ompteur `` endlY } } return HY

v vrile n9existe lors que pendnt l dure de l oule forF g9est l forme l plus ournte de ette ouleF yn ne dlre l vrile vnt le for que si on en esoin plus trdD e qui est un s ssez rreF
Quand utiliser un for et quand utiliser un while ? On utilise la boucle for quand on connat le nombre de rptitions de la boucle et on utilise le plus souvent la boucle while quand on ne sait pas combien de fois la boucle va tre eectue.

En rsum
! ves onditions permettent de tester l vleur des vriles et de modi(er le omporE tement du progrmme en onsqueneF ! v ondition de type if @siA F F F else if @sinon siA F F F else @sinonA est l plus ournteF ! v ondition switchD plus spi(queD permet de tester les di'rentes vleurs possiles d9une seule vrileF ! ves oules permettent de rpter les mmes instrutions plusieurs foisF ! yn distingue trois types de oules X whileD do... while et forF ! v oule for est gnrlement utilise lorsqu9on sit omien de fois on souhite rpter les instrutionsD tndis que while et do... while sont plutt utilises lorsE qu9on souhite rpter des instrutions jusqu9 e qu9une ondition spi(que soit vri(eF

WW

CHAPITRE 6.

LES STRUCTURES DE CONTRLE

IHH

Chapitre

7
Dicult :

Dcouper son programme en fonctions

ous venons de voir comment faire varier le droulement d'un programme en utilisant des boucles et des branchements. Avant cela, je vous ai parl des variables. Ce sont des lments qui se retrouvent dans tous les langages de programmation. C'est aussi le cas de la notion que nous allons aborder dans ce chapitre : les fonctions. Tous les programmes C++ exploitent des fonctions et vous en avez dj utilis plusieurs, sans forcment le savoir. Le but des fonctions est de dcouper son programme en petits lments rutilisables, un peu comme des briques. On peut les assembler d'une certaine manire pour crer un mur, ou d'une autre manire pour faire un cabanon ou mme un gratte-ciel. Une fois que les briques sont cres, le programmeur  n'a plus qu'  les assembler. Commenons par crer des briques. Nous apprendrons les utiliser dans un deuxime temps.

IHI

CHAPITRE 7.

DCOUPER SON PROGRAMME EN FONCTIONS

Crer et utiliser une fonction


hs le dut de e oursD nous vons utilis des fontionsF g9tit en fit toujours l mme X l fontion main()F g9est le point d9entre de tous les progrmmes gCCD 9est pr l que tout ommeneF
5inlude `iostremb using nmespe stdY int min@A GGheut de l fontion min@A et don du progrmme { out `` 4fonjour tout le monde 34 `` endlY return HY } GGpin de l fontion min@A et don du progrmme

ve progrmme ommene rellement l ligne R et se termine l ligne V prs l9oE lde fermnteF g9estEEdire que tout se droule dns une seule et unique fontionF yn n9en sort psF sl n9y qu9une seule portion de ode qui est exute dns l9ordreD sns jmis suter illeursF i je vous dit tout elD vous devez vous douter que l9on peut rire d9utres fontions et don voir un progrmme doup en plusieurs modules indpendntsF
Pourquoi vouloir faire cela ?

g9est vriD prs toutF wettre l9ensemle du ode dns l fontion main() est tout fit possileF ge n9est ependnt ps une onne prtiqueF smginons que nous voulions rer un jeu vido QhF gomme 9est qund mme ssez omplexeD le ode soure v nessiter plusieurs dizines de milliers de lignes 3 i l9on grde tout dns une seule fontionD il v tre trs di0ile de s9y retrouverF sl serit ertinement plus simple d9voir dns un oin un moreu de ode qui fit ouger un personngeD illeurs un utre out de ode qui hrge les niveuxD etF houper son progrmme en fontions permet de s9organiserF in plusD si vous tes plusieurs dveloppeurs trviller sur le mme progrmmeD vous pourrez vous prtger plus filement le trvil X hun s9ttelle une fontion di'renteF wis e n9est ps tout 3 renons pr exemple le lul de l rine rreD que nous vons vu prdemmentF i vous rez un progrmme de mthsD il est ien possile que vous yez esoinD plusieurs endroitsD d9e'etuer des luls de rinesF evoir une fontion sqrt() v nous permettre de fire plusieurs de es luls sns voir reopier le mme ode plusieurs endroitsF yn peut rutiliser plusieurs fois la mme fonction et 9est une des risons priniples d9en rireF IHP

CRER ET UTILISER UNE FONCTION

Prsentation des fonctions


ne fontion est un moreu de ode qui omplit une the prtiulireF ille reoit des donnes triterD e'etue des tions ve et en(n renvoie une vleurF ves donnes entrntes s9ppellent des arguments et on utilise l9expression valeur retourne pour les lments qui sortent de l fontion @(gure UFIAF

Figure UFI ! ne fontion trite des rguments et produit une vleur de retour

ous vous souvenez de pow() c v fontion qui permet de luler des puissnes c in utilisnt le nouveu voulireD on peut dire que ette fontion X IF reoit deux rguments Y PF e'etue un lul mthmtique Y QF renvoie le rsultt du lulF in utilisnt un shm omme le prdentD on peut reprsenter pow() omme l (gure UFPF

Figure UFP ! hm de l fontion pow()

ous en vez dj fit l9exprieneD on peut utiliser ette fontion plusieurs foisF gel implique que l9on n9est ps olig de opier le ode qui se trouve l9intrieur de l fontion pow() hque fois que l9on souhite e'etuer un lul de puissneF

Dnir une fonction


sl est temps d9ttquer le onretF sl fut que je vous montre omment d(nir une fontionF te pourris vous dire de regrder omment main() est fit et vous lisser ptugerD mis je suis sympD je vis vous guiderF IHQ

CHAPITRE 7.

DCOUPER SON PROGRAMME EN FONCTIONS

ous tes prts c elors llonsEy 3 outes les fontions ont l forme suivnte X
type nompontion@rgumentsA { GGsnstrutions effetues pr l fontion }

yn retrouve les trois lments dont je vous i dj prlD uxquels s9joute le nom de l fontionF ! ve premier lment est le type de retourF sl permet d9indiquer le type de vE rile renvoye pr l fontionF i votre fontion doit renvoyer du texteD lors e ser string Y si votre fontion e'etue un lulD lors e ser int ou doubleF ! ve deuxime lment est le nom de la fonctionF ous onnissez dj main()D pow() ou sqrt()F v9importnt est de hoisir un nom de fontion qui drit ien e qu9elle fitD omme pour les vrilesD en fitF ! intre les prenthsesD on trouve l liste des arguments de l fontionF ge sont les donnes ve lesquelles l fontion v trvillerF sl peut y voir un rgument @omme pour sqrt()AD plusieurs rguments @omme pour pow()A ou uun rgument @omme pour main()AF ! pinlementD il y des accolades qui dlimitent le ontenu de l fontionF outes les oprtions qui seront e'etues se trouvent entre les deux oldesF
Il est possible de crer plusieurs fonctions ayant le mme nom. Il faut alors que la liste des arguments des deux fonctions soit dirente. C'est ce qu'on appelle la surcharge d'une fonction. Dans un mme programme, il peut par exemple y avoir la fonction intadd ition(inta,intb) et la fonction doubleaddition(doublea,doubleb). Les deux fonctions ont le mme nom mais l'une travaille avec des entiers et l'autre avec des nombres rels.

grons don des fontions 3

Une fonction toute simple


gommenons pr une fontion siqueF ne fontion qui reoit un nomre entierD joute P e nomre et le renvoieF
int jouteheux@int nomreeuA { int vleur@nomreeu C PAY GGyn re une se en mmoire GGyn prend le nomre reu en rgumentD on lui joute P GGit on met tout el dns l mmoire

IHR

CRER ET UTILISER UNE FONCTION

return vleurY GGyn indique que l vleur qui sort de l fontion GGist l vleur de l vrile 9vleur9

Il n'y a pas de point-virgule ! Ni aprs la dclaration, ni aprs l'accolade fermante.

enlysons e ode en dtilF sl y deux lignes vriment nouvelles pour vousF eve e que je vous i expliquD vous devriez omprendre l premire ligneF yn dlre une fontion nomme ajouteDeux qui reoit un nomre entier en rgument et quiD une fois qu9elle terminD renvoie un utre nomre entier @(gure UFQAF

sortie outes les lignes suivntes utilisent des hoses dj onnuesD suf returnvaleur;F i vous vous posez des questions sur es lignesD je vous invite relire le hpitre sur l9utilistion de l mmoire @pge RWAF v9instrution return indique quelle vleur ressort de l fontionF in l9ourreneD 9est l vleur de l vrile valeur qui est renvoyeF

Figure UFQ ! v fontion reoit un nomre en entre et produit un utre nomre en

Appeler une fonction


ue diriezEvous si je vous disis que vous svez dj ppeler une fontion c ouvenezE vous des fontions mthmtiques 3
5inlude `iostremb using nmespe stdY int jouteheux@int nomreeuA { int vleur@nomreeu C PAY return vleurY

IHS

CHAPITRE 7.

DCOUPER SON PROGRAMME EN FONCTIONS

} int min@A { int @PAD@PAY out `` 4leur de out `` 4leur de a jouteheux@AY out `` 4leur de out `` 4leur de } return HY

X 4 `` `` endlY X 4 `` `` endlY GGeppel de l fontion X 4 `` `` endlY X 4 `` `` endlY

yn retrouve l syntxe que l9on onnissit dj X rsultat = fonction(argument)F pileD pour insi dire 3 ous vez essy le progrmme c oii e que el donne X
leur leur leur leur de de de de X X X X P P P R

eprs l9ppel l fontionD l vrile b t modi(eF out fontionne don omme nnonF

Plusieurs paramtres
xous ne sommes ps enore u out de nos peinesF sl y des fontions qui prennent plusieurs prmtresD omme pow() et getline() pr exempleF our psser plusieurs prmtres une fontionD il fut les sprer pr des virgulesF
int ddition@int D int A { return CY } doule multiplition@doule D doule D doule A { return BBY }

v premire de es fontions lule l somme des deux nomres qui lui sont fournisD lors que l deuxime lule le produit des trois nomres reusF
Vous pouvez bien sr crire des fonctions qui prennent des arguments de type dirent.

IHT

CRER ET UTILISER UNE FONCTION

Pas d'arguments
l9inverseD on peut ussi rer des fontions sns rgumentsF sl su0t de ne rien rire entre les prenthses 3
Mais quoi cela sert-il ?

yn peut imginer plusieurs snrii mis pensez pr exemple une fontion qui deE mnde l9utilisteur d9entrer son nomF ille n9 ps esoin de prmtreF
string demnderxom@A { out `` 4intrez votre nom X 4Y string nomY in bb nomY return nomY }

wme s9il est vri que e type de fontions est plus rreD je suis sr que vous trouverez plein d9exemples pr l suite 3

Des fonctions qui ne renvoient rien


ous les exemples que je vous i donns jusque l prenient des rguments et renE voyient une vleurF wis il est ussi possile d9rire des fontions qui ne renvoient rienF in(n presqueF ien ne ressort de l fontion misD qund on l dlreD il fut qund mme indiquer un typeF yn utilise le type voidD e qui signi(e  nnt en nglisF gel veut tout dire X il n9y vriment rien qui soit renvoy pr l fontionF
void direfonjour@A { out `` 4fonjour 34 `` endlY GGgomme rien ne ressortD il n9y ps de return 3 } int min@A { direfonjour@AY GGgomme l fontion ne renvoie rien GGyn l9ppelle sns mettre l vleur de retour dns une vrile } return HY

eve e dernier pointD nous vons fit le tour de l thorieF hns l suite du hpitreD je vous propose quelques exemples et un super shm rpitultifF ge n9est ps le IHU

CHAPITRE 7.

DCOUPER SON PROGRAMME EN FONCTIONS

moment de prtirF

Quelques exemples
Le carr
gommenons ve un exemple simple X luler le rr d9un nomreF gette fontion reoit un nomre x en rgument et lule l vleur de x2F
5inlude `iostremb using nmespe stdY doule rre@doule xA { doule resulttY resultt a xBxY return resulttY } int min@A { doule nomreD rrexomreY out `` 4intrez un nomre X 4Y in bb nomreY rrexomre a rre@nomreAY GGyn utilise l fontion out `` 4ve rre de 4 `` nomre `` 4 est 4 `` rrexomre `` endlY return HY

te vous vis promis un shmD le voilF oyons e qui se psse dns e progrmme et dns quel ordre sont exutes les lignes @(gure UFRAF sl y une hose dont il fut solument se rppeler X les vleurs des vriles trnsmises ux fontions sont copies dans de nouvelles cases mmoiresF v fontion carre() n9git don ps sur les vriles dlres dns l fontion main()F ille trville uniquement ve ses propres ses mmoiresF ge n9est que lors du return que les vriles de main() sont modi(es 9estEEdire ii l vrile carreNombreF v vrile nombre reste inchange lors de l9ppel l fontionF

Rutiliser la mme fonction


v9intrt d9utiliser une fontion ii est ien sr de pouvoir luler filement le rr de di'rents nomresD pr exemple de tous les nomres entre I et PH X IHV

QUELQUES EXEMPLES

Figure UFR ! hroulement d9un progrmme ppelnt une fontion

5inlude `iostremb using nmespe stdY doule rre@doule xA { doule resulttY resultt a xBxY return resulttY } int min@A { for@int i@IAY i`aPH Y iCCA { out `` 4ve rre de 4 `` i `` 4 est X 4 `` rre@iA `` endlY } return HY }

yn rit une seule fois l formule du lul du rr et on utilise ensuite vingt fois ette  rique F siD le lul est simple misD dns ien des sD utiliser une fontion rourit grndement le ode 3 IHW

CHAPITRE 7.

DCOUPER SON PROGRAMME EN FONCTIONS

Une fonction deux arguments


evnt de terminer ette setionD voii un dernier exempleF gette foisD je vous propose une fontion utilisnt deux rgumentsF xous llons dessiner un retngle d9toiles * dns l onsoleF v fontion esoin de deux rguments X l lrgeur et l huteur du retngleF
5inlude `iostremb using nmespe stdY void dessineetngle@int lD int hA { for@int ligne@HAY ligne ` hY ligneCCA { for@int olonne@HAY olonne ` lY olonneCCA { out `` 4B4Y } out `` endlY } } int min@A { int lrgeurD huteurY out `` 4vrgeur du retngle X 4Y in bb lrgeurY out `` 4ruteur du retngle X 4Y in bb huteurY dessineetngle@lrgeurD huteurAY return HY

ne fois ompil e progrmme s9exute et donne pr exemple X


vrgeur du retngle X IT ruteur du retngle X Q BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB BBBBBBBBBBBBBBBB

oil l premire version d9un logiiel de dessin rvolutionnire 3 gette fontion ne fit qu90her du texteF ille n9 don ps esoin de renvoyer quelque hoseF g9est pour el qu9elle est dlre ve le type voidF yn peut filement modi(er l fontion pour qu9elle renvoie l surfe du retngleF e momentElD il fudr qu9elle renvoie un intF issyez de modi(er ette fontion 3 oii deux ides X IIH

PASSAGE PAR VALEUR ET PASSAGE PAR RFRENCE

! 0her un messge d9erreur si l huteur ou l lrgeur est ngtive Y ! jouter un rgument pour le symole utiliser dns le dessinF emusezEvous ienF sl est importnt de ien mtriser tous es oneptsF

Passage par valeur et passage par rfrence


v (n de e hpitre est onsre trois notions un peu plus vnesF ous pourrez toujours y revenir plus trd si nessireF

Passage par valeur


v premire des notions vnes dont je dois vous prler est l mnire dont l9ordinE teur gre l mmoire dns le dre des fontionsF renons une fontion simple qui joute simplement P l9rgument fourniF ous omE menez ien l onntreF te l9i don modi(e un poilF
int jouteheux@int A { CaPY return Y }

Utiliser += ici est volontairement bizarre ! Vous verrez tout de suite pourquoi.

estons don ette fontionF te pense ne rien vous pprendre en vous proposnt le ode suivnt X
5inlude `iostremb using nmespe stdY int jouteheux@int A { CaPY return Y } int min@A { int nomre@RAD resulttY resultt a jouteheux@nomreAY out `` 4ve nomre originl vut X 4 `` nomre `` endlY

III

CHAPITRE 7.

DCOUPER SON PROGRAMME EN FONCTIONS

out `` 4ve resultt vut X 4 `` resultt `` endlY return HY

gel donne sns surprise X


ve nomre originl vut X R ve resultt vut X T

v9tpe intressnte est ien sr e qui se psse l ligne resultat=ajouteDeux(nom ous vous rppelez les shms de l mmoire c sl est temps de les ressortirF vors de l9ppel l fontionD il se psse normment de hoses X IF ve progrmme vlue l vleur de nombreF sl trouve 4F PF ve progrmme alloue un nouvel espace dns l mmoire et y rit l vleur 4F get espe mmoire possde l9tiquette aD le nom de l vrile dns l fontionF QF ve progrmme entre dns l fontionF RF ve progrmme joute 2 l vrile aF SF v vleur de a est ensuite opie et 'ete l vrile resultatD qui vut don mintennt 6F TF yn sort lors de l fontionF ge qui est importntD 9est que l vrile nombre est opie dns une nouvelle se mmoireF yn dit que l9rgument a est pass par valeurF vorsque le progrmme se situe dns l fontionD l mmoire ressemle don e qui se trouve dns le shm de l (gure UFSF yn se retrouve don ve trois ses dns l mmoireF v9utre lment importnt est que l vrile nombre reste inhngeF i j9insiste sur es pointsD 9est ien sr pre que l9on peut fire utrementF
bre);F

Passage par rfrence


ous vous rppelez les rfrenes c yuiD ouiD es hoses izrres dont je vous i prl il y quelques hpitresF i vous n9tes ps srs de vousD n9hsitezEps vous rfrhir l mmoire @pge THAF g9est le moment de voir quoi servent es drles de tesF lutt que de opier l vleur de nombre dns l vrile aD il est possile d9jouter une  deuxime tiquette l vrile nombre l9intrieur de l fontionF it 9est ien sr une rfrene qu9il fut utiliser omme rgument de l fontionF
int jouteheux@int8 A GGxotez le petit 8 333 { CaPY return Y }

IIP

PASSAGE PAR VALEUR ET PASSAGE PAR RFRENCE

Figure UFS ! tt de l mmoire dns l fontion prs un pssge pr vleur

vorsque l9on ppelle l fontionD il n9y plus de opieF ve progrmme donne simplement un lis l vrile nombreF tetons un oup d9il l mmoire dns e s @(gure UFTAF gette foisD l vrile a et l vrile nombre sont onfonduesF yn dit que l9rgument a est pass par rfrenceF
Quel intrt y a-t-il faire un passage par rfrence ?

gel permet l fontion ajouteDeux() de modi(er ses rguments 3 ille pourr insi voir une in)uene durle sur le reste du progrmmeF issyons pour voirF eprenons le progrmme prdentD mis ve une rfrene omme rgumentF yn otient ette fois X
ve nomre originl vut X T ve resultt vut X T

ue s9estEil pss c g9est l fois simple et ompliquF gomme a et l vrile nom bre orrespondent l mme se mmoireD fire a+=2 modi( l vleur de nombr e 3 tiliser des rfrenes peut don tre trs dngereuxF g9est pour el qu9on ne les utilise que lorsqu9on en rellement esoinF IIQ

CHAPITRE 7.

DCOUPER SON PROGRAMME EN FONCTIONS

Figure UFT ! tt de l mmoire dns l fontion prs un pssge pr rfrene


Justement, est-ce qu'on pourrait avoir un exemple utile ?

t9y viensD j9y viensF xe soyez ps trop presssF v9exemple lssique est l fontion echan ge()F g9est une fontion qui hnge les vleurs des deux rguments qu9on lui fournit X
void ehnge@doule8 D doule8 A { doule temporire@AY GGyn suvegrde l vleur de 99 a Y GGyn remple l vleur de 99 pr elle de 99 a temporireY GGit on utilise l vleur suvegrde pour mettre l9nienne vleur de 99 dns 99 } int min@A { doule @IFPAD @RFSAY out `` 4 vut 4 `` `` 4 et vut 4 `` `` endlY ehnge@DAY GGyn utilise l fontion

out `` 4 vut 4 `` `` 4 et vut 4 `` `` endlY

IIR

PASSAGE PAR VALEUR ET PASSAGE PAR RFRENCE

return HY

ge ode donne le rsultt suivnt X


vut IFP et vut RFS vut RFS et vut IFP

ves vleurs des deux vriles ont t hngesF i l9on n9utilisit ps un pssge pr rfreneD e serient lors des copies des rguments qui serient hngesD et non les vris rgumentsF gette fontion serit don inutileF te vous invite tester ette fontion ve et sns les rfrenesF ous verrez insi prisment e qui se psseF A prioriD le pssge pr rfrene peut vous semler osur et ompliquF ous verrez pr l suite qu9il est souvent utilisF ous pourrez toujours revenir lire ette setion plus trd si les hoses ne sont ps enore vriment lires dns votre espritF

Avanc : Le passage par rfrence constante


uisque nous prlons de rfrenesD il fut qund mme que je vous prsente une pplition ien prtiqueF in fitD el nous ser surtout utile dns l suite de e ours mis nous pouvons dj prendre un peu d9vneF ve pssge pr rfrene o're un gros vntge sur le pssge pr vleur X uune opie n9est e'etueF smginez une fontion reevnt en rgument un stringF i votre hne de rtres ontient un trs long texte @l totlit de e livre pr exemple 3AD lors l opier v prendre du temps mme si tout el se psse uniquement dns l mmoire de l9ordinteurF gette opie est totlement inutile et il serit don ien de pouvoir l9liminer pour mliorer les performnes du progrmmeF it 9est l que vous me dites X  utilisons un pssge pr rfrene 3 F yuiD 9est une onne ideF in utilisnt un pssge pr rfreneD uune opie n9est e'etueF eulementD ette mnire de proder un petit dfut X elle utorise l modi(tion de l9rgumentF ih ouiD 9est justement dns e ut que les rfrenes existentF
void fI@string texteAY { } void fP@string8 texteAY { } GGsmplique une opie oteuse de 9texte9

GGsmplique que l fontion peut modifier 9texte9

v solution est d9utiliser e que l9on ppelle un passage par rfrence constanteF yn vite l opie en utilisnt une rfrene et l9on emphe l modi(tion de l9rgument en le dlrnt onstntF IIS

CHAPITRE 7.

DCOUPER SON PROGRAMME EN FONCTIONS

void fI@string onst8 texteAY { }

GGs de opie et ps de modifition possile

our l9instntD el peut vous semler osur et plutt inutileF hns l prtie ss de e oursD nous orderons l progrmmtion oriente ojet et nous utiliserons trs souvent ette tehniqueF ous pourrez toujours revenir lire es lignes e momentElF

Utiliser plusieurs chiers


hns l9introdutionD je vous i dit que le ut des fontions tit de pouvoir rutiliser les  riques dj resF our le momentD les fontions que vous svez rer se situent t de l fontion main()F yn ne peut don ps vriment les rutiliserF ve gCC permet de douper son progrmme en plusieurs (hiers souresF ghque (hier ontient une ou plusieurs fontionsF yn peut lors inlure les (hiersD et don les fontionsD dont on esoin dns di'rents projetsF yn insi rellement des riques spres utilisles pour onstruire di'rents progrmmesF

Les chiers ncessaires


our fire les hoses proprementD il ne fut ps un mis deux (hiers X ! un (hier soure dont l9extension est .cpp X il ontient le ode soure de l fontion Y ! un (hier d9enEtte dont l9extension est .h X il ontient uniquement l desription de l fontionD e qu9on ppelle le prototype de l fontionF grons don es deux (hiers pour notre lre fontion ajouteDeux() X
int jouteheux@int nomreeuA { int vleur@nomreeu C PAY } return vleurY

Le chier source

g9est le plus simple des deuxF ssez pr les menus File b New b FileF ghoisissez ensuite C/C++source @(gure UFUAF gliquez ensuite sur GoF gomme lors de l rtion du projetD le progrmme vous deE mnde lors si vous fites du g ou du gCCF ghoisissez C++ ien sr 3 pinlementD on vous demnde le nom du (hier rerF gomme pour toutD il vut mieux hoisir un nom intelligent pour ses (hiersF yn peut insi mieux s9y retrouverF our l fontion ajouteDeux()D je hoisis le nom math.cpp et je ple le (hier dns le mme dossier que mon (hier main.cppF IIT

UTILISER PLUSIEURS FICHIERS

Figure UFU ! grer un nouveu (hier soure

gohez ensuite toutes les options @(gure UFVAF

Figure UFV ! letion des options pour le (hier soure

gliquez sur FinishF otre (hier soure est mintennt rF ssons u (hier d9enE tteF IIU

CHAPITRE 7.

DCOUPER SON PROGRAMME EN FONCTIONS

Le chier d'en-tte

ve dut est qusiment identiqueF ssez pr les menus File b New b FileF letionE nez ensuite C/C++header @(gure UFWAF

Figure UFW ! grtion d9un (hier d9enEtte

hns l fentre suivnteD indiquez le nom du (hier rerF sl est onseill de lui donner le mme nom qu9u (hier soure mis ve une extension .h u lieu de .cppF hns notre sD e ser don math.hF lez le (hier dns le mme dossier que les deux utresF xe touhez ps le hmp juste enEdessous et n9ouliez ps de oher toutes les options @(gure UFIHAF gliquez sur FinishF it voil 3 ne fois que les deux (hiers sont rsD vous devriez les voir pprtre dns l olonne de guhe de gode: :floks @(gure UFIIAF
Le nom du projet sera certainement dirent dans votre cas.

Dclarer la fonction dans les chiers


wintennt que nous vons nos (hiersD il ne reste qu9 les remplirF IIV

UTILISER PLUSIEURS FICHIERS

Figure UFIH ! letion des options pour le (hier d9enEtte

Figure UFII ! ves nouveux (hiers du projet

IIW

CHAPITRE 7.

DCOUPER SON PROGRAMME EN FONCTIONS

Le chier source

te vous i dit que le (hier soure ontenit l dlrtion de l fontionF g9est un des lmentsF v9utre est plus ompliqu omprendreF ve ompilteur esoin de svoir que les (hiers .cpp et .h ont un lien entre euxF sl fut don ommener le (hier pr l ligne suivnte X
5inlude 4mthFh4

ous reonnissez ertinement ette ligneF ille indique que l9on v utiliser e qui se trouve dns le (hier math.hF
Il faut utiliser ici des guillemets " et non des chevrons < et > comme vous en aviez l'habitude jusque l.

ve (hier math.cpp u omplet est don X


5inlude 4mthFh4 int jouteheux@int nomreeuA { int vleur@nomreeu C PAY } return vleurY

Le chier d'en-tte

i vous regrdez le (hier qui t rD il n9est ps vide 3 sl ontient trois lignes mystrieuses X
5ifndef werrsxgvhih 5define werrsxgvhih 5endif GG werrsxgvhih

ges lignes sont l pour empher le ompilteur d9inlure plusieurs fois e (hierF ve ompilteur n9est prfois ps trs mlin et risque de tourner en rondF gette stue vite don de se retrouver dns ette situtionF sl ne fut don ps touher es lignes et surtoutD rire tout le ode entre la deuxime et la troisimeF IPH

UTILISER PLUSIEURS FICHIERS

Le texte en majuscules sera dirent pour chaque chier. C'est le texte qui apparat dans le champ que nous n'avons pas modi lors de la cration du chier. Si vous n'utilisez pas Code: :Blocks, vous n'aurez peut-tre pas automatiquement ces lignes dans vos chiers. Il faut alors les ajouter la main. Le mot en majuscule doit tre le mme sur les trois lignes o il apparat et chaque chier doit utiliser un mot dirent.

hns e (hierD il fut mettre e qu9on ppelle le prototype de l fontionF g9est l premire ligne de l fontionD elle qui vient vnt les oldesF yn opie le texte de ette ligne et on joute un pointEvirgule l (nF g9est don trs ourtF oii e que nous otenons pour notre fontion X
5ifndef werrsxgvhih 5define werrsxgvhih int jouteheux@int nomreeuAY 5endif GG werrsxgvhih

N'oubliez pas le point-virgule ici !

it 9est toutF sl ne nous reste qu9une seule hose fire X inlure tout el dns le (hier main.cppF i on ne le fit psD le ompilteur ne sur ps o trouver l fontion ajo uteDeux() lorsqu9on essier de l9utiliserF sl fut don jouter l ligne
5inlude 4mthFh4

u dut de notre progrmmeF gel donne X


5inlude `iostremb 5inlude 4mthFh4 using nmespe stdY int min@A { int @PAD@PAY out `` 4leur de out `` 4leur de a jouteheux@AY out `` 4leur de out `` 4leur de } return HY

X 4 `` `` endlY X 4 `` `` endlY X 4 `` `` endlY X 4 `` `` endlY

GGeppel de l fontion

IPI

CHAPITRE 7.

DCOUPER SON PROGRAMME EN FONCTIONS

On inclut toujours le chier d'en-tte (.h), jamais le chier source (.cpp).

it voil 3 xous vons mintennt rellement des riques spres utilisles dns pluE sieurs progrmmesF i vous voulez utiliser l fontion ajouteDeux() dns un utre projetD il vous su0r de opier les (hiers math.cpp et math.hF
On peut bien sr mettre plusieurs fonctions par chier. On les regroupe gnralement par catgories : les fonctions mathmatiques dans un chier, les fonctions pour l'achage d'un menu dans un autre chier et celles pour le dplacement d'un personnage de jeu vido dans un troisime. Programmer,
c'est aussi tre organis.

Documenter son code


evnt de terminer e hpitreD je veux juste vous prsenter un point qui peut semler futile @mis qui ne l9est psAF yn vous l9 dit ds le dutD il est importnt de mettre des ommentires dns son progrmme pour omprendre e qu9il fitF g9est prtiuliE rement vri pour les fontions puisque vous llez peutEtre utiliser des fontions rites pr d9utres progrmmeursF sl est don importnt de svoir e que font es fontions sns voir esoin de lire tout le ode 3 @ppelezEvousD le progrmmeur est finntF F F A gomme il y de l ple dns les (hiers d9enEtteD on en pro(te gnrlement pour y drire e que font les fontionsF yn y fit gnrlement (gurer trois hoses X IF e que fit l fontion Y PF l liste des ses rguments Y QF l vleur retourneF lutt qu9un long disoursD voii e qu9on pourrit rire pour l fontion ajouteDeux () X
5ifndef werrsxgvhih 5define werrsxgvhih GB B pontion qui joute P u nomre reu en rgument B E nomreeu X ve nomre uquel l fontion joute P B leur retourne X nomreeu C P BG int jouteheux@int nomreeuAY 5endif GG werrsxgvhih

fien srD dns e sD le desriptif est trs simpleF wis 9est une hitude qu9il fut prendreF g9est d9illeurs tellement ournt de mettre des ommentires dns les (hiers IPP

DES VALEURS PAR DFAUT POUR LES ARGUMENTS

.h qu9il existe des systmes qusiEutomtiques qui gnrent des sites we ou des livres

prtir de es ommentiresF ve lre systme doxygen utilise pr exemple l nottion suivnte X


GBB B rief pontion qui joute P u nomre reu en rgument B prm nomreeu ve nomre uquel l fontion joute P B return nomreeu C P BG int jouteheux@int nomreeuAY

our l9instntD el peut vous prtre un peu inutile mis vous verrez dns l prtie sss de e ours qu9voir une onne doumenttion est essentielF vous de hoisir l nottion que vous prfrezF

Des valeurs par dfaut pour les arguments


ves rguments de fontionsD vous ommenez onntreF te vous en prle depuis le dut du hpitreF vorsque une fontion trois rgumentsD il fut lui fournir trois vleurs pour qu9elle puisse fontionnerF ih ienD je vis vous montrer que e n9est ps toujours le sF oyons tout el ve l fontion suivnte X
int nomreheeondes@int heuresD int minutesD int seondesA { int totl a HY totl a heures B TH B THY totl Ca minutes B THY totl Ca seondesY } return totlY

gette fontion lule un nomre de seondes en fontion d9un nomre d9heuresD de minutes et de seondes qu9on lui trnsmetF ien de ien ompliqu 3 ves vriles heuresD minutes et secondes sont les paramtres de l fontion nombre DeSecondes()F ge sont des vleurs qu9elle reoitD elles ve lesquelles elle v trvillerF wis elD vous le svez djF

Les valeurs par dfaut


v nouveutD 9est qu9on peut donner des vleurs pr dfut ertins prmtres des fontionsF einsiD lorsqu9on ppelle une fontionD on ne ser ps olig d9indiquer hque fois tous les prmtres 3 IPQ

CHAPITRE 7.

DCOUPER SON PROGRAMME EN FONCTIONS

our ien voir omment on doit proderD on v regrder le ode ompletF t9imeris que vous l9riviez dns votre shi pour fire les tests en mme temps que moi X
5inlude `iostremb using nmespe stdY GG rototype de l fontion int nomreheeondes@int heuresD int minutesD int seondesAY GG win int min@A { out `` nomreheeondes@ID IHD PSA `` endlY } return HY

GG hfinition de l fontion int nomreheeondes@int heuresD int minutesD int seondesA { int totl a HY totl a heures B TH B THY totl Ca minutes B THY totl Ca seondesY } return totlY

ge ode donne le rsultt suivnt X


RPPS

hnt que I heure a QTHH seondesD IH minutes a THH seondesD PS seondes aF F F PS seondesD le rsultt est logique r 3600 + 600 + 25 = 4225F frefD tout v ienF wintenntD supposons que l9on veuille rendre ertins prmtres fulttifsD pr exemple pre qu9on utilise en prtique plus souvent les heures que le resteF yn v devoir modi(er le prototype de l fontion @et non s d(nitionD ttentionAF sndiquez l vleur pr dfut que vous voulez donner ux prmtres s9ils ne sont ps renseigns lors de l9ppel l fontion X
int nomreheeondes@int heuresD int minutes a HD int seondes a HAY

hns et exempleD seul le prmtre heures ser oligtoireD les deux utres tnt dsormis fulttifsF i on ne renseigne ps les minutes et les seondesD les vriles orrespondntes vudront lors H dns l fontionF IPR

DES VALEURS PAR DFAUT POUR LES ARGUMENTS

oii le ode omplet que vous devriez voir sous les yeux X
5inlude `iostremb using nmespe stdY GG rototype ve les vleurs pr dfut int nomreheeondes@int heuresD int minutes a HD int seondes a HAY GG win int min@A { out `` nomreheeondes@ID IHD PSA `` endlY } return HY

GG hfinition de l fontionD ex les vleurs pr dfut int nomreheeondes@int heuresD int minutesD int seondesA { int totl a HY totl a heures B TH B THY totl Ca minutes B THY totl Ca seondesY } return totlY

Si vous avez lu attentivement ce code, vous avez d vous rendre compte de quelque chose : les valeurs par dfaut sont spcies uniquement dans le prototype, pas dans la dnition de la fonction ! Si votre code est dcoup en plusieurs chiers, alors il ne faut spcier les valeurs par dfaut que dans le chier d'en-tte .h. On se fait souvent avoir, je vous prviens. . . Si vous vous trompez, le compilateur vous indiquera une erreur la ligne de la dnition de la fonction.

fonD e ode ne hnge ps euoup du prdentF prt les vleurs pr dfut dns le prototypeD rien n9 t modi( @et le rsultt l9rn ser toujours le mmeAF v nouveut mintenntD 9est qu9on peut supprimer des prmtres lors de l9ppel de l fontion @ii dns le main()AF yn peut pr exemple rire X
out `` nomreheeondes@IA `` endlY

ve ompilteur lit les prmtres de guhe droiteF gomme il n9y en qu9un et que seules les heures sont oligtoiresD il devine que l vleur 1 orrespond un nomre d9heuresF ve rsultt l9rn ser le suivnt X IPS

CHAPITRE 7.

DCOUPER SON PROGRAMME EN FONCTIONS

QTHH

wieux enoreD vous pouvez indiquer seulement les heures et les minutes si vous le dsirez X
out `` nomreheeondes@ID IHA `` endlY RPHH

nt que vous indiquez u moins les prmtres oligtoiresD il n9y ps de prolmeF

Cas particuliers, attention danger


fonD mine de rien il y qund mme quelques pigesD e n9est ps si simple que el 3 yn v voir es piges sous l forme de questions G rponses X
Et si je veux envoyer la fonction juste les heures et les secondes, mais pas les minutes ?

el quelD 9est impossileF in e'etD je vous l9i dit plus hutD le ompilteur nlyse les prmtres de guhe droiteF ve premier orrespondr forment ux heuresD le seond ux minutes et le troisime ux seondesF
Vous ne pouvez PAS crire :
out `` nomreheeondes@IDDPSA `` endlY

g9est interdit 3 i vous le fitesD le ompilteur vous fer omprendre qu9il n9pprie gure vos mnuvresF g9est insi X en gCCD on ne peut ps  suter des prmtresD mme s9ils sont fulttifsF i vous voulez indiquer le premier et le dernier prmtreD il vous fudr oligtoirement spi(er eux du milieuF yn devr don rire X
out `` nomreheeondes@ID HD PSA `` endlY

Est-ce que je peux rendre seulement les heures facultatives, et rendre les minutes et secondes obligatoires ?

i le prototype est d(ni dns le mme ordre que tout l9heure X nonF Les paramtres facultatifs doivent obligatoirement se trouver la n @ droiteAF ge ode ne ompiler don ps X IPT

DES VALEURS PAR DFAUT POUR LES ARGUMENTS

int nomreheeondes@int heures a HD int minutesD int seondesAY GGirreurD les prmtres pr dfut doivent tre droite

v solutionD pour rgler e prolmeD onsiste pler le prmtre heures l (n X


int nomreheeondes@int seondesD int minutesD int heures a HAY GGyu

Est-ce que je peux rendre tous mes paramtres facultatifs ?

yuiD el ne pose ps de prolme X


int nomreheeondes@int heures a HD int minutes a HD int seondes a HAY

hns e sD l9ppel de l fontion pourr s9rire omme ei X


out `` nomreheeondes@A `` endlY

ve rsultt renvoy ser ien entendu H dns le s iEdessusF

Rgles retenir
in rsumD il y P rgles que vous devez retenir pour les vleurs pr dfut X ! seul le prototype doit ontenir les vleurs pr dfut @ps l d(nition de l fontionA Y ! les vleurs pr dfut doivent se trouver l (n de l liste des prmtres @9estEEdire droiteAF

En rsum
! ne fontion est une portion de ode ontennt des instrutions et ynt un rle prisF ! ous les progrmmes ont u moins une fontion X main()F g9est elle qui s9exute u dmrrge du progrmmeF ! houper son progrmme en di'rentes fontions ynt hune un rle di'rent permet une meilleure orgnistionF ! ne mme fontion peut tre ppele plusieurs fois u ours de l9exution d9un progrmmeF ! ne fontion peut reevoir des informtions en entre @ppeles argumentsA et renvoyer un rsultt en sortie gre returnF ! ves fontions peuvent reevoir des rfrenes en rgument pour modi(er diretement une informtion prise en mmoireF IPU

CHAPITRE 7.

DCOUPER SON PROGRAMME EN FONCTIONS

! vorsque le progrmme grossitD il est onseill de rer plusieurs (hiers regroupnt des fontionsF ves (hiers .cpp ontiennent les d(nitions des fontions et les (hiers .hD plus ourtsD ontiennent leurs prototypesF ves (hiers .h permettent d9nnoner l9existene des fontions l9ensemle des utres (hiers du progrmmeF

IPV

Chapitre

8
Dicult :

Les tableaux

a ns de trs nombreux programmes, on a besoin d'avoir plusieurs variables du mme type et qui jouent quasiment le mme rle. Pensez par exemple la liste des utilisateurs d'un site web : cela reprsente une grande quantit de variables de type st ring. Ou les dix meilleurs scores de votre jeu, que vous stockerez dans direntes cases mmoires, toutes de type int. Le C++, comme presque tous les langages de programmation, propose un moyen simple de regrouper des donnes identiques dans un seul paquet. Et comme l'indique le titre du chapitre, on appelle ces regroupements de variables des tableaux. Dans ce chapitre, je vais vous apprendre manipuler deux sortes de tableaux. Ceux dont la taille est connue l'avance, comme pour la liste des dix meilleurs scores, et ceux dont la taille peut varier en permanence, comme la liste des visiteurs d'un site web qui, gnralement, ne cesse de grandir. Vous vous en doutez certainement, les tableaux dont la taille est xe l'avance sont plus faciles utiliser et c'est donc par eux que nous allons commencer.

IPW

CHAPITRE 8.

LES TABLEAUX

Les tableaux statiques


te vous i prl dns l9introdution de l9intrt des tleux pour le stokge de pluE sieurs vriles de mme typeF oyons el ve un exemple ien onnuD l liste des meilleurs sores du jeu rvolutionnire que vous llez rer un jourF

Un exemple d'utilisation
i vous voulez 0her l liste des S meilleurs sores des joueursD il v vous flloir en rlit deux listes X l liste des noms de joueurs et l liste des sores qu9ils ont otenusF xous llons don devoir dlrer IH vriles pour mettre toutes es informtions dns l mmoire de l9ordinteurF yn ur pr exemple X
string string string string string int int int int int nomweilleurtoueurI@4xno4AY nomweilleurtoueurP@4wdteoPI4AY nomweilleurtoueurQ@4elert iinstein4AY nomweilleurtoueurR@4ss xewton4AY nomweilleurtoueurS@4erhimede4AY

meilleuroreI@IIVPIVAY meilleuroreP@IHHRQPAY meilleuroreQ@VUQRUAY meilleuroreR@TRSPQAY meilleuroreS@QIRISAY

it pour 0her tout elD il v ussi flloir ps ml de trvilF


out out out out out `` `` `` `` `` 4IA 4PA 4QA 4RA 4SA 4 4 4 4 4 `` `` `` `` `` nomweilleurtoueurI nomweilleurtoueurP nomweilleurtoueurQ nomweilleurtoueurR nomweilleurtoueurS `` `` `` `` `` 4 4 4 4 4 4 4 4 4 4 `` `` `` `` `` meilleuroreI meilleuroreP meilleuroreQ meilleuroreR meilleuroreS `` `` `` `` `` endlY endlY endlY endlY endlY

gel fit normment de lignes 3 smginez mintennt que vous vouliez 0her les IHH meilleurs sores et ps seulement les S meilleursF ge serit terrileD il fudrit dlrer PHH vriles et rire IHH lignes qusiment identiques pour l90hge 3 eutnt rrter tout de suiteD 9est euoup trop de trvilF g9est l qu9interviennent les tleux X nous llons pouvoir dlrer les IHH meilleurs sores et les noms des IHH meilleurs joueurs d9un seul oupF yn v rer une seule se dns l mmoire qui ur de l ple pour ontenir les IHH int qu9il nous fut et une deuxime pour ontenir les IHH stringF wgique non c
Il faut quand mme que les variables aient un lien entre elles pour que l'utilisation d'un tableau soit justie. Mettre dans un mme tableau l'ge de votre chien et le nombre d'internautes connects n'est pas correct. Mme si ces deux variables sont des int.

IQH

LES TABLEAUX STATIQUES

hns et exempleD nous vons esoin de IHH vrilesD 9estEEdire IHH ples dns le tleuF g9est e qu9on ppelleD en termes tehniquesD l taille du tleuF i l tille du tleu reste inhnge et est (xe dns le ode soureD lors on prle d9un tableau statiqueF rfit 3 g9est e dont nous vons esoin pour notre liste des IHH meilleurs soresF

Dclarer un tableau statique


gomme toujours en gCCD une vrile est ompose d9un nom et d9un typeF gomme les tleux sont des vrilesD ette rgle reste vlleF sl fut juste jouter une proprit supplmentireD l tille du tleuF eutrement ditD le nomre de omprtiments que notre se mmoire v pouvoir ontenirF v dlrtion d9un tleu est trs similire elle d9une vrile @(gure VFIAF
Figure VFI ! hlrtion d9un tleu sttique

yn indique le typeD puis le nom hoisi et en(nD entre rohetsD l tille du tleuF oyons el ve un exempleF
5inlude `iostremb using nmespe stdY int min@A { int meilleuroreSY doule nglesringleQY } return HY

GGhlre un tleu de S int GGhlre un tleu de Q doule

oyons quoi ressemle l mmoire ve un de nos shms hituels @(gure VFPAF yn retrouve les deux zones mmoires ve leurs tiquettes misD ette foisD hque zone est doupe en ses X trois ses pour le tleu anglesTriangle et inq ses pour le tleu meilleurScoreF our l9instntD uune de es ses n9est initiliseF veur ontenu est don quelonqueF sl est glement possile de dlrer un tleu en utilisnt omme tille une constante de type int ou unsignedintF yn indique simplement le nom de l onstnte entre les rohetsD l ple du nomreF
int onst tilleleu@PHAY GGv tille du tleu doule nglessosgonetilleleuY

IQI

CHAPITRE 8.

LES TABLEAUX

Figure VFP ! v mmoire de l9ordinteur prs voir dlr deux tleux


Il faut imprativement utiliser une constante comme taille du tableau.

te vous onseille de toujours utiliser des onstntes pour exprimer les tilles de vos tleux plutt que d9indiquer diretement l tille entre les rohetsF g9est une onne hitude prendreF fonF xous vons de l ple dns l mmoireF sl ne nous reste plus qu9 l9utiliserF

Accder aux lments d'un tableau


ghque se d9un tleu peut tre utilise omme n9importe quelle utre vrileD il n9y uune di'reneF sl fut juste y der d9une mnire un peu spileF yn doit indiquer le nom du tleu et le numro de l seF hns le tleu meilleurScor eD on s inq vriles X l premire se de meilleurScoreD l deuximeD etD jusqu9 l inquimeF our der une seD on utilise l syntxe nomDuTableau[numeroDeLaCase]F sl y simplement une petite sutilit X l premire se possde le numro H et ps IF out est en quelque sorte dl de IF our der l troisime se de meilleurScore et y stoker une vleurD il fudr don rire X
meilleuroreP a SY

IQP

LES TABLEAUX STATIQUES

in e'etD 3 1 = 2 Y l troisime se possde don le numro PF i je veux remplir mon tleu des meilleurs sores omme dns l9exemple initilD je peux don rire X
int onst nomreweilleursores@SAY int meilleursoresnomreweilleursoresY meilleursoresH meilleursoresI meilleursoresP meilleursoresQ meilleursoresR a a a a a IIVPIVY IHHRQPY VUQRUY TRSPQY QIRISY GGemplissge GGemplissge GGemplissge GGemplissge GGemplissge GGv tille du tleu GGhlrtion du tleu de de de de de l l l l l premire se deuxime se troisime se qutrime se inquime se

Comme tous les numros de cases sont dcals, la dernire case a le numro 4 et pas 5 !

Parcourir un tableau
ve gros point fort des tleuxD 9est qu9on peut les prourir en utilisnt une ouleF yn peut insi e'etuer une tion sur hune des ses d9un tleuD l9une prs l9utre X pr exemple 0her le ontenu des sesF yn onnt a priori le nomre de ses du tleuD on peut don utiliser une oule forF xous llons pouvoir utiliser l vrile i de l oule pour der u ime lment du tleuF g9est fouD on dirit que 9est fit pour 3
int onst nomreweilleursores@SAY int meilleursoresnomreweilleursoresY meilleursoresH meilleursoresI meilleursoresP meilleursoresQ meilleursoresR a a a a a IIVPIVY IHHRQPY VUQRUY TRSPQY QIRISY GGemplissge GGemplissge GGemplissge GGemplissge GGemplissge GGv tille du tleu GGhlrtion du tleu de de de de de l l l l l premire se deuxime se troisime se qutrime se inquime se

for@int i@HAY i`nomreweilleursoresY CCiA { out `` meilleursoresi `` endlY }

v vrile i prend suessivement les vleurs HD ID PD Q et RD e qui veut dire que les vleurs de meilleursScores[0]D puis meilleursScores[1]D etF sont envoyes dns coutF IQQ

CHAPITRE 8.

LES TABLEAUX

Il faut faire trs attention, dans la boucle, ne pas dpasser la taille du tableau, sous peine de voir votre programme plante. La dernire case dans cet exemple a le numro nombreMeilleursScores moins un. Les valeurs autorises de i sont tous les entiers entre 0 et nombreMeilleursScores moins un compris.

ous llez voirD le ouple tleu G oule for v devenir votre nouveu meilleur miF in tout sD je l9espre X 9est un outil trs puissntF

Un petit exemple
ellezD je vous propose un petit exemple lgrement plus omplexeF xous llons utiliser le gCC pour luler l moyenne de vos notes de l9nneF te vous propose de mettre toutes vos notes dns un tleu et d9utiliser une oule for pour le lul de l moyenneF oyons don tout el tpe pr tpeF v premire tpe onsiste dlrer un tleu pour stoker les notesF gomme e sont des nomres virguleD il nous fut des doubleF
int onst nomrexotes@TAY doule notesnomrexotesY

v deuxime tpe onsiste remplir e tleu ve vos notesF t9espre que vous svez enore omment fire 3
int onst nomrexotes@TAY doule notesnomrexotesY notesH notesI notesP notesQ notesR notesS a a a a a a IPFSY IWFSY TFY IPY IRFSY ISY GGfieeeen 3 GGs ien 3

Je me rpte, mais c'est important : la premire case du tableau a le numro 0, la deuxime le numro 1, et ainsi de suite.

our luler l moyenneD il nous fut dditionner toutes les notes puis diviser le rsultt otenu pr le nomre de notesF xous onnissons dj le nomre de notesD puisque nous vons l onstnte nombreNotesF sl ne reste don qu9 dlrer une vrile pour ontenir l moyenneF ve lul de l somme s9e'etue dns une oule for qui prourt toutes les ses du tleuF IQR

LES TABLEAUX STATIQUES

doule moyenne@HAY for@int i@HAY i`nomrexotesY CCiA { moyenne Ca notesiY GGyn dditionne toutes les notes } GGin rrivnt iiD l vrile moyenne ontient l somme des notes @UWFSA GGsl ne reste don qu9 diviser pr le nomre de notes moyenne Ga nomrexotesY

eve une petite ligne pour l90hge de l vleurD on otient le rsultt voulu X un progrmme qui lule l moyenne de vos notesF
5inlude `iostremb using nmespe stdY int min@A { int onst nomrexotes@TAY doule notesnomrexotesY notesH notesI notesP notesQ notesR notesS a a a a a a IPFSY IWFSY TFY IPY IRFSY ISY GGfieeeen 3 GGs ien 3

doule moyenne@HAY for@int i@HAY i`nomrexotesY CCiA { moyenne Ca notesiY GGyn dditionne toutes les notes } GGin rrivnt iiD l vrile moyenne ontient l somme des notes @UWFSA GGsl ne reste don qu9 diviser pr le nomre de notes moyenne Ga nomrexotesY out `` 4otre moyenne est X 4 `` moyenne `` endlY } return HY

oyons e que el donne qund on l9exute X


otre moyenne est X IQFPS

it el mrhe 3 wis vous n9en doutiez psD ien sr c IQS

CHAPITRE 8.

LES TABLEAUX

Les tableaux et les fonctions


eh 3 ves fontionsF ous n9vez ps ouli e que 9est j9espreF sl fut qund mme que je vous en reprle un peuF gomme vous llez le voirD les tleux et les fontions ne sont ps les meilleurs mis du mondeF v premire restrition est qu9on ne peut pas crire une fonction qui renvoie un tableau statiqueF g9est impossileF v deuxime restrition est qu9un tleu sttique est toujours pass par rfrenceF it il n9y ps esoin d9utiliser l9esperluette @&A X 9est fit utomtiquementF gel veut dire queD lorsqu9on psse un tleu une fontionD ette dernire peut le modi(erF oii don une fontion qui reoit un tleu en rgumentF
void fontion@doule tleuA { GGFFF }

Il ne faut rien mettre entre les crochets.

wis e n9est ps tout 3 rs souventD on veut prourir le tleuD ve une oule for pr exempleF sl nous mnque une informtion ruileF ous voyez lquelle c v tille 3 l9intrieur de l fontion prdenteD il n9y uun moyen de onntre l tille du tleu 3 sl fut don imprativement ajouter un deuxime argument contenant la tailleF gel donne X
void fontion@doule tleuD int tilleleuA { GGFFF }

yuiD je sis 9est ennuyeuxF wis il ne fut ps vous en prendre moiD je n9i ps r le lnggeF our vous entrnerD je vous propose d9rire une fontion moyenne() qui lule l moyenne des vleurs d9un tleuF oii m version X
GB B pontion qui lule l moyenne des lments d9un tleu B E tleuX ve tleu dont on veut l moyenne B E tilleleuX v tille du tleu BG doule moyenne@doule tleuD int tilleleuA

IQT

LES TABLEAUX DYNAMIQUES

doule moyenne@HAY for@int i@HAY i`tilleleuY CCiA { moyenne Ca tleuiY GGyn dditionne toutes les vleurs } moyenne Ga tilleleuY return moyenneY

essez prl de es tleuxF ssons l suiteF

Les tableaux dynamiques


te vous vis dit que nous llions prler de deux sortes de tleux X eux dont l tille est (xe et eux dont l tille peut vrierD les tableaux dynamiquesF gertines hoses sont identiquesD e qui v nous viter de tout rpterF

Dclarer un tableau dynamique


v premire di'rene se situe u tout dut de votre progrmmeF sl fut jouter l ligne #include<vector> pour utiliser es tleuxF
cause de cette ligne, on parle souvent de vector la place de tableau dynamique. J'utiliserai parfois ce terme dans la suite.

v deuxime grosse di'rene se situe dns l mnire de dlrer un tleuF yn utilise l syntxe prsente en (gure VFQF
Figure VFQ ! hlrtion d9un vetor

r exempleD pour un tleu de S entiersD on rit X


5inlude `iostremb 5inlude `vetorb GGxe ps oulier 3 using nmespe stdY int min@A { vetor`intb tleu@SAY

IQU

CHAPITRE 8.

LES TABLEAUX

return HY

sl fut ii remrquer trois hoses X IF le type n9est ps le premier mot de l ligneD ontrirement ux utres vriles Y PF on utilise une nottion izrre ve un hevron ouvrnt et un hevron fermnt Y QF on rit l tille entre prenthses et non entre rohetsF gel veut dire que les hoses ne ressemlent ps vriment ux tleux sttiquesF gependntD vous llez voir queD pour prourir le tleuD le prinipe est similireF wis vnt elD il y deux stues ien prtiques svoirF yn peut diretement remplir toutes les ses du tleu en joutnt un deuxime rgument entre les prenthses X
vetor`intb tleu@SD QAY GGgre un tleu de S entiers vlnt tous Q vetor`stringb listexoms@IPD 4ns nom4AY GGgre un tleu de IP strings vlnt toutes  ns nom

yn peut dlrer un tleu sns ses en ne mettnt ps de prenthses du tout X


vetor`douleb tleuY GGgre un tleu de H nomre virgule

Euh. . . quoi sert un tableau vide ?

ppelezEvous que e sont des tleux dont l tille peut vrierF yn peut don jouter des ses pr l suiteF ettendez un peu et vous surez toutF

Accder aux lments d'un tableau


v dlrtion tit trs di'rente des tleux sttiquesF r ontreD l9s est exE tement identiqueF yn utilise nouveu les rohets et l premire se possde ussi le numro HF yn peut don rrire l9exemple de l setion prdente ve un vetor X
int onst nomreweilleursores@SAY GGv tille du tleu vetor`intb meilleursores@nomreweilleursoresAY GGhlrtion du tleu meilleursoresH meilleursoresI meilleursoresP meilleursoresQ meilleursoresR a a a a a IIVPIVY IHHRQPY VUQRUY TRSPQY QIRISY GGemplissge GGemplissge GGemplissge GGemplissge GGemplissge de de de de de l l l l l premire se deuxime se troisime se qutrime se inquime se

IQV

LES TABLEAUX DYNAMIQUES

vD je rois qu9on ne peut ps fire plus fileF

Changer la taille
introns mintennt dns le vif du sujet X fire vrier l tille d9un tleuF gommenons pr jouter des ses l (n d9un tleuF sl fut utiliser l fontion push_back()F yn rit le nom du tleuD suivi d9un point et du mot push_back veD entre prenthsesD l vleur qui v remplir l nouvelle seF
vetor`intb tleu@QDPAY GGn tleu de Q entiers vlnt tous P tleuFpushk@VAY GGyn joute une Rme se u tleu qui ontient l vleur V

oyons de plus prs e qui se psse dns l mmoire @(gure VFRAF

Figure VFR ! i'et d9un push_back sur un vetor

ne se supplmentire t joute u out du tleuD de mnire utomtiqueF g9est fou e que el peut tre intelligent un ordinteur prfoisF it ien sr on peut jouter euoup de ses l suite les unes des utresF
vetor`intb tleu@QDPAY GGn tleu tleuFpushk@VAY GGyn joute une tleuFpushk@UAY GGyn joute une tleuFpushk@IRAY GGit enore une de Q Rme Sme ve entiers vlnt tous P se qui ontient l vleur V se qui ontient l vleur U le nomre IR ette fois

GGve tleu ontient mintennt les nomres X P P P V U IR

Et ils ne peuvent que grandir, les vectors ?

IQW

CHAPITRE 8.

LES TABLEAUX

xon 3 fien sr que nonF ves rteurs du gCC ont pens toutF yn peut supprimer l dernire se d9un tleu en utilisnt l fontion pop_back() de l mme mnire que push_back()D suf qu9il n9y rien mettre entre les prenthsesF
vetor`intb tleu@QDPAY GGn tleu de Q entiers vlnt tous P tleuFpopk@AY GGit hop 3 lus que P ses tleuFpopk@AY GGit hop 3 lus que I se

Attention tout de mme ne pas trop supprimer de cases ! Un tableau ne peut pas contenir moins de 0 lments.

te rois que je n9i ps esoin d9en dire plus sur e sujetF sl nous reste qund mme un petit prolme rglerF gomme l tille peut hngerD on ne sit ps de mnire ertine omien d9lments ontient un tleuF reureusementD il y une fontion pour el X size()F eve tableau.size()D on rupre un entier orrespondnt u nomre d9lments de tableauF
vetor`intb tleu@SDRAY GGn tleu de S entiers vlnt tous R int onst tille@tleuFsize@AAY GGne vrile qui ontient l tille du tleu GGv tille peut vrier mis l vleur de ette vrile ne hnger ps GGyn utilise don une onstnte GG prtir d9iiD l onstnte 9tille9 vut don S

Retour sur l'exercice


te rois que le mieuxD pour se mettre tout el en tteD est de reprendre l9exerie du lul des moyennes mis en le rrivnt l  sue vetor F te vous lisse essyerF i vous n9y rrivez psD voii m solution X
5inlude `iostremb 5inlude `vetorb GGxe ps oulier 3 using nmespe stdY int min@A { vetor`douleb notesY GGn tleu vide notesFpushk@IPFSAY notesFpushk@IWFSAY notesFpushk@TAY notesFpushk@IPAY GGyn joute des ses ve les notes

IRH

LES TABLEAUX DYNAMIQUES

notesFpushk@IRFSAY notesFpushk@ISAY doule moyenne@HAY for@int i@HAY i`notesFsize@AY CCiA GGyn utilise notesFsize@A pour l limite de notre oule { moyenne Ca notesiY GGyn dditionne toutes les notes } moyenne Ga notesFsize@AY GGyn utilise nouveu notesFsize@A pour otenir le nomre de notes out `` 4otre moyenne est X 4 `` moyenne `` endlY } return HY

yn rit deux progrmmes qui font extement l mme hose de deux mnires di'rentesF g9est trs ourntD il y presque toujours plusieurs mnires de fire les hosesF ghun hoisit elle qu9il prfreF

Les vector et les fonctions


sser un tleu dynmique en rgument une fontion est euoup plus simple que pour les tleux sttiquesF gomme pour n9importe quel utre typeD il su0t de mettre vector<type> en rgumentF it 9est toutF qre l fontion size()D il n9y mme ps esoin d9jouter un deuxime rgument pour l tille du tleu 3 gel donne tout simplement X
GGne fontion reevnt un tleu d9entiers en rgument void fontion@vetor`intb A { GGFFF }

imple non c wis on peut qund mme fire mieuxF te vous i prlD u hpitre prdentD du pssge pr rfrene onstnte pour optimiser l opieF in e'etD si le tleu ontient euoup d9lmentsD le opier prendr du tempsF sl vut don mieux utiliser ette stueD e qui donne X
GGne fontion reevnt un tleu d9entiers en rgument void fontion@vetor`intb onst8 A { GGFFF }

IRI

CHAPITRE 8.

LES TABLEAUX

Dans ce cas, le tableau dynamique ne peut pas tre modi. Pour changer le contenu du tableau, il faut utiliser un passage par rfrence tout simple (sans le const donc).

Les tableaux multi-dimensionnels


te vous i dit en dut de hpitre que l9on pouvit rer des tleux de n9importe quoiF hes tleux d9entiersD des tleux de stringsD et insi de suiteF yn peut don rer des tleuxF F F de tleux 3 te vous vois d9ii froner les sourils et vous demnder quoi el peut ien servirF ne fois n9est ps outumeD je vous propose de ommener pr visuliser l mmoire @(gure VFSAF ous verrez peutEtre l9intrt de e onept pour le moins izrreF

Figure VFS ! n tleu iEdimensionnel dns l mmoire de l9ordinteur

v grosse se june reprsenteD omme hque foisD une vrileF gette foisD 9est un tleu de S lments dont j9i reprsent les ses en utilisnt des lignes pissesF l9intrieur de hune des sesD on trouve un petit tleu de R lments dont on ne onnt ps l vleurF wisD si vous regrdez ttentivement les points d9interrogtionD vous pouvez voir une grille rgulire 3 n tleu de tleu est don une grille de vrilesF it lD je pense que vous trouvez el tout de suite moins izrreF
On parle parfois de tableaux multi-dimensionnels plutt que de grilles. C'est pour souligner le fait que les variables sont arranges selon des axes X et Y et pas uniquement selon un seul axe.

IRP

LES TABLEAUX MULTI-DIMENSIONNELS

Dclaration d'un tableau multi-dimensionnel


our dlrer un tel tleuD il fut indiquer les dimensions les unes prs les utres entre rohets X
type nomleutilletille

hon pour reproduire le tleu du shmD on doit dlrer le tleu suivnt X


int tleuSRY

yu enore mieuxD en dlrnt des onstntes X


int onst tille@SAY int onst tille@RAY int tleutilletilleY

it 9est tout 3 g9est ien le gCCD non c

Accder aux lments


te suis sr que je n9i ps esoin de vous expliquer l suiteF ous vez srement devin tout seulF our der une se de notre grilleD il fut indiquer l position en et en de l se voulueF r exemple tableau[0][0] de l se enEs guhe de l grilleF tableau[0] [1] orrespond elle qui se trouve juste u dessusD lors que tableau[1][0] se situe diretement s droiteF
Comment accder la case situe en-haut droite ?

sl s9git de l dernire se dns l diretion horizontleF intre les premiers rohetsD il fut don mettre tilleEID 9estEEdire RF g9est glement l dernire se selon l9xe vertil X pr onsquentD entre les seonds rohetsD il fut spi(er tilleEIF einsiD el donne tableau[4][3]F

Aller plus loin


yn peut ien sr ller enore plus loin et rer des grilles triEdimensionnellesD voire mme plusF yn peut tout fit dlrer une vrile omme ei X
doule grilleixtremeSRTPUY

wis lD il ne fudr ps me demnder un dessinF te vous rssure qund mmeD il est rre de devoir utiliser des grilles plus de Q dimensionsF yu lorsD 9est que vous prvoyez de fire des progrmmes vriment ompliqusF IRQ

CHAPITRE 8.

LES TABLEAUX

Les strings comme tableaux


evnt de terminer e hpitreD il fut qund mme que je vous fsse une petite rvlE tionF ves hnes de rtres sont en fit des tleux 3 yn ne le voit ps lors de l dlrtionD 9est ien hF wis il s9git en fit d9un tleu de lettresF sl y mme euoup de points ommuns ve les vectorF

Accder aux lettres


v9intrt de voir une hne de rtres omme un tleu de lettresD 9est qu9on peut der es lettres et les modi(erF it je ne vis ps vous surprendreD on utilise ussi les rohetsF
5inlude `iostremb 5inlude `stringb using nmespe stdY int min@A { string nomtilisteur@4tulien4AY out `` 4ous etes 4 `` nomtilisteur `` 4F4 ``endlY nomtilisteurH a 9v9Y nomtilisteurP a 99Y GGyn modifie l premire lettre GGyn modifie l troisime lettre

out `` 4eh nonD vous etes 4 `` nomtilisteur `` 434 `` endlY } return HY

estons pour voir X


ous etes tulienF eh nonD vous etes vuien3

g9est fort 3 wis on peut fire enore mieuxF F F

Les fonctions
yn peut glement utiliser size() pour onntre le nomre de lettres et push_back() pour jouter des lettres l (nF v enoreD 9est omme ve vectorF
string texte@4ortez e whisky u vieux juge lond qui fumeF4AY GGRT rtres out `` 4gette phrse ontient 4 `` texteFsize@A `` 4 lettresF4 `` endlY

IRR

LES STRINGS COMME TABLEAUX

wis ontrirement ux tleuxD on peut jouter plusieurs lettres d9un oupF it on utilise le +=F
5inlude `iostremb 5inlude `stringb using nmespe stdY int min@A { string prenom@4elert4AY string nom@4iinstein4AY string totlY totl Ca prenomY totl Ca 4 4Y totl Ca nomY GGne hne vide GGyn joute le prnom l hne vide GGuis un espe GGit finlement le nom de fmille

out `` 4ous vous ppelez 4 `` totl `` 4F4 `` endlY } return HY

gel donne ien sr X


ous vous ppelez elert iinsteinF

g9est fou e que 9est ien le gCC prfois 3

En rsum
! ves tleux sont des suessions de vriles en mmoireF n tleu R ses orrespond don en mmoire R vriles les unes l suite des utresF ! n tleu s9initilise omme ei X intmeilleurScore[4]; @pour R sesAF ! v premire se est toujours numrote H @meilleurScore[0]AF ! i l tille du tleu est suseptile de vrierD rez un tleu dynmique de type vector X vector<int>tableau(5);F ! yn peut rer des tleux multiEdimensionnelsF r exempleD inttableau[5][4]; revient rer un tleu de S lignes et R olonnesF ! ves hnes de rtres string peuvent tre onsidres omme des tleuxF ghune des ses orrespond un rtreF

IRS

CHAPITRE 8.

LES TABLEAUX

IRT

Chapitre

9
Dicult :

Lire et modier des chiers

our l'instant, les programmes que nous avons crits taient encore relativement simples. C'est normal, vous dbutez. Mais avec un peu d'entranement, vous seriez capables de crer de vraies applications. Vous commencez connatre les bases du C++ mais il vous manque quand mme un lment essentiel : l'interaction avec des chiers. Jusqu' maintenant, vous avez appris crire dans la console et rcuprer ce que l'utilisateur avait saisi. Vous serez certainement d'accord avec moi, ce n'est pas susant. Pensez des logiciels comme le bloc-note, votre IDE ou encore un tableur : ce sont tous des programmes qui savent lire des chiers et crire dedans. Et mme dans le monde des jeux vido, on a besoin de cela : il y a bien sr les chiers de sauvegardes, mais aussi les images d'un jeu, les cinmatiques, les musiques, etc. En somme, un programme qui ne sait pas interagir avec des chiers risque d'tre trs limit. Voyons donc comment faire ! Vous verrez : si vous matrisez l'utilisation de cin et de cout, alors vous savez dj presque tout.

IRU

CHAPITRE 9.

LIRE ET MODIFIER DES FICHIERS

crire dans un chier


v premire hose fire qund on veut mnipuler des (hiersD 9est de les ouvrirF ih ien en gCCD 9est l mme hoseF ne fois le (hier ouvertD tout se psse omme pour cout et cinF xous llonsD pr exempleD retrouver les hevrons  et F pitesEmoi on(neD vous llez rpidement vous y retrouverF yn prle de ux pour dsigner les moyens de ommunition d9un progrmme ve l9extrieurF hns e hpitreD nous llons don prler des ux vers les chiersF wis dites simplement  lire et modi(er des (hiers qund vous n9tes ps dns une soire de progrmmeursF YEA

L'en-tte fstream
gomme d9hitude en gCCD qund on esoin d9une fontionnlitD il fut ommenE er pr inlure le on (hier d9enEtteF our les (hiersD il fut spi(er #include <fstream> enEhut de notre ode soureF
Vous connaissez dj iostream qui contient les outils ncessaires aux entres/sorties vers la console. iostream signie en ralit input/output stream, ce qui veut dire  ux d'entres/sorties  en franais. fstream correspond le stream,  ux vers les chiers  en bon franais.

v priniple di'rene est qu9il fut un ux par chierF oyons omment rer un )ux sortntD 9estEEdire un )ux permettnt d9rire dns un (hierF

Ouvrir un chier en criture


ves )ux sont en rlit des objetsF ouvenezEvous que le gCC est un lngge orient objetF oii don un de es fmeux ojetsF x9yez ps peurD il y ur plusieurs hpitres pour en prlerF our l9instntD voyez el omme de grosses vriles mlioresF ges ojets ontiennent euoup d9informtions sur les (hiers ouverts et proposent des fontionnlits omme fermer le (hierD retourner u dut et ien d9utres enoreF v9importnt pour nous est que l9on dlre un )ux extement de l mme mnire qu9une vrileD une vrile dont le type serit ofstream et dont l vleur serit le hemin d9s du (hier lireF
5inlude `iostremb 5inlude `fstremb using nmespe stdY int min@A { ofstrem monplux@4gXGxnoGsoresFtxt4AY GGhlrtion d9un flux permettnt d9rire dns le fihier

IRV

CRIRE DANS UN FICHIER

GG gXGxnoGsoresFtxt return HY

t9i indiqu entre guillemets le hemin d9s u (hierF ge hemin doit prendre l9une ou l9utre des deux formes suivntes X ! n hemin soluD 9estEEdire montrnt l9emplement du (hier depuis l rine du disqueF r exemple X C:/Nanoc/C++/Fichiers/scores.txtF ! n hemin reltifD 9estEEdire montrnt l9emplement du (hier depuis l9endroit o se situe le progrmme sur le disqueF r exemple X Fichiers/scores.txt si mon progrmme se situe dns le dossier C:/Nanoc/C++/F prtir de lD on peut utiliser le )ux pour rire dns le (hierF
Si le chier n'existait pas, le programme le crerait automatiquement !

ve plus souventD le nom du (hier est ontenu dns une hne de rtres stringF hns e sD il fut utiliser l fontion c_str() lors de l9ouverture du (hierF
string onst nompihier@4gXGxnoGsoresFtxt4AY ofstrem monplux@nompihierFstr@AAY GGhlrtion d9un flux permettnt d9rire dns un fihierF

hes prolmes peuvent survenir lors de l9ouverture d9un (hierD si le (hier ne vous pprtient ps ou si le disque dur est plein pr exempleF g9est pour el qu9il fut toujours tester si tout s9est ien pssF yn utilise pour el l syntxe if(monFlux)F i e test n9est ps vriD lors 9est qu9il y eu un prolme et que l9on ne peut ps utiliser le (hierF
ofstrem monplux@4gXGxnoGsoresFtxt4AY GGyn essye d9ouvrir le fihier

if@monpluxA GGyn teste si tout est yu { GGout est yuD on peut utiliser le fihier } else { out `` 4iiX smpossile d9ouvrir le fihierF4 `` endlY }

out est don prt pour l9ritureF it vous llez voir que e n9est ps vriment nouveuF IRW

CHAPITRE 9.

LIRE ET MODIFIER DES FICHIERS

crire dans un ux


te vous vis dit que tout tit omme pour coutF g9est don sns surprise que je vous prsente le moyen d9envoyer des informtions dns un )ux X e sont les hevrons @A qu9il fut utiliserF
5inlude `iostremb 5inlude `fstremb 5inlude `stringb using nmespe stdY int min@A { string onst nompihier@4gXGxnoGsoresFtxt4AY ofstrem monplux@nompihierFstr@AAY if@monpluxA { monplux `` 4fonjourD je suis une phrse rite dns un fihierF4 `` endlY monplux `` RPFIQQU `` endlY int ge@PQAY monplux `` 4t9i 4 `` ge `` 4 nsF4 `` endlY } else { out `` 4iiX smpossile d9ouvrir le fihierF4 `` endlY } return HY

i j9exute e progrmmeD je retrouve ensuite sur mon disque un (hier scores.txt dont le ontenu est prsent en (gure WFIF

Figure WFI ! ve (hier une fois qu9il t rit

issyez pr vousEmmes 3 ous pouvez pr exemple rire un progrmme qui demnde l9utilisteur son nom et son ge et qui rit es donnes dns un (hierF ISH

LIRE UN FICHIER

Les dirents modes d'ouverture


sl ne nous reste plus qu9un petit point rglerF
Que se passe-t-il si le chier existe dj ?

sl ser supprim et rempl pr e que vous rivezD e qui est prolmtique si l9on souhite jouter des informtions l (n d9un (hier prEexistntF ensez pr exemple un (hier qui ontiendrit l liste des tions e'etues pr l9utilisteur X on ne veut ps tout e'er hque foisD on veut juste y jouter des lignesF our pouvoir rire l (n d9un (hierD il fut le spi(er lors de l9ouverture en joutnt un deuxime prmtre l rtion du )ux X ofstreammonFlux("C:/Nanoc/scores .txt",ios::app);F
app est un raccourci pour append, le verbe anglais qui signie  ajouter la n .

eve elD plus de prolme d9rsement des donnes X tout e qui ser rit ser jout l (nF

Lire un chier
xous vons ppris rire dns un (hierD voyons mintennt omment fontionne l leture d9un (hierF ous llez voirD e n9est ps trs di'rent de e que vous onnissez djF

Ouvrir un chier en lecture. . .


ve prinipe est extement le mme X on v simplement utiliser un ifstream u lieu d9un ofstreamF sl fut glement tester l9ouvertureD (n d9viter les erreursF
ifstrem monplux@4gXGxnoGgCCGdtFtxt4AY GGyuverture d9un fihier en leture if@monpluxA { GGout est prt pour l letureF } else { out `` 4iiX smpossile d9ouvrir le fihier en letureF4 `` endlY }

ISI

CHAPITRE 9.

LIRE ET MODIFIER DES FICHIERS

ien de ien nouveuF

. . . et le lire
sl y trois mnires di'rentes de lire un (hier X IF vigne pr ligneD en utilisnt getline() Y PF wot pr motD en utilisnt les hevrons >> Y QF grtre pr rtreD en utilisnt get()F oyons es trois mthodes en dtilF
Lire ligne par ligne

v premire mthode permet de ruprer une ligne entire et de l stoker dns une hne de rtresF
string ligneY getline@monpluxD ligneAY GGyn lit une ligne omplte

ve fontionnement est extement le mme qu9ve cinF ous svez don dj toutF
Lire mot par mot

v deuxime mnire de fireD vous l onnissez ussiF gomme je suis gentilD je vous propose qund mme un petit rppelF
doule nomreY monplux bb nomreY GGvit un nomre virgule depuis le fihier string motY monplux bb motY GGvit un mot depuis le fihier

gette mthode lit e qui se trouve entre l9endroit o l9on se situe dns le (hier et l9espe suivntF ge qui est lu est lors trduit en doubleD int ou string selon le type de vrile dns lequel on ritF
Lire caractre par caractre

pinlementD il nous reste l dernire mthodeD l seule rellement nouvelleF wis elle est tout ussi simpleD je vous rssureF
hr Y monpluxFget@AY

ISP

LIRE UN FICHIER

ge ode lit une seule lettre et l stoke dns l vrile aF


Cette mthode lit rellement tous les caractres. Les espaces, retours la ligne et tabulations sont, entre autres, lus par cette fonction. Bien que bizarres, ces caractres seront nanmoins stocks dans la variable.

Lire un chier en entier


yn veut trs souvent lire un (hier en entierF te vous i montr omment lireD mis ps omment s9rrter qund on rrive l (n 3 our svoir si l9on peut ontinuer lireD il fut utiliser l vleur renvoye pr l fontion getline()F in e'etD en plus de lire une ligneD ette fontion renvoie un bool indiqunt si l9on peut ontinuer lireF i l fontion renvoie trueD tout v ienD l leture peut ontinuerF i elle renvoie falseD 9est qu9on est rriv l (n du (hier ou qu9il y eu une erreurF hns les deux sD il fut s9rrter de lireF ous vous rppelez des oules c yn herhe lire le (hier tant qu' on n9 ps tteint l (nF v oule while est don le meilleur hoixF oii omment fire X
5inlude `iostremb 5inlude `fstremb 5inlude `stringb using nmespe stdY int min@A { ifstrem fihier@4gXGxnoGfihierFtxt4AY if@fihierA { GGv9ouverture s9est ien psseD on peut don lire string ligneY GGne vrile pour stoker les lignes lues while@getline@fihierD ligneAA GGnt qu9on n9est ps l finD on lit { out `` ligne `` endlY GGit on l9ffihe dns l onsole GGyu lors on fit quelque hose ve ette ligne GG vous de voir }

} else { out `` 4iiX smpossile d9ouvrir le fihier en letureF4 `` endlY } return HY

ISQ

CHAPITRE 9.

LIRE ET MODIFIER DES FICHIERS

gopier e ode gode we X PTUWWH  ne fois que l9on lu les lignesD on peut les mnipuler filementF siD je me ontente d90her les lignes misD dns un progrmme rel on les utiliserit utrementF v seule limite est votre imgintionF g9est l mthode l plus utilise pour lire un (hierF ne fois que l9on rupr les lignes dns une vrile stringD on peut filement trviller dessus gre ux fontions utilisles sur les hnes de rtresF

Quelques astuces
sl ne reste que quelques stues voir et vous surez lors tout e qu9il fut sur les (hiersF

Fermer prmaturment un chier


te vous i expliqu en tout dut de hpitre omment ouvrir un (hierF wis je ne vous i ps montr omment le refermerF ge n9est ps un ouli de m prtD il s9vre juste que e n9est ps nessireF ves (hiers ouverts sont utomtiquement referms lorsque l9on sort du lo o le )ux est dlrF
void f@A { ofstrem flux@4gXGxnoGdtFtxt4AY GGtilistion du fihier } GGvorsque l9on sort du loD le fihier est utomtiquement referm GGve fihier est ouvert

sl n9y don rien fireF euun risque d9oulier de refermer le (hier ouvertF sl rrive pr ontre qu9on it esoin de fermer le (hier vnt s fermeture utomtiqueF sl fut lors utiliser l fontion close() des )uxF
void f@A { ofstrem flux@4gXGxnoGdtFtxt4AY GGtilistion du fihier fluxFlose@AY GGyn referme le fihier GGyn ne peut plus rire dns le fihier prtir d9ii GGve fihier est ouvert

ISR

QUELQUES ASTUCES

he l mme mnireD il est possile de retrder l9ouverture d9un (hier prs l dlE rtion du )ux en utilisnt l fontion open()F
void f@A { ofstrem fluxY GGn flux sns fihier ssoi fluxFopen@4gXGxnoGdtFtxt4AY GGtilistion du fihier fluxFlose@AY GGyn referme le fihier GGyn ne peut plus rire dns le fihier prtir d9ii GGyn ouvre le fihier gXGxnoGdtFtxt

gomme vous le voyezD 9est trs simpleF outefoisD dns l mjorit des sD 9est inutileF yuvrir diretement le (hier et le lisser se fermer utomtiquement su0tF
Certaines personnes aiment utiliser open() et close(), alors que ce n'est pas ncessaire. On peut ainsi mieux voir o le chier est ouvert et o il est referm. C'est une question de got, vous de voir ce que vous prfrez.

Le curseur dans le chier


longeons un petit peu plus dns les dtils tehniques et voyons omment se droule l letureF und on ouvre un (hier dns le loEnoteD pr exempleD il y un urseur qui indique l9endroit o l9on v rireF hns l (gure WFPD le urseur se situe prs les deux  s sur l qutrime ligneF

Figure WFP ! osition du urseur

i l9on tpe sur une touhe du lvierD une lettre ser joute et endroit du (hierF t9imgine que je ne vous pprends rien en disnt elF ge qui est plus intressntD 9est qu9en gCC il y ussiD en quelque sorteD un urseurF vorsque l9on rit l ligne suivnte X
ifstrem fihier@4gXGxnoGsoresFtxt4A

ISS

CHAPITRE 9.

LIRE ET MODIFIER DES FICHIERS

le (hier C:/Nanoc/scores.txt est ouvert et le urseur est pl tout u dut du (hierF i on lit le premier mot du (hierD on otient ien sr l hne de rtres  xno puisque 9est le premier mot du (hierF ge fisntD le  urseur gCC se dple jusqu9u dut du mot suivntD omme l (gure WFQF

Figure WFQ ! ve urseur t dpl

ve mot suivnt qui peut tre lu est don  X D puis  IIVPIV D et insi de suite jusqu9 l (nF yn est don olig de lire un (hier dans l'ordreF ge n9est ps trs prtiqueF reureusementD il existe des moyens de se dpler dns un (hierF yn peut pr exemple dire  je veux pler le urseur PH rtres prs le dut ou  je veux vner le urseur de QP rtres F yn peut insi lire uniquement les prties qui nous intressent rellementF v premire hose fire est de svoir o se situe le urseurF hns un deuxime tempsD on pourr le dplerF

Connatre sa position
sl existe une fontion permettnt de svoir quel otet du (hier on se trouveF eutreE ment ditD elle permet de svoir quel rtre du (hier on se situeF wlheureusementD ette fontion n9 ps le mme nom pour les )ux entrnt et sortnt etD en plusD e sont des noms izrresF te vous i mis les noms des deux fontions dns un petit tleu
Pour ifstream Pour ofstream
tellg() tellp()

in revnheD elles s9utilisent toutes les deux de l mme mnireF


ofstrem fihier@4gXGxnoGdtFtxt4AY int position a fihierFtellp@AY GGyn rupre l position out `` 4xous nous situons u 4 `` position `` 4eme rtere du fihierF4 `` endlY

IST

QUELQUES ASTUCES

Se dplacer
v enoreD il existe deux fontionsD une pour hque type de )uxF
Pour ifstream Pour ofstream
seekg() seekp()

illes s9utilisent de l mme mnireD je ne vous prsente don qu9une des deux versionsF ges fontions reoivent deux rguments X une position dns le (hier et un nomre de rtres ajouter ette position X
fluxFseekp@nomregrteresD positionAY

ves trois positions possiles sont X ! le dut du (hier X ios::beg Y ! l (n du (hier X ios::end Y ! l position tuelle X ios::curF iD pr exempleD je souhite me pler IH rtres prs le dut du (hierD j9utilise flux.seekp(10,ios::beg);F i je souhite ller PH rtres plus loin que l9endroit o se situe le urseurD j9utilise flux.seekp(20,ios::cur);F te pense que vous vez omprisF oil don notre prolme de leture rsoluF

Connatre la taille d'un chier


gette troisime stue utilise en rlit les deux prdentesF our onntre l tille d9un (hierD on se dple l (n et on demnde u )ux de nous dire o il se trouveF ous voyez omment fire c fonD je vous montreF
5inlude `iostremb 5inlude `fstremb using nmespe stdY int min@A { ifstrem fihier@4gXGxnoGmeilleursoresFtxt4AY GGyn ouvre le fihier fihierFseekg@HD iosXXendAY GGyn se dple l fin du fihier int tilleY tille a fihierFtellg@AY GGyn rupre l position qui orrespond don l tille du fihier 3 out `` 4ille du fihier X 4 `` tille `` 4 otetsF4 `` endlY } return HY

ISU

CHAPITRE 9.

LIRE ET MODIFIER DES FICHIERS

te suis sr que vous le sviez 3 oilD on fit le tour des notions priniplesF ous tes prts vous lner seuls dns le vste monde des (hiersF

En rsum
! in gCCD pour lire ou rire dns un (hierD on doit inlure le (hier d9enEtte <fstream>F ! yn doit rer un ojet de type ofstream pour ouvrir un (hier en riture et ifstream pour l9ouvrir en letureF ! v9riture se fit omme ve cout X monFlux<<"Texte"; tndis que l leture se fit omme ve cin X monFlux>>variable;F ! yn peut lire un (hier ligne pr ligne ve getline()F ! ve urseur indique quelle position vous tes u sein du (hierD pendnt une oprE tion de leture ou d9ritureF eu esoinD il est possile de dpler e urseurF

ISV

Chapitre

10
Dicult :

TP : le mot mystre

epuis le dbut de ce cours sur le C++, vous avez dcouvert de nombreuses notions : le compilateur, l'IDE, les variables, les fonctions, les conditions, les boucles. . . Vous avez pu voir des exemples d'utilisation de ces notions au fur et mesure mais est-ce que vous avez pris le temps de crer un vrai programme pour vous entraner ? Non ? Eh bien c'est le moment de s'y mettre ! On trouve rgulirement des TP au milieu des cours du Site du Zro. Celui-ci ne fait pas exception. Le but ? Vous forcer vous lancer  pour de vrai  dans la programmation !

ISW

CHAPITRE 10.

TP : LE MOT MYSTRE

ve sujet de e n9est ps trs ompliqu mis promet d9tre musnt X nous llons mlnger les lettres d9un mot et demnder un joueur de retrouver le mot  mystre qui se he derrire es lettres @(gure IHFIAF

Figure IHFI ! ve mot mystre

Prparatifs et conseils
ve jeu que nous voulons rliser onsiste retrouver un mot dont les lettres ont t mlngesF g9est simple en pprene mis il v nous flloir utiliser des notions que nous vons douvertes dns les hpitres prdents X ! les vriles string Y ! les fontions Y ! les strutures de ontrle @oulesD onditionsF F F AF x9hsitez ps relire rpidement es hpitres pour ien tre dns le in vnt de ommener e 3

Principe du jeu  Le mot mystre 


xous voulons rliser un jeu qui se droule de l fon suivnte X IF ve joueur I sisit un mot u lvier Y PF v9ordinteur mlnge les lettres du mot Y QF ve joueur P essie de deviner le mot d9origine prtir des lettres mlngesF oii un exemple de prtie du jeu que nous llons rliser X
isissez un mot wii uel est e mot c wii iiw ge n9est ps le mot 3 uel est e mot c wii wii

ITH

PRPARATIFS ET CONSEILS

ge n9est ps le mot 3 uel est e mot c wii wii frvo 3

IF hns ette prtieD le joueur I hoisit  wii omme mot devinerF PF v9ordinteur mlnge les lettres et demnde u joueur P de retrouver le mot qui se he derrire  wii F QF ve joueur P essie de trouver le motF siD il y prvient u out de Q essis X @A iiw X on lui dit que e n9est ps el @A wii X l non plus @A wii X l on lui dit rvo r il trouvD et le progrmme s9rrteF fien srD en l9ttD le joueur P peut filement lire le mot sisi pr le joueur IF xous verrons l (n du omment nous pouvons mliorer elF

Quelques conseils pour bien dmarrer


und on lhe un dutnt dns l nture l premire foisD ve omme seule insE trution  ellezD odeEmoi el D il est en gnrl ssez dsemprF  r quoi doisEje ommener c D  u9estEe que je dois fireD qu9estEe que je dois utiliser c F frefD il ne sit ps du tout omment s9y prendre et 9est ien norml vu qu9il n9 jmis fit elF wis moiD je n9i ps envie que vous vous perdiez 3 te vis don vous donner une srie de onseils pour que vous soyez prprs u mieuxF fien entenduD e sont juste des onseilsD vous en fites e que vous voulezF
Reprez les tapes du programme

te vous i drit un peu plus tt les Q tpes du progrmme X IF isie du mot deviner Y PF wlnge des lettres Y QF foule qui se rpte tnt que le mot mystre n9 ps t trouvF ges tpes sont en fit ssez indpendntesF lutt que d9essyer de rliser tout le progrmme d9un oupD pourquoi n9essyeriezEvous ps de fire hque tpe indpenE dmment des utres c IF v9tpe I est trs simple X l9utilisteur doit sisir un mot qu9on v stoker en mmoire @dns une vrile de type stringD r 9est le type dptAF i vous onnissez cout et cinD vous ne mettrez ps plus de quelques minutes rire le ode orrespondntF ITI

CHAPITRE 10.

TP : LE MOT MYSTRE

PF v9tpe P est l plus omplexe X vous vez un string qui ontient un mot omme  wii et vous voulez ltoirement mlnger les lettres pour otenir quelque hose omme  wii F gomment fire c te vis vous ider un peu pour el r vous devez utiliser ertines hoses que nous n9vons ps vuesF QF v9tpe Q est de di0ult moyenne X vous devez rer une oule qui demnde de sisir un mot et qui le ompre u mot mystreF v oule s9rrte ds que le mot sisi est identique u mot mystreF
Crez un canevas de code avec les tapes

gomme vous le svezD tous les progrmmes ontiennent une fontion main()F rivez ds mintennt des ommentires pour sprer les priniples tpes du progrmmeF gel devrit donner quelque hose de omprle u squelette iEdessous X
int min@A { GGI X yn demnde de sisir un mot GGP X yn mlnge les lettres du mot GGQ X yn demnde l9utilisteur quel est le mot mystre } return HY

vous de rliser les tpes 3 our y ller en di0ult roissnteD je vous onseille de fire d9ord l9tpe ID puis l9tpe Q et en(n l9tpe PF vorsque vous urez rlis les tpes I et QD le progrmme vous demnder un mot et vous devrez le ressisirF ge ne ser ps trs musnt misD de ette mnireD vous pourrez vlider les premires tpes 3 x9hsitez don ps y ller ps ps 3 giEdessous un peru du progrmme  intermdiire ve seulement les tpes I et Q rlises X
isissez un mot wii uel est e mot c iiw ge n9est ps le mot 3 uel est e mot c wii ge n9est ps le mot 3 uel est e mot c wii frvo 3

ITP

PRPARATIFS ET CONSEILS

gomme vous le voyezD le progrmme ne propose ps enore le mot ve les lettres mlngesD mis si vous rrivez dj fire elD vous vez fit SH7 du trvil 3

Un peu d'aide pour mlanger les lettres


v9tpe de mlnge des lettres est l plus  di0ile @si je puis dire 3A de e F te vous donne quelques informtions et onseils pour rliser ette fmeuse tpe PF
Tirer un nombre au hasard

our que les lettres soient ltoirement mlngesD vous llez devoir tirer un nomre u hsrdF xous n9vons ps ppris le fire uprvntD il fut don que je vous explique omment el fontionneF ! vous devez inlure ctime et cstdlib u dut de votre ode soure pour otenir les fontionnlits de nomres ltoires Y ! vous devez ppeler l fontion srand(time(0)); une seule fois u dut de votre progrmme @u dut du main()A pour initiliser l gnrtion des nomres lE toires Y ! en(nD pour gnrer un nomre ompris entre H et R @pr exempleAD vous rirez X nbAleatoire = rand() % 5; F n exemple qui gnre un nomre entre H et R X
1

5inlude `iostremb 5inlude `timeb GG yligtoire 5inlude `stdlib GG yligtoire using nmespe stdY int min@A { int neletoire@HAY srnd@time@HAAY neletoire a rnd@A 7 SY } return HY

Tirer une lettre au hasard

Tirer un nombre au hasard c'est bien mais, pour ce programme, j'ai besoin de tirer une lettre au hasard pour mlanger les lettres !
1. Oui oui, on crit  5  pour avoir un nombre compris entre 0 et 4.

ITQ

CHAPITRE 10.

TP : LE MOT MYSTRE

smginons que vous yez un string ppel motMystere qui ontient le mot  wE ii F ous vez ppris que les string pouvient tre onsidrs omme des tE leuxD souvenezEvous 3 einsiD motMystere[0] orrespond l premire lettreD motMys tere[1] l deuxime lettreD etF sl su0t de gnrer un nomre ltoire entre H et le nomre de lettres du mot @qui nous est donn pr motMystere.size()A pour tirer une lettre u hsrd 3 ne petite ide de ode pour ruprer une lettre u hsrd X
5inlude 5inlude 5inlude 5inlude `iostremb `stringb `timeb `stdlib

using nmespe stdY int min@A { string motwystere@4wii4AY srnd@time@HAAY position a rnd@A 7 motwystereFsize@AY out `` 4vettre u hsrd X4 `` motwysterepositionY } return HY

Retirer une lettre d'un string

our viter de tirer P fois l mme lettre d9un motD je vous onseille de retirer u fur et mesure les lettres qui ont t piohesF our e fireD on v fire ppel erase() sur le mot mystreD omme ei X
motwystereFerse@RD IAY GG etire l lettre nS

sl y P prmtres X ! le numro de l lettre retirer du mot @ii RD e qui orrespond l Sme lettre r on ommene ompter prtir de HA Y ! le nomre de lettres retirer @ii IAF
Crez des fonctions !

ge n9est ps une oligtion misD plutt que de tout mettre dns le main()D vous pourriez rer des fontions qui ont des rles spi(quesF r exempleD l9tpe P qui ITR

CORRECTION

gnre un mot dont les lettres ont t mlnges mriterit d9tre fournie sous forme de fontionF einsiD on pourrit ppeler l fontion omme ei dns le main() X
motwelnge a melngervettres@motwystereAY

yn lui envoie le motMystereD elle nous renvoie un motMelangeF fien entenduD toute l di0ult onsiste ensuite oder ette fontion melangerLett resF ellezD u oulot 3

Correction
g9est l9heure de l orretion 3 ous vez srement pss du temps r)hir e progrmmeF gel n9 peutEtre ps toujours t file et vous n9vez ps forment su tout fireF ge n9est ps grve 3 ge qui ompteD 9est d9voir essy X 9est omme el que vous progressez le plus 3 xormlementD les tpes I et Q tient ssez files pour tout le mondeF eule l9tpe P @mlnge des lettresA demndit plus de r)exion X je l9i isole dns une fontion melangerLettres omme je vous l9i suggr plus ttF

Le code
ns plus ttendreD voii l orretion X
5inlude 5inlude 5inlude 5inlude `iostremb `stringb `timeb `stdlib

using nmespe stdY string melngervettres@string motA { string melngeY int position@HAY GGnt qu9on n9 ps extrit toutes les lettres du mot while @motFsize@A 3a HA { GGyn hoisit un numro de lettre u hsrd dns le mot position a rnd@A 7 motFsize@AY GGyn joute l lettre dns le mot mlng melnge Ca motpositionY GGyn retire ette lettre du mot mystre

ITS

CHAPITRE 10.

TP : LE MOT MYSTRE

GGour ne ps l prendre une deuxime fois motFerse@positionD IAY

GGyn renvoie le mot mlng return melngeY

int min@A { string motwystereD motwelngeD mottilisteurY GGsnitilistion des nomres ltoires srnd@time@HAAY GGI X yn demnde de sisir un mot out `` 4isissez un mot4 `` endlY in bb motwystereY GGP X yn rupre le mot ve les lettres mlnges dns motwelnge motwelnge a melngervettres@motwystereAY GGQ X yn demnde l9utilisteur quel est le mot mystre do { out `` endl `` 4uel est e mot c 4 `` motwelnge `` endlY in bb mottilisteurY if @mottilisteur aa motwystereA { out `` 4frvo 34 `` endlY } else { out `` 4ge n9est ps le mot 34 `` endlY } }while @mottilisteur 3a motwystereAY GGyn reommene tnt qu9il n9 ps trouv } return HY

xe vous lissez ps surprendre pr l  tille du ode @qui n9est d9illeurs ps trs grosA et soyez mthodiques en le lisnt X ommenez pr lire le main() et non l fontion melangerLettres()F egrdez les di'rentes tpes du progrmme une pr une X isolesD elles sont plus simples omprendreF ITT

CORRECTION

Des explications
oii quelques explitions pour mieux omprendre le progrmmeD tpe pr tpeF
tape 1 : saisir un mot

g9titD de loinD l9tpe l plus simple X un cout pour 0her un messgeD un cin pour ruprer un mot que l9on stoke dns l vrile motMystereF pile 3
tape 2 : mlanger les lettres

lus di0ileD ette tpe est rlise en fit dns une fontion melangerLettres @en hut du progrmmeAF ve main() ppelle l fontion melangerLettres() en lui enE voynt le mot mystreF ve rle de l fontion est de renvoyer une version mlnge des lettresD que l9on stoke dns motMelangeF enlysons l fontion melangerLettresF ille extrit une uneD ltoirementD les lettres du mot et reommene tnt qu9il reste des lettres extrire dns le mot X
while @motFsize@A 3a HA { position a rnd@A 7 motFsize@AY melnge Ca motpositionY motFerse@positionD IAY }

hque pssge de ouleD on tire un nomre u hsrd ompris entre H et le nomre de lettres qu9il reste dns le motF yn joute es lettres piohes ltoirement dns un string melange et on retire les lettres du mot d9origine pour ne ps les pioher une deuxime foisF ne fois toutes les lettres extritesD on sort de l oule et on renvoie l vrile melange qui ontient les lettres dns le dsordreF
tape 3 : demander l'utilisateur le mot mystre

gette tpe prend l forme d9une oule do... whileD qui nous permet de nous ssurer que nous demndons ien u moins une fois quel est le mot mystreF v9utilisteur sisit un mot gre cin et on ompre e mot ve le motMystere qu9il fut trouverF yn ontinue l oule tnt que le mot n9 ps t trouvD d9o l ondition X
}while @mottilisteur 3a motwystereAY GGyn reommene tnt qu9il n9 ps trouv

yn 0he un messge di'rent selon qu9on trouv ou non le mot mystreF ve proE grmme s9rrte ds qu9on sort de l ouleD don ds qu9on trouv le mot mystreF ITU

CHAPITRE 10.

TP : LE MOT MYSTRE

Tlchargement
ous pouvez tlhrger le ode soure du progrmme gre u ode we suivnt X  lhrger le ode soure gode we X THUQIQ  ve (hier s ontient X ! main.cpp X le (hier soure du progrmme @l9essentiel 3A Y ! mot_mystere.cbp X le (hier de projet gode: :floks @fulttifD pour eux qui utiE lisent et shiAF ous pouvez insi tester le progrmme et ventuellement vous en servir omme se pr l suite pour rliser les mliortions que je vis vous proposer @si vous n9vez ps russi fire le progrmme vousEmmesD ien entendu 3AF

Aller plus loin


xotre progrmme est terminF F F mis on peut toujours l9mliorerF te vis vous prE senter une srie de suggestions pour ller plus loinD e qui vous donner l9osion de trviller un peu plus sur e petit jeuF ges propositions sont de di0ult roissnte X ! Ajoutez des sauts de ligne au dbut X lorsque le premier joueur sisit le mot mystre l premire foisD vous devriez rer plusieurs suts de lignes pour que le joueur P ne voie ps le mot qui t sisiD sinon 9est trop file pour luiF tilisez plusieurs endlD pr exempleD pour rer plusieurs retours l ligneF ! Proposez au joueur de faire une nouvelle partieF etuellementD une fois le mot trouvD le progrmme s9rrteF it si vous demndiez  oulezEvous fire une utre prtie c @oGnA F in fontion de l rponse sisieD vous reprenez u dut du progrmmeF our e fireD il fudr rer une grosse oule do... while qui engloe les Q tpes du progrmmeF ! Fixez un nombre maximal de coups pour trouver le mot mystreF ous pouvez pr exemple indiquer  sl vous reste S essis et lorsque les S essis sont oulsD le progrmme s9rrte en 0hnt l solutionF ! Calculez le score moyen du joueur l (n du progrmme X prs plusieurs prties du joueurD 0hezElui son soreD qui ser l moyenne des prties prdentesF ous pouvez luler le nomre de points omme vous le voulezF ous devrez srement utiliser les tleux dynmiques vector pour stoker les sores de hque prtie u fur et mesureD vnt d9en fire l moyenneF ! Piochez le mot dans un chier-dictionnaire X pour pouvoir jouer seulD vous pourriez rer un (hier ontennt une srie de mots @un pr ligneA dns lequel le progrmme v pioher ltoirement hque foisF oii un exemple de (hierE ditionnire X
wii vyryxi efisvvi

ITV

ALLER PLUS LOIN

eu lieu de demnder le mot deviner @tpe IA on v herher dns un (hier omme eluiEi un mot ltoireF vous d9utiliser les fontionnlits de leture de (hiers que vous vez pprises 3 F F F ellezD puisque vous m9tes sympthiquesD je vous propose mme de tlhrger un (hierEditionnire tout prt ve des dizines de milliers de mots 3 weri qui c 3 lhrger le (hier gode we X PUUWQV  i vous vez d9utres idesD n9hsitez ps omplter enore e progrmme 3 gel vous fer euoup progresserD vous verrezF

vyx weqsi eisiwix

ITW

CHAPITRE 10.

TP : LE MOT MYSTRE

IUH

Chapitre

11
Dicult :

Les pointeurs

ous voil dans le dernier chapitre de prsentation des bases du C++. Accrochez-vous car le niveau monte d'un cran ! Le sujet des pointeurs fait peur beaucoup de monde et c'est certainement un des chapitres les plus complexes de ce cours. Une fois cet cueil pass, beaucoup de choses vous paratront plus simples et plus claires. Les pointeurs sont utiliss dans tous les programmes C++, mme si vous n'en avez pas eu conscience jusque l. Il y en a partout. Pour l'instant, ils taient cachs et vous n'avez pas eu en manipuler directement. Cela va changer avec ce chapitre. Nous allons apprendre grer trs nement ce qui se passe dans la mmoire de l'ordinateur. C'est un chapitre plutt dicile, il est donc normal que vous ne compreniez pas tout du premier coup. N'ayez pas peur de le relire une seconde fois dans quelques jours pour vous assurer que vous avez bien tout assimil !

IUI

CHAPITRE 11.

LES POINTEURS

Une question d'adresse


istEe que vous vous rppelez le hpitre sur l mmoire @pge RWA c yuiD elui qui prsentit l notion de vrileF te vous invite le relire et surtout vous remmorer les di'rents shmsF te vous vis dit queD lorsque l9on dlre une vrileD l9ordinteur nous  prte une ple dns s mmoire et y rohe une tiquette portnt le nom de l vrileF
int min@A { int getilisteur@ITAY return HY }

yn pouvit don reprsenter l mmoire utilise dns e progrmme omme sur le shm de l (gure IIFIF

Figure IIFI ! v mmoire lorsque l9on dlre une vrile

g9tit simple et euF wlheureusementD je vous i un peu mentiF te vous i simpli( les hoses 3 ous ommenez le svoirD dns un ordinteur tout est ien ordonn et rng de mnire logiqueF ve systme des tiquettes dont je vous i prl n9est don ps tout fit orretF v mmoire d9un ordinteur est rellement onstitue de  ses D l je ne vous i ps mentiF sl y en mme normmentD plusieurs millirds sur un ordinteur rent 3 sl fut don un systme pour que l9ordinteur puisse retrouver les ses dont il esoinF ghune d9entre elles possde un numro uniqueD son adresse @(gure IIFPAF IUP

UNE QUESTION D'ADRESSE

Figure IIFP ! ve vri visge de l mmoire X euoup de sesD toutes numrotes

ur le shmD on voit ette fois toutes les ses de l mmoire ve leurs dressesF xotre progrmme utilise une seule de es sesD l 53768D pour y stoker s vrileF
On ne peut pas mettre deux variables dans la mme case.

ve point importnt ii est que hque vrile possde une seule dresse et que hque dresse orrespond une seule vrileF v9dresse est don un deuxime moyen d9der une vrileF yn peut tteindre l se june du shm pr deux hemins di'rents X ! yn peut psser pr son nom @l9tiquetteA omme on sit dj le fireF F F ! wis on peut ussi der l vrile gre son dresse @son numro de seAF yn pourrit lors dire l9ordinteur  e0he moi le ontenu de l9dresse SQUTV ou enore  edditionne les ontenus des dresses IPTU et WIPQV F istEe que el vous tente d9essyer c ous vous demndez peutEtre quoi el peut ien servirF tiliser l9tiquette tit un moyen simple et e0eD 9est vriF wis nous verrons plus loin que psser pr les dresses est prfois nessireF gommenons pr voir omment onntre l9dresse d9une vrileF IUQ

CHAPITRE 11.

LES POINTEURS

Acher l'adresse
in gCCD le symole pour otenir l9dresse d9une vrile est l9esperluette @&AF i je veux 0her l9dresse de l vrile ageUtilisateurD je dois don rire &ageUtilis ateurF issyonsF
5inlude `iostremb using nmespe stdY int min@A { int getilisteur@ITAY out `` 4v9dresse est X 4 `` 8getilisteur `` endlY GGeffihge de l9dresse de l vrile return HY }

ghez moiD j9otiens le rsultt suivnt X


v9dresse est X HxPPffI

Vous aurez certainement un rsultat dirent. La case peut changer d'une excution l'autre du programme.

wme si elle ontient des lettresD ette dresse est un nomreF geluiEi est simplement rit en hexdiml @en se ITD si vous voulez tout svoirAD une utre fon d9rire les nomresF ves ordinteurs iment ien trviller dns ette seF our informtionD en se IH @notre riture ournteAD ette dresse orrespond 2 293 532F gependntD e n9est ps une informtion trs intressnteF ge qui est srD 9est qu90her une dresse est trs rrement utileF ouvenezEvous simplement de l nottionF v9esperluette veut dire  dresse de F hon cout  &a; se trduit en frnis pr  e0he l9dresse de l vrile F
On a dj utilis l'esperluette dans ce cours pour tout autre chose : lors de la dclaration d'une rfrence (page 60). C'est le mme symbole qui est utilis pour deux choses direntes. Attention ne pas vous tromper !

oyons mintennt e que l9on peut fire ve es dressesF

Les pointeurs
ves dresses sont des nomresF ous onnissez plusieurs types permettnt de stoker des nomres X intD unsigned intD doubleF eutEon don stoker une dresse dns une vrile c IUR

LES POINTEURS

v rponse est  oui F g9est possileD mis ps ve les types que vous onnissezF sl nous fut utiliser un type un peu prtiulier X le pointeurF
Un pointeur est une variable qui contient l'adresse d'une autre variable.

etenez ien ette phrseF ille peut vous suver l vie dns les moments les plus di0iles de e hpitreF

Dclarer un pointeur
our dlrer un pointeur il futD omme pour les vrilesD deux hoses X ! un type Y ! un nomF our le nomD il n9y rien de prtiulier signlerF ves mmes rgles que pour les vriles s9ppliquentF yuf 3 ve type d9un pointeur une petite sutilitF sl fut indiquer quel est le type de vrile dont on veut stoker l9dresse et jouter une toile @*AF te rois qu9un exemple ser plus simpleF
int BpointeurY

ge ode dlre un pointeur qui peut ontenir l9dresse d9une vrile de type intF
On peut galement crire int* pointeur (avec l'toile colle au mot int). Cette notation a un lger inconvnient, c'est qu'elle ne permet pas de dclarer plusieurs pointeurs sur la mme ligne, comme ceci : int* pointeur1, pointeur2, pointeur3;. Si l'on procde ainsi, seul pointeur1 sera un pointeur, les deux autres variables seront des entiers tout fait standard.

yn peut ien sr fire el pour n9importe quel type X


doule BpointeureY GGn pointeur qui peut ontenir l9dresse d9un nomre virgule unsigned int BpointeurfY GGn pointeur qui peut ontenir l9dresse d9un nomre entier positif string BpointeurgY GGn pointeur qui peut ontenir l9dresse d9une hne de rtres vetor`intb BpointeurhY GGn pointeur qui peut ontenir l9dresse d9un tleu dynmique de nomres entiers int onst BpointeuriY GGn pointeur qui peut ontenir l9dresse d9un nomre entier onstnt

our le momentD es pointeurs ne ontiennent uune dresse onnueF g9est une situE tion trs dngereuseF i vous essyez d9utiliser le pointeurD vous ne svez ps quelle se IUS

CHAPITRE 11.

LES POINTEURS

de l mmoire vous mnipulezF ge peut tre n9importe quelle seD pr exemple elle qui ontient votre mot de psse indows ou elle stoknt l9heure tuelleF t9imgine que vous vous rendez ompte des onsquenes que peut voir une muvise mnipultion des pointeursF sl ne fut don jamais dlrer un pointeur sns lui donner d9dresseF r onsquentD pour tre trnquilleD il fut toujours dlrer un pointeur en lui donnnt l vleur H X
int Bpointeur@HAY doule Bpointeure@HAY unsigned int Bpointeurf@HAY string Bpointeurg@HAY vetor`intb Bpointeurh@HAY int onst Bpointeuri@HAY

ous l9vez peutEtre remrqu sur mon shm un peu plus ttD l premire se de l mmoire vit l9dresse IF in e'etD l9dresse H n9existe psF vorsque vous rez un pointeur ontennt l9dresse HD el signi(e qu9il ne ontient l9dresse d9aucune seF
Je me rpte, mais c'est trs important : dclarez toujours vos pointeurs en les initialisant l'adresse 0.

Stocker une adresse


wintennt qu9on l vrileD il n9y plus qu9 y mettre une vleurF ous svez dj omment otenir l9dresse d9une vrile @rppelezEvous du &AF ellonsEy 3
int min@A { int getilisteur@ITAY GGne vrile de type int int Bptr@HAY GGn pointeur pouvnt ontenir l9dresse d9un nomre entier ptr a 8getilisteurY GGyn met l9dresse de 9getilisteur9 dns le pointeur 9ptr9 } return HY

v ligne ptr = &ageUtilisateur; est elle qui nous intresseF ille rit l9dresse de l vrile ageUtilisateur dns le pointeur ptrF yn dit lors que le pointeur ptr pointe sur ageUtilisateurF oyons omment tout el se droule dns l mmoire gre un shm @(gure IIFQA 3 yn retrouve quelques lments fmiliers X l mmoire ve s grille de ses et l vrile ageUtilisateur dns l se nSQUTVF v nouveut est ien sr le pointeurF hns IUT

LES POINTEURS

Figure IIFQ ! v mmoire prs l dlrtion d9une vrile et d9un pointeur pointnt sur ette vrile

l se mmoire nIRSTTD il y une vrile nomme ptr qui pour vleur l9dresse SQUTVD 9estEEdire l9dresse de l vrile ageUtilisateurF oilD vous svez tout ou presqueF gel peut semler surde pour le moment @ ourE quoi stoker l9dresse d9une vrile dns une utre se c A mis fitesEmoi on(ne X les hoses vont progressivement s9lirer pour vousF i vous vez ompris le shm prdentD lors vous pouvez vous ttquer ux progrmmes les plus omplexesF

Acher l'adresse
gomme pour toutes les vrilesD on peut 0her le ontenu d9un pointeurF
5inlude `iostremb using nmespe stdY int min@A { int getilisteur@ITAY int Bptr@HAY ptr a 8getilisteurY

IUU

CHAPITRE 11.

LES POINTEURS

out `` 4v9dresse de 9getilisteur9 est X 4 `` 8getilisteur `` endlY out `` 4v vleur de pointeur est X 4 `` ptr `` endlY } return HY

gel donne X
v9dresse de 9getilisteur9 est X HxPffIV v vleur de pointeur est X HxPffIV

v vleur du pointeur est don ien l9dresse de l vrile pointeF yn ien russi stoker une dresse 3

Accder la valeur pointe


ous vous souvenez du rle des pointeurs c sls permettent d9der une vrile sns psser pr son nomF oii omment fire X il fut utiliser l9toile @*A sur le pointeur pour 0her l vleur de l vrile pointeF
int min@A { int getilisteur@ITAY int Bptr@HAY ptra 8getilisteurY out `` 4v vleur est X } return HY 4 `` Bptr `` endlY

in fisnt cout  *ptrD le progrmme e'etue les tpes suivntes X IF eller dns l se mmoire nomme ptr Y PF vire l vleur enregistre Y QF  uivre l )he pour ller l9dresse pointe Y RF vire l vleur stoke dns l se Y SF e0her ette vleur X iiD e ser ien sr ITF in utilisnt l9toileD on de l valeur de la variable pointeF g9est e qui s9ppelle drfrencer un pointeurF oii don un deuxime moyen d9der l vleur de ageUtilisateurF
Mais quoi cela sert-il ?

IUV

L'ALLOCATION DYNAMIQUE

te suis sr que vous vous tes retenus de poser l question vntF g9est vri que el l9ir ssez inutileF ih ienD je ne peux ps vous rpondre rpidement pour le momentF sl v flloir lire l (n de e hpitre pour tout svoirF

Rcapitulatif de la notation
te suis d9ord ve vousD l nottion est ompliqueF v9toile deux signi(tions di'rentes et on utilise l9esperluette lors qu9elle sert dj pour les rfrenesF F F ge n9est ps m fute mis il v flloir fire veF issyons don de rpituler le toutF our une vrile int nombre X ! nombre permet d9der l valeur de l vrile Y ! &nombre permet d9der l9adresse de l vrileF ur un pointeur int *pointeur X ! pointeur permet d9der l valeur du pointeurD 9estEEdire l9adresse de la variable pointe Y ! *pointeur permet d9der l valeur de la variable pointeF g9est e qu9il fut retenir de ette setionF te vous invite tester tout el hez vous pour vri(er que vous vez ien ompris omment 0her une dresseD omment utiliser un pointeurD etF  g9est en forgent qu9on devient forgeron dit le ditonD eh ien  9est en proE grmmnt ve des pointeurs que l9on devient progrmmeur F sl fut imprtivement s9entrner pour ien omprendreF ves meilleurs sont tous psss pr l et je peux vous ssurer qu9ils ont ussi sou'ert en douvrnt les pointeursF i vous ressentez une petite douleur dns l tteD prenez un het d9spirineD fites une puse puis relisez e que vous venez de lireD enore et enoreF eidezEvous en prtiulier des shms 3

L'allocation dynamique
ous vouliez svoir quoi servent les pointeurs c ous tes srs c fonD lors je vous montrer une premire utilistionF

La gestion automatique de la mmoire


hns notre tout premier hpitre sur les vrilesD je vous vis expliqu queD lors de l dlrtion d9une vrileD le progrmme e'etue deux tpes X IF sl demnde l9ordinteur de lui fournir une zone dns l mmoireF in termes tehniquesD on prle d9allocation de l mmoireF PF sl remplit ette se ve l vleur fournieF yn prle lors d9initialisation de l vrileF IUW

CHAPITRE 11.

LES POINTEURS

out el est entirement utomtiqueD le progrmme se drouille tout seulF he mmeD lorsque l9on rrive l (n d9une fontionD le progrmme rend l mmoire utilise l9ordinteurF g9est e qu9on ppelle l libration de l mmoireF g9est nouveu utomtique X nous n9vons jmis d dire l9ordinteur X  iensD reprends ette se mmoireD je n9en i plus esoin F out ei se fisit utomtiquementF xous llons mintennt pprendre le fire mnuellement et pour elF F F vous vous doutez srement que nous llons utiliser les pointeursF

Allouer un espace mmoire


our demnder mnuellement une se dns l mmoireD il fut utiliser l9oprteur newF new demnde une se l9ordinteur et renvoie un pointeur pointnt vers ette seF
int Bpointeur@HAY pointeur a new intY

v deuxime ligne demnde une se mmoire pouvnt stoker un entier et l9dresse de ette se est stoke dns le pointeurF ve mieux est enore de fire ppel un petit shm @(gure IIFRAF

Figure IIFR ! v mmoire prs l9llotion dynmique d9un entier

ge shm est trs similire u prdentF sl y deux ses mmoires utilises X ! l se IRSTQ qui ontient une vrile de type int non initilise Y ! l se SQUUI qui ontient un pointeur pointnt sur l vrileF ien de neufF wis le point importntD 9est que l vrile dns l se IRSTQ n9 pas d9tiquetteF ve seul moyen d9y der est don de psser pr le pointeurF IVH

L'ALLOCATION DYNAMIQUE

Si vous changez la valeur du pointeur, vous perdez le seul moyen d'accder cette case mmoire. Vous ne pourrez donc plus l'utiliser ni la supprimer ! Elle sera dnitivement perdue mais elle continuera prendre de la place. C'est ce qu'on appelle une fuite de mmoire. Il faut donc faire trs attention !

ne fois lloue mnuellementD l vrile s9utilise omme n9importe quelle utreF yn doit juste se rppeler qu9il fut y der pr le pointeurD en le drfrenntF
int Bpointeur@HAY pointeur a new intY Bpointeur a PY GGyn de l se mmoire pour en modifier l vleur

v se sns tiquette est mintennt remplieF v mmoire est don dns l9tt prsent l (gure IIFSF

Figure IIFS ! v mmoire prs voir llou une vrile et hng l vleur de ette

vrile prt son s un peu spil @via *pointeurAD nous vons don une vrile en tout point semlle une utreF sl nous fut mintennt rendre l mmoire que l9ordinteur nous gentiment prteF

Librer la mmoire
ne fois que l9on n9 plus esoin de l se mmoireD il fut l rendre l9ordinteurF gel se fit via l9oprteur deleteF
int Bpointeur@HAY pointeur a new intY

IVI

CHAPITRE 11.

LES POINTEURS

delete pointeurY

GGyn lire l se mmoire

v se est lors rendue l9ordinteur qui pourr l9employer utre hoseF ve pointeurD luiD existe toujours et il pointe toujours sur l seD mis vous n9vez plus le droit de l9utiliser @(gure IIFTAF

Figure IIFT ! n pointeur pointnt sur une se vide prs un ppel delete

v9imge est trs prlnteF i l9on suit l )heD on rrive sur une se qui ne nous pprtient psF sl fut don imprtivement empher elF smginez que ette se soit soudinement utilise pr un utre progrmme 3 ous risqueriez de modi(er les vriles de et utre progrmmeF eprs voir fit ppel deleteD il est don essentiel de supprimer ette  )he en mettnt le pointeur l9dresse HF xe ps le fire est une use trs ournte de plntge des progrmmesF
int Bpointeur@HAY pointeur a new intY delete pointeurY pointeur a HY GGyn lire l se mmoire GGyn indique que le pointeur ne pointe plus vers rien

N'oubliez pas de librer la mmoire. Si vous ne le faites pas, votre programme risque d'utiliser de plus en plus de mmoire, jusqu'au moment o il n'y aura plus aucune case disponible ! Votre programme va alors planter.

IVP

QUAND UTILISER DES POINTEURS

Un exemple complet
erminons ette setion ve un exemple omplet X un progrmme qui demnde son ge l9utilisteur et qui l90he l9ide un pointeurF
5inlude `iostremb using nmespe stdY int min@A { intB pointeur@HAY pointeur a new intY out `` 4uel est votre ge c 4Y in bb BpointeurY GGyn rit dns l se mmoire pointe pr le pointeur 9pointeur9 out `` 4ous vez 4 `` Bpointeur `` 4 nsF4 `` endlY GGyn utilise nouveu Bpointeur delete pointeurY GGxe ps oulier de lirer l mmoire pointeur a HY GGit de fire pointer le pointeur vers rien } return HY

ge progrmme est plus ompliqu que s version sns llotion dynmiqueD 9est vri 3 wis on le ontrle omplet sur l9llotion et l lirtion de l mmoireF hns l pluprt des sD e n9est ps utile de le fireF wis vous verrez plus trd queD pour fire des fentresD l iliothque t utilise euoup new et deleteF yn peut insi mtriser prisment qund une fentre est ouverte et qund on l refermeD pr exempleF

Quand utiliser des pointeurs


te vous vis promis des explitions sur qund utiliser des pointeursF ves voii 3 sl y en rlit trois s d9pplition X ! grer soiEmme le moment de l rtion et de l destrution des ses mmoire Y ! prtger une vrile dns plusieurs moreux du ode Y ! sletionner une vleur prmi plusieurs optionsF i vous n9tes dns uun de es trois sD 9est trs ertinement que vous n9vez ps esoin des pointeursF ous onnissez dj le premier de es trois sF gonentrons nous sur les deux utresF IVQ

CHAPITRE 11.

LES POINTEURS

Partager une variable


our l9instntD je ne peux ps vous donner un ode soure omplet pour e s d9utiliE stionF yu lorsD il ne ser ps intressnt du toutF und vous urez quelques notions de progrmmtion oriente ojetD vous urez de vris exemplesF in ttendntD je vous propose un exemple plusF F F visuelF ous vez dj jou un jeu de strtgie c renons un exemple tir d9un jeu de e genreF oii une imge issue du fmeux Warcraft III @(gure IIFUAF

Figure IIFU ! ve jeu rrft sss

rogrmmer un tel jeu est ien sr trs ompliqu mis on peut qund mme r)hir ertins des mnismes utilissF ur l9imgeD on voit des humins @en rougeA ttquer des ors @en leuAF ghque personnge une ile priseF r exempleD le fusilier u milieu de l9rn semle tirer sur le gros personnge leu qui tient une hheF xous verrons dns l suite de e ours omment rer des ojetsD 9estEEdire des vE riles plus volues @pr exemple une vrile de type  personnge D de type  or ou enore de type  timent AF frefD hque lment du jeu pourr tre modlis en gCC pr un ojetF gomment feriezEvous pour indiquerD en gCCD l ile du personnge rouge c fien srD vous ne svez ps enore omment fire en dtil mis vous vez peutEtre une petite ideF ppelezEvous le titre de e hpitreF yui ouiD un pointeur est une onne solution 3 ghque personnge possde un pointeur qui pointe vers s ileF sl insi un moyen de svoir qui viser et ttquerF yn pourrit pr exemple rire quelque hose du type X IVR

QUAND UTILISER DES POINTEURS

ersonnge BileY

GGn pointeur qui pointe sur un utre personnge

und il n9y ps de omt en oursD le pointeur pointe vers l9dresse HD il n9 ps de ileF und le omt est enggD le pointeur pointe vers un ennemiF in(nD qund et ennemi meurtD on dple le pointeur vers une utre dresseD 9estEEdire vers un utre personngeF ve pointeur est don rellement utilis ii omme une )he relint un personnge son ennemiF xous verrons pr l suite omment rire e type de ode Y je rois mme que rer un miniEq ser le thme prinipl des hpitres de l prtie ssF wis hutD 9est pour plus trdF YEA
1

Choisir parmi plusieurs lments


ve troisime et dernier s permet de fire voluer un progrmme en fontion des hoix de l9utilisteurF renons le s d9un gw X nous llons demnder l9utilisteur de hoisir prmi trois rponses possiles une questionF ne fois qu9il ur hoisiD nous llons utiliser un pointeur pour indiquer quelle rponse t sletionneF
5inlude `iostremb 5inlude `stringb using nmespe stdY int min@A { string reponseeD reponsefD reponsegY reponsee a 4v peur des jeux de loterie4Y reponsef a 4v peur du noir4Y reponseg a 4v peur des vendredis treize4Y out out out out `` `` `` `` 4u9estEe que l 4eA 4 `` reponsee 4fA 4 `` reponsef 4gA 4 `` reponseg 9kenophoie9 c 4 `` endlY GGyn pose l question `` endlY GGit on ffihe les trois propositions `` endlY `` endlY

hr reponseY out `` 4otre reponse @eDf ou gA X 4Y in bb reponseY GGyn rupre l rponse de l9utilisteur string Breponsetilisteur@HAY GGn pointeur qui pointer sur l rponse hoisie swith@reponseA { se 9e9X reponsetilisteur a 8reponseeY GGyn dple le pointeur sur l
1. Un mini jeu de rle, si vous prfrez.

IVS

CHAPITRE 11.

LES POINTEURS

rponse hoisie rekY se 9f9X reponsetilisteur a 8reponsefY rekY se 9g9X reponsetilisteur a 8reponsegY rekY }

GGyn peut lors utiliser le pointeur pour ffiher l rponse hoisie out `` 4ous vez hoisi l reponse X 4 `` Breponsetilisteur `` endlY } return HY

gopier e ode gode we X UTQTHS  ne fois que le pointeur t dpl @dns le switchAD on peut l9utiliser omme moyen d9s l rponse de l9utilisteurF yn insi un moyen d9tteindre diretement ette vrile sns devoir refire le test hque fois qu9on en esoinF g9est une vrile qui ontient une vleur que l9on ne pouvit ps onntre vnt @puisqu9elle dpend de e que l9utilisteur entrAF g9est ertinement le s d9utilistion le plus rre des trois mis il rrive prfois qu9on soit dns ette situtionF sl ser lors temps de vous rppeler les pointeurs 3

En rsum
! ! ! ! ! ghque vrile est stoke en mmoire une dresse di'renteF sl ne peut y voir qu9une seule vrile pr dresseF yn peut ruprer l9dresse d9une vrile ve le symole &D omme ei X &variableF n pointeur est une vrile qui stoke l9dresse d9une utre vrileF n pointeur se dlre omme ei X int *pointeur; @dns le s d9un pointeur vers une vrile de type intAF ! r dfutD un pointeur 0he l9dresse qu9il ontientF in revnheD si on rit *pointeurD on otient l vleur qui se trouve l9dresse indique pr le pointeurF ! yn peut rserver mnuellement une se en mmoire ve newF hns e sD il fut lirer l9espe en mmoire ds qu9on n9en plus esoinD ve deleteF ! ves pointeurs sont une notion omplexe sisir du premier oupF x9hsitez ps relire e hpitre plusieurs foisF ous omprendrez mieux leur intrt plus loin dns et ouvrgeF

IVT

Deuxime partie

La Programmation Oriente Objet

IVU

Chapitre

12
Dicult :

Introduction : la vrit sur les strings enn dvoile

ous allons dcouvrir la notion de programmation oriente objet (POO). Comme je vous l'ai dit plus tt, c'est une nouvelle faon de programmer. Cela ne va pas immdiatement rvolutionner vos programmes, cela va mme vous paratre un peu inutile au dbut mais ayez conance : faites l'eort de suivre mes indications la lettre et, bientt, vous trouverez cette manire de coder bien plus naturelle. Vous saurez plus aisment organiser vos programmes. Ce chapitre va vous parler des deux facettes de la POO : le ct utilisateur et le ct crateur. Puis je vais faire l'inverse de ce que font tous les cours de programmation : au lieu de commencer par vous apprendre crer des objets, je vais d'abord vous montrer comment les utiliser, en basant mes exemples sur le type string fourni par le langage C++.

IVW

CHAPITRE 12. DVOILE

INTRODUCTION : LA VRIT SUR LES STRINGS ENFIN

Des objets. . . pour quoi faire ?


Ils sont beaux, ils sont frais mes objets
9il y ien un mot qui doit vous frustrer depuis que vous en entendez prlerD 9est eluiEi X objetF
Encore un concept mystique ? Un dlire de programmeurs aprs une soire trop arrose ? Non parce que, franchement, un objet, c'est quoi ? Mon cran est un objet, ma voiture est un objet, mon tlphone portable. . . Ce sont tous des objets !

fien vuD 9est un premier pointF in e'etD nous sommes entours d9ojetsF in fitD tout e que nous onnissons @ou presqueA peut tre onsidr omme un ojetF v9ide de l progrmmtion oriente ojetD 9est de mnipuler dns son ode soure des lments que l9on ppelle des  ojets F oii quelques exemples d9ojets dns des progrmmes ournts X ! une fentre Y ! un outon Y ! un personnge de jeu vido Y ! une musiqueF gomme vous le voyezD euoup de hoses peuvent tre onsidres omme des ojetsF
Mais concrtement, c'est quoi ? Une variable ? Une fonction ?

xi l9unD ni l9utreF g9est un nouvel lment en progrmmtionF our tre plus prisD un ojet 9estF F F un mlnge de plusieurs vriles et fontionsF xe fites ps ette tteElD vous llez douvrir tout el pr l suiteF

Imaginez. . . un objet
our viter que mes explitions ne ressemlent un trit d9rt ontemporin onepE tuelD nous llons imginer ensemle e qu9est un ojet l9ide de plusieurs shms onretsF smginez qu9un dveloppeur dide un jour de rer un progrmme qui permet d90her une fentre l9rnD de l redimensionnerD de l dplerD de l supprimerF F F ve ode est omplexe X il ur esoin de plusieurs fontions qui s9ppellent entre ellesD insi que de vriles pour mmoriser l positionD l tille de l fentreD etF ve dveloppeur met du temps rire e odeD 9est un peu ompliqu mis il y rriveF eu (nlD le ode qu9il rdig est ompos de plusieurs fontions et vrilesF und on regrde le rsultt pour l premire foisD el ressemle une expriene de svnt fou lquelle on ne IWH

DES OBJETS. . . POUR QUOI FAIRE ?

omprend rien @(gure IPFIAF

Figure IPFI ! ve ode ressemle une expriene omplexe

ge progrmmeur est ontent de son ode et veut le distriuer sur snternetD pour que tout le monde puisse rer des fentres sns perdre du temps tout rrireF eulement voilD moins d9tre un expert erti( en himieD vous llez mettre ps ml de temps vnt de omprendre omment fontionne tout e zrF uelle fontion ppeler en premier c uelles vleurs envoyer quelle fontion pour redimensionner l fentre c eutrement dit X omment utiliser e ftrs sns qu9une (ole ne nous explose entre les mins c g9est l que notre mi progrmmeur pense nousF sl onoit son ode de manire oriente objetF gel signi(e qu9il ple tout son zr himique l9intrieur d9un simple ueF ge ue est e qu9on ppelle un ojet @(gure PHFIAF ur l (gure PHFID une prtie du ue t volontirement mise en trnsprene (n de vous montrer que nos (oles himiques sont ien situes l9intrieur du ueF wis en rlitD le ue est ompltement opqueD on ne voit rien de e qu9il y l9intrieur @(gure IPFQAF ge ue ontient toutes les fontions et vriles @nos (oles de himieA mis il les masque l9utilisteurF eu lieu d9voir des tonnes de tues et de (oles dont il fut omprendre le fontionneE mentD on nous propose juste quelques outons sur l fe vnt du ue X un outon  ouvrir fentre D un outon  redimensionner D etF v9utilisteur n9 plus qu9 emE ployer les outons du ueD sns se souier de tout e qui se psse l9intrieurF our luiD le fontionnement est don ompltement simpli(F IWI

CHAPITRE 12. DVOILE

INTRODUCTION : LA VRIT SUR LES STRINGS ENFIN

Figure IPFP ! v9utilistion du ode est simpli(e gre l9utilistion d9un ojet

Figure IPFQ ! ve ode est en rlit totlement invisile pour l9utilisteur

IWP

L'HORRIBLE SECRET DU TYPE

STRING

in lirD progrmmer de mnire oriente ojetD 9est crer du ode soure @potentielE lement omplexeA mis que l9on masque en le plnt l9intrieur d9un ue @un ojetA trvers lequel on ne voit rienF our l personne qui v l9utiliserD trviller ve un ojet est don euoup plus simple qu9vnt X il su0t d9ppuyer sur des outons et on n9 ps esoin d9tre diplm en himie pour s9en servirF fien srD 9est une imgeD mis 9est e qu9il fut omprendre et retenir pour le momentF xous n9llons ps voir tout de suite omment fire pour crer des ojetsD en revnhe nous llons pprendre en utiliser unF hns e hpitreD nous llons nous penher sur le s de stringF
J'ai dj utilis le type string, ce n'est pas une nouveaut pour moi ! C'est le type qui permet de stocker du texte en mmoire, c'est cela ?

yuiF wis omme je vous l9i dit il y quelques hpitresD le type string est di'rent des utresF intD boolD floatD double sont des types nturels du gCCF sls stokent des donnes trs simplesF ge n9est ps le s de string qui est en fitF F F un ojet 3 ve type string he ien des serets l9intrieur de s oteF tusqu9iiD nous nous sommes ontents d9ppuyer sur des outons @omme sur les shE msA misD en rlitD e qui se he l9intrieur de l ote des ojets string est trs omplexeF rorrilement omplexeF

L'horrible secret du type string


qre ux mnismes de l progrmmtion oriente ojetD nous vons pu utiliser le type string ds les premiers hpitres de e ours lors que son fontionnement interne est pourtnt ssez ompliqu 3 our vous en onvinreD je vis vous montrer omment fontionne string  l9intrieur du ue F rprezEvous d9horriles vritsF

Pour un ordinateur, les lettres n'existent pas


gomme nous l9vons vuD l9vntge des ojets est de msquer l omplexit du ode l9utilisteurF lutt que de mnipuler des (oles himiques dngereusesD ils nous perE mettent d9ppuyer sur de simples outons pour fire des hoses prfois ompliquesF it justementD les hoses sont ompliques pre queD l seD un ordinateur ne sait pas grer du texte 3 yuiD l9ordinteur n9est vritlement qu9une grosse mhine luler dnue de sentimentF sl ne reonnt que des nomresF
Mais alors, si l'ordinateur ne peut manipuler que des nombres, comment se fait-il qu'il puisse acher du texte l'cran ?

g9est une vieille stue que l9on utilise depuis longtempsF eutEtre vezEvous entendu IWQ

CHAPITRE 12. DVOILE

INTRODUCTION : LA VRIT SUR LES STRINGS ENFIN

prler de l table ASCII c g9est un tleu qui sert de onvention pour onvertir des nomres en lettresF
1

Table IPFI ! n extrit de l tle egss


Nombre Lettre Nombre Lettre

TR TS TT TU TV TW UH UI UP UQ UR US UT UU

d e f g h i p q r s t u v w

WT WU WV WW IHH IHI IHP IHQ IHR IHS IHT IHU IHV IHW

9 d e f g h i j k l m

gomme vous le voyezD l lettre  e mjusule orrespond u nomre TSF v lettre  minusule orrespond u nomre WUD etF ous les rtres utiliss en nglis (gurent dns ette tleF g9est pour el que les rtres entus ne sontD de seD ps utilisles en gCC X ils n9pprissent ps dns l tle egssF
Cela veut dire qu' chaque fois que l'ordinateur voit le nombre 65, il prend cela pour la lettre A ?

xonD l9ordinteur ne trduit un nomre en lettre que si on le lui demndeF in prtiqueD on se se sur le type de l vrile pour svoir si le nomre stok est vritlement un nomre ouD en rlitD une lettre X ! i on utilise le type int pour stoker le nomre TSD l9ordinteur onsidrer que 9est un nomreF ! in revnheD si on utilise le type char pour stoker le nomre TSD l9ordinteur se dir  g9est l lettre e F ve type char @rvition de characterD  rtre en frnisA est prvu pour stoker un rtreF ve type char stoke don un nomre qui est interprt omme un rtreF
Un char ne peut stocker qu'un seul caractre ? Comment fait-on alors pour stocker une phrase entire ?
1.

American Standard Code for Information Interchange, prononc  aski .

IWR

CRER ET UTILISER DES OBJETS

STRING

ih ienD l non plusD e n9est ps simple 3 g9est un utre prolme que nous llons voirF F F

Les textes sont des tableaux de char


uisque char ne peut stoker qu9une seule lettreD les progrmmeurs ont eu l9ide de rerF F F un tleu de char 3 ves tleux permettnt de retrouver te te en mmoire plusieurs vriles d9un mme typeD ils sont le moyen idl de stoker du texte @on prle ussi de  hnes de rtres D vous omprenez mintennt pourquoiAF einsiD il su0t de dlrer un tleu de char omme ei X
hr texteIHHY

F F F pour pouvoir stoker du texte @environ IHH rtresA 3 ve texte n9est don en fit qu9un ssemlge de lettres stok en mmoire dns un tleu @(gure IPFRAF

Figure IPFR ! ne hne de rtres

ghque se orrespond un charF ous es char mis te te forment du texteF


Attention : il faut prvoir susamment de place dans le tableau pour stocker tout le texte ! Ici, c'est un tableau de 100 cases mais cela peut tre insusant si on veut stocker en mmoire plusieurs phrases ! Pour rsoudre ce problme, on peut crer un trs grand tableau (en prvision de la taille de ce qu'on va stocker) mais cela risque parfois de consommer beaucoup de mmoire pour rien.

Crer et utiliser des objets string


ous venez d9en voir un peru X grer du texte n9est ps vriment simpleF sl fut rer un tleu de char dont hque se orrespond un rtreD il fut prvoir une tille su0snte pour stoker le texte que l9on souhite sinon el plnteF F F frefD el fit euoup de hoses uxquelles il fut penserF gel ne vous rppelleEtEil ps nos (oles himiques c ih ouiD tout ei est ussi dngereux et ompliqu qu9une expriene de himisteF g9est l qu9intervient l progrmmtion oriente ojet X un dveloppeur ple le tout dns un ue file utiliser o il su0t d9ppuyer sur des outonsF Ce cube, c'est l'objet string. IWS

CHAPITRE 12. DVOILE

INTRODUCTION : LA VRIT SUR LES STRINGS ENFIN

Crer un objet string


v rtion d9un ojet ressemle euoup l rtion d9une vrile lssique omme int ou double X
5inlude `iostremb 5inlude `stringb GG yligtoire pour pouvoir utiliser les ojets string using nmespe stdY int min@A { string mghineY GGgrtion d9un ojet 9mghine9 de type string } return HY

ous remrquerez pour ommener queD pour pouvoir utiliser des ojets de type stri ng dns le odeD il est nessire d9inlure l9enEtte de l iliothque stringF g9est e que j9i fit l deuxime ligneF sntressonsEnous mintennt l ligne o je re un ojet de type stringF F F
Donc. . . on cre un objet de la mme manire qu'on cre une variable ?

sl y plusieurs fons de rer un ojetD elle que vous venez de voir est l plus simpleF itD ouiD 9est extement omme si on vit r une vrile 3
Mais mais. . . comment on fait pour direncier les objets des variables ?

g9est ien tout le prolme X vriles et ojets se ressemlent dns le odeF our viter l onfusionD il y des onventions @qu9on n9est ps olig de suivreAF v plus lre d9entre elles est l suivnte X ! le type des variables ommene pr une minuscule @ex X intA Y ! le type des objets ommene pr une majuscule @ex X oitureAF te sis e que vous llez me dire X  string ne ommene ps pr une mjusule lors que 9est un ojet 3 F sl fut roire que les rteurs de string ne respetient ps ette onventionF wis rssurezEvousD mintennt l pluprt des gens mettent une mjusule u dut de leurs ojets F
2

2. Moi y compris, ce ne sera donc pas la foire dans la suite de ce cours.

IWT

CRER ET UTILISER DES OBJETS

STRING

Initialiser la chane lors de la dclaration

our initiliser notre ojet u moment de l dlrtion @et don lui donner une vE leur 3AD il y plusieurs possiilitsF v plus ournte onsiste ouvrir des prenthses omme nous l9vons fit jusqu9ii X
int min@A { string mghine@4fonjour 34AY GGgrtion d9un ojet 9mghine9 de type string et initilistion } return HY

g9est l tehnique lssique que l9on onnt dj et qui s9pplique ussi ien ux vriles qu9ux ojetsF yn dit que l9on construit l9ojetF
Et comme pour les variables, il faut noter que l'on peut aussi initialiser avec le signe gal : stringmaChaine="Bonjour!";

yn mintennt r un ojet maChaine qui ontient l hne  fonjour 3 F yn peut l90her omme n9importe quelle hne de rtres ve un cout X
int min@A { string mghine@4fonjour 34AY out `` mghine `` endlY GGeffihge du string omme si 9tit une hne de rtres } return HY

fonjour 3

Aecter une valeur la chane aprs dclaration

wintennt que notre ojet est rD ne nous rrtons ps lF ghngeons le ontenu de l hne prs s dlrtion X
int min@A { string mghine@4fonjour 34AY out `` mghine `` endlY mghine a 4fien le onjour 34Y

IWU

CHAPITRE 12. DVOILE

INTRODUCTION : LA VRIT SUR LES STRINGS ENFIN

out `` mghine `` endlY } return HY

fonjour 3 fien le onjour 3

Pour changer le contenu d'une chane aprs sa dclaration, on doit obligatoirement utiliser le symbole =.

gel n9 l9ir de rien mis 9est l que l mgie de l yy opreF ousD l9utilisteurD vous vez ppuy sur un outon pour dire  te veux mintennt que l hne l9intrieur devienne  fien le onjour 3 F l9intrieur de l9ojetD des mnismes @des fontionsA se sont tivs lorsque vous rlis l9oprtionF ges fontions ont vri(D entre utresD s9il y vit de l ple pour stoker l hne dns le tleu de charF illes ont vu que nonF illes ont lors r un nouveu tleu de charD su0smment long ette foisD pour stoker l nouvelle hneF itD tnt qu9 fireD elles ont dtruit l9nien tleu qui ne servit plus rienF it permettezEmoi de vous prler frnhement X e qui s9est pss l9intrieur de l9ojetD on s9en (he roylement 3 g9est ien l tout l9intrt de l yy X l9utilisteur n9 ps esoin de omprendre omment el fontionne l9intrieurF yn se moque de svoir que le texte est stok dns un tleu de charF v9ojet est en quelque sorte intelligent et gre tous les sF xousD nous nous ontentons de l9utiliserF

Concatnation de chanes
smginez que l9on souhite ontner @ssemlerA deux hnesF in thorieD 9est omE pliqu fire r il fut fusionner deux tleux de charF in prtiqueD l yy nous vite de nous souier du fontionnement interne X
int min@A { string hineI@4fonjour 34AY string hineP@4gomment llezEvous c4AY string hineQY hineQ a hineI C hinePY GG QFFF PFFF IFFF gontntioooooon out `` hineQ `` endlY } return HY

fonjour 3gomment llezEvous c

IWV

CRER ET UTILISER DES OBJETS

STRING

te le reonnisD il mnque un espe u milieuF yn n9 qu9 hnger l ligne de l ontntion X


hineQ a hineI C 4 4 C hinePY

sultt X
fonjour 3 gomment llezEvous c

g9est trs simple utiliser lors que derrireD les (oles himiques s9tivent pour sE semler les deux tleux de charF

Comparaison de chanes
ous en voulez enore c rs ien 3 hez que l9on peut omprer des hnes entre elles l9ide des symoles == ou != @que l9on peut don utiliser dns un if 3AF
int min@A { string hineI@4fonjour 34AY string hineP@4gomment llezEvous c4AY if @hineI aa hinePA GG pux { out `` 4ves hines sont identiquesF4 `` endlY } else { out `` 4ves hines sont differentesF4 `` endlY } } return HY

ves hines sont differentesF

l9intrieur de l9ojetD l omprison se fit rtre pr rtre entre les deux tleux de char @ l9ide d9une oule qui ompre hune des lettresAF xousD nous n9vons ps nous souier de tout el X nous demndons l9ojet chaine1 s9il est identique chaine2 Y il fit des luls et nous rpond trs simplement pr un oui ou un nonF IWW

CHAPITRE 12. DVOILE

INTRODUCTION : LA VRIT SUR LES STRINGS ENFIN

Oprations sur les string


ve type string ne s9rrte ps e que nous venons de voirF gomme tout ojet qui se respeteD il propose un nomre importnt d9utres fontionnlits qui permettent de fire tout e dont on esoinF xous n9llons ps psser en revue toutes les fontionnlits des string F xous llons voir les priniplesD dont vous pourriez voir esoin dns l suite du ours
3

Attributs et mthodes
te vous vis dit qu9un ojet tit onstitu de vriles et de fontionsF in fitD on en reprler plus trd mis le voulire est un peu di'rent ve les ojetsF ves vriles ontenues l9intrieur des ojets sont ppeles attributs et les fontions sont ppeles mthodesF smginez que hque mthode @fontionA que propose un ojet orrespond un outon di'rent sur l fe vnt du ueF
On parle aussi de variables membres et de fonctions membres.

our ppeler l mthode d9un ojetD on utilise une riture que vous vez dj vue X o bjet.methode()F yn spre le nom de l9ojet et le nom de l mthode pr un pointF gel signi(e  ur l9ojet indiquD j9ppelle ette mthode @trdution X  sur le ue indiquD j9ppuie sur e outon pour dlenher une tion AF
En thorie, on peut aussi accder aux variables membres (les  attributs ) de l'objet de la mme manire. Cependant, en POO, il y a une rgle trs importante : l'utilisateur ne doit pas pouvoir accder aux variables membres, mais seulement aux fonctions membres (les mthodes). On en reparlera plus en dtail dans le prochain chapitre.

Quelques mthodes utiles du type string


La mthode size()

v mthode size() permet de onntre l longueur de l hne tuellement stoke dns l9ojet de type stringF gette mthode ne prend uun prmtre et renvoie l longueur de l hneF gomme vous venez de le douvrirD il fut ppeler l mthode de l mnire suivnte X
3. Elles ne sont pas toutes indispensables et ce serait un peu long.

PHH

OPRATIONS SUR LES

STRING

mghineFsize@A

issyons el dns un ode omplet qui 0he l longueur d9une hne de rtres X
int min@A { string mghine@4fonjour 34AY out `` 4vongueur de l hine X 4 `` mghineFsize@AY } return HY

vongueur de l hine X W

La mthode erase()

gette mthode trs simple supprime tout le ontenu de l hne X


int min@A { string hine@4fonjour 34AY hineFerse@AY out `` 4v hine ontient X 4 `` hine `` endlY } return HY

v hine ontient X

gomme on pouvit s9y ttendreD l hne ne ontient plus rien


Notez que c'est quivalent chaine="";.

La mthode substr()

ne utre mthode peut se rvler utile X substr()F ille permet d9extrire une prtie de l hne stoke dns un stringF
substr

signie substring, soit  sous-chane  en anglais.

enezD on v regrder son prototypeD vous llez voir que 9est intressnt X PHI

CHAPITRE 12. DVOILE

INTRODUCTION : LA VRIT SUR LES STRINGS ENFIN

string sustr@ sizetype indexD sizetype num a npos AY

gette mthode renvoie don un ojet de type stringF ge ser l sousEhne otenue prs  doupge F ille prend deux prmtres ouD plus extementD un prmtre oligtoire et un prmtre fulttifF in e'etD num possde une vleur pr dfut @nposAD e qui fit que le seond prmtre ne doit ps oligtoirement tre renseignF oyons plus en dtil e qui se he sous es prmtres X ! index permet d9indiquer prtir de quel rtre on doit ouper @e doit tre un numro de rtreAF ! num permet d9indiquer le nomre de rtres que l9on prendF r dfutD l vleur est nposD e qui revient prendre tous les rtres qui restentF i vous indiquez PD l mthode ne renverr que P rtresF ellezD un exemple ser plus prlntD je rois X
int min@A { string hine@4fonjour 34AY out `` hineFsustr@QA `` endlY } return HY

jour 3

yn demnd ouper prtir du troisime rtreD soit l lettre  j D tnt donn que l premire lettre orrespond u rtre nHAF yn volontirement omis le seond prmtre fulttifD e qui fit que substr() renvoy tous les rtres restnts jusqu9 l (n de l hneF issyons de renseigner le prmtre fulttif pour exlure le point d9exlmtion pr exemple X
int min@A { string hine@4fonjour 34AY out `` hineFsustr@QD RA `` endlY } jour return HY

fingo 3 yn demnd prendre R rtres en prtnt du rtre nQD e qui fit qu9on rupr  jour F gomme nous l9vions vu dns le hpitre sur les tleux @pge IPWAD il existe une utre mnire de fire pour der un seul rtreF yn utilise les rohets [] omme pour les tleux X PHP

OPRATIONS SUR LES

STRING

string hine@4fonjour 34AY out `` hineQ `` endlY GGeffihe l lettre 9j9

La mthode c_str()

gette mthode est un peu prtiulire mis prfois fort utileF on rle c envoyer un pointeur vers le tleu de char que ontient l9ojet de type stringF uel intrt me direzEvous c in gCCD a priori uunF yn prfre lrgement mnipuler un ojet string plutt qu9un tleu de char r 9est plus simple et plus srF xnmoinsD il peut @j9i ien dit il peut A rriver que vous deviez envoyer une fontion un tleu de charF hns e sD l mthode c_str() vous permet de ruprer l9dresse du tleu de char qui se trouve l9intrieur de l9ojet stringF hns un hpitre prdentD nous en vons eu esoin pour indiquer le nom du (hier ouvrirD souvenezE vous X
string onst nompihier@4gXGxnoGsoresFtxt4AY ofstrem monplux@nompihierFstr@AAY

v9usge de c_str() reste ssez rre mlgr toutF

En rsum
! v progrmmtion oriente ojet est une fon de onevoir son odeF yn onsidre qu9on mnipule des ojetsF ! ves ojets sont prfois omplexes l9intrieur mis leur utilistion nous est volonE tirement simpli(eF g9est un des vntges de l progrmmtion oriente ojetF ! n ojet est onstitu d9ttriuts et de mthodesD 9estEEdire de vriles et de fontions memresF ! yn ppelle les mthodes de ses ojets pour les modi(er ou otenir des informtionsF ! v gestion du texte en mmoire est en fit omplexeF our nous simpli(er les hosesD le lngge gCC nous propose le type stringF qre luiD nous pouvons rer des ojets de type string et mnipuler du texte sns voir nous souier du fontionnement de l mmoireF

PHQ

CHAPITRE 12. DVOILE

INTRODUCTION : LA VRIT SUR LES STRINGS ENFIN

PHR

Chapitre

13
Dicult :

Les classes (Partie 1/2)

u chapitre prcdent, vous avez vu que la programmation oriente objet pouvait nous simplier la vie en  masquant , en quelque sorte, le code complexe. C'est un des avantages de la POO mais ce n'est pas le seul, comme vous allez le dcouvrir petit petit : les objets sont aussi facilement rutilisables et modiables. partir de maintenant, nous allons apprendre crer des objets. Vous allez voir que c'est tout un art et que cela demande de la pratique. Il y a beaucoup de programmeurs qui prtendent faire de la POO et qui le font pourtant trs mal. En eet, on peut crer un objet de 100 faons direntes et c'est nous de choisir chaque fois la meilleure, la plus adapte. Ce n'est pas vident, il faut donc bien rchir avant de se lancer dans le code comme des forcens. Allez, on prend une grande inspiration et on plonge ensemble dans l'ocan de la POO !

PHS

CHAPITRE 13.

LES CLASSES (PARTIE 1/2)

Crer une classe


gommenons pr l question qui doit vous rler les lvresF
Je croyais qu'on allait apprendre crer des objets, pourquoi tu nous parles de crer une classe maintenant ? Quel est le rapport ?

ih ien justementD pour rer un ojetD il fut d9ord rer une lsse 3 te m9explique X pour onstruire une misonD vous vez esoin d9un pln d9rhitete non c ih ien imginez simplement que l lsse 9est le pln et que l9ojet 9est l misonF  grer une lsse D 9est don dessiner les plns de l9ojetF ne fois que vous vez les plnsD vous pouvez fire utnt de misons que vous voulez en vous snt sur es plnsF our les ojets 9est preil X une fois que vous vez fit l lsse @le plnAD vous pouvez rer utnt d9ojets du mme type que vous voulez @(gure IQFIAF
Vocabulaire : on dit qu'un objet est une instance d'une classe. C'est un mot trs courant que l'on rencontre souvent en POO. Cela signie qu'un objet est la matrialisation concrte d'une classe (tout comme la maison est la matrialisation concrte du plan de la maison). Oui, je sais, c'est trs mtaphysique la POO mais vous allez voir, on s'y fait.

Figure IQFI ! ne fois l lsse reD on peut onstruire des ojets

PHT

CRER UNE CLASSE

Crer une classe, oui mais laquelle ?


evnt toutD il v flloir hoisir l lsse sur lquelle nous llons trvillerF eprenons l9exemple sur l9rhiteture X llonsEnous rer un pprtementD une vill ve pisineD un loft spieux c in lirD quel type d9ojet voulonsEnous tre ples de rer c ves hoix ne mnquent psF te sis queD qund on duteD on du ml imginer e qui peut tre onsidr omme un ojetF v rponse est X presque tout 3 ous llez voirD vous llez petit petit voir le feeling qu9il fut ve l yyF uisque vous dutezD 9est moi qui vis hoisir @vous n9vez ps trop le hoixD de toute fon 3AF our notre exempleD nous llons rer une lsse Personnage qui v reprsenter un personnge de jeu de rle @qAF
Si vous n'avez pas l'habitude des jeux de rle, rassurez-vous : moi non plus. Pour suivre ce chapitre, vous n'avez pas besoin de savoir jouer des RPG. J'ai choisi cet exemple car il me parat didactique, amusant, et qu'il peut dboucher sur la cration d'un jeu la n. Mais ce sera vous de le terminer.

Bon, on la cre cette classe ?


g9est prtiF our ommenerD je vous rppelle qu9une lsse est onstitue @n9ouliez ps e voE ulireD il est fonEdEmenEtl 3A X ! de vrilesD ii ppeles attributs @on prle ussi de variables membresA Y ! de fontionsD ii ppeles mthodes @on prle ussi de fonctions membresAF oii le ode miniml pour rer une lsse X
lss ersonnge { }Y GG x9ouliez ps le pointEvirgule l fin 3

gomme vous le voyezD on utilise le motEl classF sl est suivi du nom de l lsse que l9on veut rerF siD 9est PersonnageF
Souvenez-vous de cette rgle trs importante : il faut que le nom de vos classes commence toujours par une lettre majuscule ! Bien que ce ne soit pas obligatoire (le compilateur ne hurlera pas si vous commencez par une minuscule), cela vous sera trs utile par la suite pour direncier les noms des classes des noms des objets.

xous llons rire toute l d(nition de l lsse entre les oldesF out ou presque PHU

CHAPITRE 13.

LES CLASSES (PARTIE 1/2)

se psser don l9intrieur de es oldesF it surtoutD trs importntD le tru qu9on oulie u moins une fois dns s vie X il y a un point-virgule aprs l'accolade fermante !

Ajout de mthodes et d'attributs


fonD 9est ien eu mis notre lsse Personnage est pluttF F F videF ue vEtEon mettre dns l lsse c ous le svez dj voyonsF ! des attributs X 9est le nom que l9on donne ux variables ontenues dns des lsses Y ! des mthodes X 9est le nom que l9on donne ux fonctions ontenues dns des lssesF ve ut du jeuD mintenntD 9est justement d9rriver fire l liste de tout e qu9on veut mettre dns notre PersonnageF he quels ttriuts et de quelles mthodes EtEil esoin c g9est justement l9tpe de rexionD l plus importnteF g9est pour el que je vous i dit u dut de e hpitre qu9il ne fllit surtout ps oder omme des rres ds le dut mis prendre le temps de rchirF
Cette tape de rexion avant le codage est essentielle quand on fait de la POO. Beaucoup de gens, dont moi, ont l'habitude de sortir une feuille de papier et un crayon pour tablir la liste des attributs et mthodes dont ils vont avoir besoin. Un langage spcial, appel UML, a d'ailleurs t spcialement cr pour concevoir les classes avant de commencer les coder.

r quoi ommener X les ttriuts ou les mthodes c sl n9y ps d9ordreD en fitD mis je trouve un peu plus logique de ommener pr voir les ttriuts puis les mthodesF
Les attributs

g9est e qui v rtriser votre lsseD ii le personngeF ge sont des vrilesD elles peuvent don voluer u (l du tempsF wis qu9estEe qui rtrise un personnge de jeu de rle c ellonsD un petit e'ortF ! r exempleD tout personnge un niveu de vieF ropD el fit un premier ttriut X vie 3 yn dir que e ser un int et qu9il ser ompris entre H et IHH @H a mortD IHH a toute l vieAF ! hns un jeu de rleD il y le niveu de mgieD ussi ppel manaF v enoreD on v dire que 9est un int ompris entre H et IHHF i le personnge H de mnD il ne peut plus lner de sort mgique et doit ttendre que son mn se rehrge tout seul u (l du temps @ou oire une potion de mn 3AF ! yn pourrit rjouter ussi le nom de l9rme que porte le joueur X nomArmeF yn v utiliser pour el un stringF ! in(nD il me semle indispensle d9jouter un ttriut degatsArmeD un int qui indiquerit ette fois le degr de dgts que porte notre rme hque oupF yn peut don dj ommener omplter l lsse ve es premiers ttriuts X PHV

CRER UNE CLASSE

lss ersonnge { int mvieY int mmnY string mnomermeY int mdegtsermeY }Y

heux ou trois petites hoses svoir sur e ode X ! ge n9est ps une oligtion mis une grnde prtie des progrmmeurs @dont moiA l9hitude de fire ommener tous les noms des ttriuts de lsse pr  m @le  m signi(nt  memre D pour indiquer que 9est une vrile memreD 9estEEdire un ttriutAF gel permet de ien di'renier les ttriuts des vriles  lssiques @ontenues dns des fontions pr exempleAF ! sl est impossile d9initiliser les ttriuts iiF gel doit tre fit via e qu9on ppelle un onstruteurD omme on le verr un peu plus loinF ! gomme on utilise un ojet stringD il fut ien penser rjouter un #include<str ing> dns votre (hierF v hose essentielle retenir iiD 9est que l9on utilise des ttriuts pour reprsenter l notion d9appartenanceF yn dit qu9un Personnage a une vie et a un niveu de mgieF sl possde glement une rmeF vorsque vous reprez une reltion d9pprtenneD il y de fortes hnes qu9un ttriut soit l solution dopterF
Les mthodes

ves mthodesD ellesD sont grosso modo les tions que le personnge peut e'etuer ou qu9on peut lui fire fireF ves mthodes lisent et modi(ent les ttriutsF oii quelques tions rlisles ve notre personnge X ! recevoirDegats X le personnge prend un ertin nomre de dgts et don perd de l vieF ! attaquer X le personnge ttque un utre personnge ve son rmeF sl in)ige utnt de dgts que son rme le lui permet @9estEEdire degatsArmeAF ! boirePotionDeVie X le personnge oit une potion de vie et reggne un ertin nomre de points de vieF ! changerArme X le personnge rupre une nouvelle rme plus puissnteF yn hnge le nom de l9rme et les dgts qui vont veF ! estVivant X renvoie true si le personnge est toujours vivnt @il possde plus que H point de vieAD sinon renvoie falseF g9est un on dutD je trouveF yn v rjouter el dns l lsse vnt les ttriuts @en yyD on prfre prsenter les mthodes avant les ttriutsD ien que el ne soit ps oligtoireA X
lss ersonnge {

PHW

CHAPITRE 13.

LES CLASSES (PARTIE 1/2)

GG wthodes void reevoirhegts@int nhegtsA { } void ttquer@ersonnge 8ileA { } void oireotionheie@int quntiteotionA { } void hngererme@string nomxouvelleermeD int degtsxouvelleermeA { } ool estivnt@A { } GG ettriuts int mvieY int mmnY string mnomermeY int mdegtsermeY

}Y

Je n'ai volontairement pas crit le code des mthodes, on le fera aprs.

gei ditD vous devriez dj voir une petite ide de e que vous llez mettre dns es mthodesF r exempleD recevoirDegats retrnher le nomre de dgts @indiqus en prmtre pr nbDegatsA l vie du personngeF v mthode attaquer est glement intresE snte X elle prend en prmtreF F F un utre personngeD plus extement une rfrene vers le personnge ile que l9on doit ttquer 3 it que fer ette mthodeD votre vis c ih ouiD elle ppeller l mthode recevoirDegats de l ile pour lui in)iger des dgtsF ous ommenez omprendre un peu omme tout el est li et terrilement logique c yn met en gnrl un peu de temps vnt de orretement  penser ojet F i vous vous PIH

DROITS D'ACCS ET ENCAPSULATION

dites que vous n9uriez ps pu inventer un tru omme el tout seulD rssurezEvous X tous les dutnts pssent pr lF fore de prtiquerD el v venirF our infoD ette lsse ne omporte ps toutes les mthodes que l9on pourrit y rer X pr exempleD on n9utilise ps de mgie iiF ve personnge ttque seulement ve une rme @une pe pr exempleA et n9emploie don ps de sortF te lisse exprs quelques fontions mnquntes pour vous initer omplter l lsse ve vos idesF in rsumD un ojet est el et ien un mix de vriles @les ttriutsA et de fontions @les mthodesAF v pluprt du tempsD les mthodes lisent et modi(ent les ttriuts de l9ojet pour le fire voluerF n ojet est u (nl un petit systme intelligent et utonomeD ple de surveiller tout seul son on fontionnementF

Droits d'accs et encapsulation


xous llons mintennt nous intresser u onept le plus fondamental de l yy X l'encapsulationF xe vous lissez ps e'ryer pr e motD vous llez vite omprendre e que el signi(eF out d9ordD un petit rppelF in yyD il y deux prties ien distintes X ! yn cre des lsses pour d(nir le fontionnement des ojetsF g9est e qu9on pprend fire iiF ! yn utilise des ojetsF g9est e qu9on ppris fire u hpitre prdentF sl fut ien distinguer es deux prties r el devient ii trs importntF
Cration de la classe :
lss ersonnge { GG wthodes void reevoirhegts@int nhegtsA { } void ttquer@ersonnge 8ileA { } void oireotionheie@int quntiteotionA { } void hngererme@string nomxouvelleermeD int degtsxouvelleermeA {

PII

CHAPITRE 13.

LES CLASSES (PARTIE 1/2)

} ool estivnt@A { } GG ettriuts int mvieY int mmnY string mnomermeY int mdegtsermeY

}Y

Utilisation de l'objet :
int min@A { ersonnge dvidD golithY GGgrtion de P ojets de type ersonnge X dvid et golith golithFttquer@dvidAY GGgolith ttque dvid dvidFoireotionheie@PHAY GGdvid rupre PH de vie en uvnt une potion golithFttquer@dvidAY GGgolith rttque dvid dvidFttquer@golithAY GGdvid ontreEttqueFFF 9est ssez lir non c golithFhngererme@4houle hhe trnhnte vnneuse de l mort4D RHAY golithFttquer@dvidAY return HY

enezD pourquoi n9essieritEon ps e ode c ellezD on met tout dns un mme (hier @en prennt soin de d(nir l lsse avant le main()A et zou 3
5inlude `iostremb 5inlude `stringb using nmespe stdY lss ersonnge { GG wthodes void reevoirhegts@int nhegtsA { }

PIP

DROITS D'ACCS ET ENCAPSULATION

void ttquer@ersonnge 8ileA { } void oireotionheie@int quntiteotionA { } void hngererme@string nomxouvelleermeD int degtsxouvelleermeA { } ool estivnt@A { } GG ettriuts int mvieY int mmnY string mnomermeY int mdegtsermeY

}Y

int min@A { ersonnge dvidD golithY GGgrtion de P ojets de type ersonnge X dvid et golith golithFttquer@dvidAY dvidFoireotionheie@PHAY golithFttquer@dvidAY dvidFttquer@golithAY GGgolith ttque dvid GGdvid rupre PH de vie en uvnt une potion GGgolith rttque dvid GGdvid ontreEttqueFFF 9est ssez lir non c

golithFhngererme@4houle hhe trnhnte vnneuse de l mort4D RHAY golithFttquer@dvidAY return HY

gopier e ode gode we X RSSHIR  gompilez et dmirezF F F l elle erreur de ompiltion 3


irror X void ersonngeXXttquer@ersonnge8A is privte within this ontext

PIQ

CHAPITRE 13.

LES CLASSES (PARTIE 1/2)

inore une insulte de l prt du ompilteur 3

Les droits d'accs


yn en rrive justement u prolme qui nous intresse X elui des droits d9s @ouiD j9i fit exprs de provoquer ette erreur de ompiltion Y vous ne pensiez tout de mme ps que e n9tit ps prvu c AF yuvrez grnd vos oreilles X hque ttriut et hque mthode d9une lsse peut posE sder son propre droit d9sF sl existe grosso modo deux droits d9s di'rents X ! public X l9ttriut ou l mthode peut tre ppel depuis l9extrieur de l9ojetF ! private X l9ttriut ou l mthode ne peut ps tre ppel depuis l9extrieur de l9ojetF Par dfaut, tous les lments d'une classe sont privateF
Il existe d'autres droits d'accs mais ils sont un peu plus complexes. Nous les verrons plus tard.

gonrtementD qu9estEe que el signi(e c u9estEe que  l9extrieur de l9ojet c ih ienD dns notre exempleD  l9extrieur 9est le main()F in e'etD 9est l o on utilise l9ojetF yn fit ppel des mthodes misD omme elles sont pr dfut privesD on ne peut ps les ppeler depuis le main() 3 our modi(er les droits d9s et mettre pr exemple publicD il fut tper  puli suivi du symole  X @deux pointsAF out e qui se trouver l suite ser publicF oii e que je vous propose de fire X on v mettre en puli toutes les mthodes et en priv tous les ttriutsF gel nous donne X
lss ersonnge { GG out e qui suit est puli @essile depuis l9extrieurA puliX void reevoirhegts@int nhegtsA { } void ttquer@ersonnge 8ileA { } void oireotionheie@int quntiteotionA { }

PIR

DROITS D'ACCS ET ENCAPSULATION

void hngererme@string nomxouvelleermeD int degtsxouvelleermeA { } ool estivnt@A { } GG out e qui suit est priv @inessile depuis l9extrieurA privteX int mvieY int mmnY string mnomermeY int mdegtsermeY

}Y

out e qui suit le motEl public: est puli don toutes nos mthodes sont puliquesF insuite vient le motEl private:F out e qui suit e motEl est priv don tous nos ttriuts sont privsF oilD vous pouvez mintennt ompiler e ode et vous verrez qu9il n9y ps de prolme @mme si le ode ne fit rien pour l9instntAF yn ppelle des mthodes depuis le main() X omme elles sont puliquesD on le droit de le fireF in revnheD nos ttriuts sont privsD e qui veut dire qu9on n9 ps le droit de les modi(er depuis le main()F in lirD on ne peut pas crire dns le main() X
golithFmvie a WHY

issyezD vous verrez que le ompilteur vous ressort l mme erreur que tout l9heure X  ton idule est privteF F F l l lF F F ps le droit d9ppeler un lment privte depuis l9extrieur de l lsse F wis lorsF F F el veut dire qu9on ne peut ps modi(er l vie du personnge depuis le main() c ih oui 3 g9est e qu9on ppelle l9encapsulationF

L'encapsulation
Moi j'ai une solution ! Si on mettait tout en public ? Les mthodes et les attributs, comme cela on peut tout modier depuis le main() et plus aucun problme ! Non ? Quoi j'ai dit une btise ?

yhD trois fois rienF ous venez juste de vous fire utnt d9ennemis qu9il y de proE grmmeurs qui font de l yy dns le mondeF PIS

CHAPITRE 13.

LES CLASSES (PARTIE 1/2)

sl y une rgle d9or en yy et tout doule de lF 9il vous pltD imprimez ei en gros sur une feuille et plrdez ette feuille sur un mur de votre hmre X
Encapsulation : tous les attributs d'une classe doivent toujours tre privs.

gel l9ir teD stupideD irr)hiD et pourtnt tout e qui fit que l yy est un prinipe puissnt vient de lF te ne veux ps en voir un seul mettre un ttriut en pu blic 3 oil qui explique pourquoi j9i fit exprsD ds le dutD de mettre les ttriuts en privF einsiD on ne peut ps les modi(er depuis l9extrieur de l lsse et el respete le prinipe d9enpsultionF ous vous souvenez de e shm du hpitre prdent @(gure PHFIA c

Figure IQFP ! v9utilistion du ode est simpli(e gre l9utilistion d9un ojet

it lD pif pf poufD vous devriez voir tout ompris d9un oupF in e'etD le ut du modle ojet est justement de msquer l9utilisteur les informtions omplexes @les ttriutsA pour viter qu9il ne fsse des tises veF smginez pr exemple que l9utilisteur puisse modi(er l vieF F F qu9estEe qui l9empE herit de mettre ISH de vie lors que l limite mximle est IHH c g9est pour el qu9il fut toujours psser pr des mthodes @des fontionsA qui vont d'abord vri(er qu9on fit les hoses orretement vnt de modi(er les ttriutsF gel grntit que le ontenu de l9ojet reste une  ote noire F yn ne sit ps omment el fontionne l9intrieur qund on l9utilise et 9est trs ien insiF g9est une suritD el permet d9viter de fire pter tout le zr l9intrieurF PIT

mthodesF

ves (oles himiquesD e sont les attributsF ves outons sur l fde vntD e sont les

SPARER PROTOTYPES ET DFINITIONS

Si vous avez fait du C, vous connaissez le mot-cl struct. On peut aussi l'utiliser en C++ pour crer des classes. La seule dirence avec le mot-cl class est que, par dfaut, les mthodes et attributs sont publics au lieu de privs.

Sparer prototypes et dnitions


fonD on vne mis on n9 ps (ni 3 oii e que je voudris qu9on fsse X ! sprer les mthodes en prototypes et d(nitions dns deux (hiers di'rentsD pour voir un ode plus modulire Y ! implmenter les mthodes de l lsse Personnage @9estEEdire rire le ode l9intrieur pre queD pour le momentD il n9y rienAF e stdeD notre lsse (gure dns le (hier main.cppD juste uEdessus du main()F it les mthodes sont diretement rites dns l d(nition de l lsseF gel fontionneD mis 9est un peu ourrinF our mliorer elD il fut tout d9ord lirement sprer le main() @qui se trouve dns main.cppA des lssesF our chaque lsseD on v rer X ! un header @(hier *.hA qui ontiendr les ttriuts et les prototypes de l lsse Y ! un (hier soure @(hier *.cppA qui ontiendr l d(nition des mthodes et leur implmenttionF te vous propose d9jouter votre projet deux (hiers nomms trs extement X ! Personnage.h Y ! Personnage.cppF
Vous noterez que je mets aussi une majuscule la premire lettre du nom du chier, histoire d'tre cohrent jusqu'au bout.

ous devriez tre ples de fire el tous seuls ve votre shiF ous gode: :floksD je psse pr les menus File b NewFileD je sisis pr exemple le nom Personnage.h ve son extension et je rponds  yui qund gode: :floks me demnde si je veux jouter le nouveu (hier u projet en ours @(gure IQFQAF

Figure IQFQ ! ejouter un (hier u projet

PIU

CHAPITRE 13.

LES CLASSES (PARTIE 1/2)

Personnage.h

ve (hier .h v don ontenir l dlrtion de l lsse ve les ttriuts et les protoE types des mthodesF hns notre sD pour l lsse PersonnageD nous otenons X
5ifndef hipiyxxeqi 5define hipiyxxeqi 5inlude `stringb lss ersonnge { puliX void void void void ool reevoirhegts@int nhegtsAY ttquer@ersonnge 8ileAY oireotionheie@int quntiteotionAY hngererme@stdXXstring nomxouvelleermeD int degtsxouvelleermeAY estivnt@AY

privteX int mvieY int mmnY stdXXstring mnomermeY GGs de using nmespe stdD il fut don mettre stdXX devnt string int mdegtsermeY }Y 5endif

gomme vous pouvez le onstterD seuls les prototypes des mthodes (gurent dns le . hF g9est dj euoup plus lirF
Dans les .h, il est recommand de ne jamais mettre la directive usingnames pacestd; car cela pourrait avoir des eets nfastes, par la suite, lorsque vous utiliserez la classe. Par consquent, il faut rajouter le prxe std:: devant chaque string du .h. Sinon, le compilateur vous sortira une erreur du type stringdoesnotnameatype.
Personnage.cpp

g9est l qu9on v rire le ode de nos mthodes @on dit qu9on implmente les mE thodesAF v premire hose ne ps oulier !sinon el v ml se psser! 9est d9inlure <string> et Personnage.hF yn peut ussi rjouter ii un usingnamespacestd;F yn le droit de le fire r on est dns le .cpp @n9ouliez ps e que je vous i dit plus tt X il fut viter de le mettre dns le .hAF PIV

SPARER PROTOTYPES ET DFINITIONS

5inlude 4ersonngeFh4 using nmespe stdY

wintenntD voil omment el se psse X pour hque mthodeD vous devez fire prder le nom de l mthode pr le nom de l lsse suivi de deux fois deux points @ X XAF our recevoirDegatsD voii e que nous otenons X
void ersonngeXXreevoirhegts@int nhegtsA { }

gel permet u ompilteur de svoir que ette mthode se rpporte l lsse Perso nnageF in e'etD omme l mthode est ii rite en dehors de l d(nition de l lsseD le ompilteur n9urit ps su quelle lsse pprtenit ette mthodeF
Personnage::recevoirDegats

wintenntD 9est prti X implmentons l mthode recevoirDegatsF te vous vis expliqu un peu plus hut e qu9il fllit fireF ous llez voirD 9est trs simple X
void ersonngeXXreevoirhegts@int nhegtsA { mvie Ea nhegtsY GGyn enlve le nomre de dgts reus l vie du personnge if @mvie ` HA GGour viter d9voir une vie ngtive { mvie a HY GGyn met l vie H @el veut dire mortA }

v mthode modi(e don l vleur de l vieF La mthode a le droit de modier l'attributD r elle fit prtie de l lsseF xe soyez don ps surpris X 9est justement l9endroit o on le droit de touher ux ttriutsF v vie est diminue du nomre de dgts reusF in thorieD on urit pu se ontenter de l premire instrution mis on fit une vri(tion supplmentireF i l vie est desendue enEdessous de H @pre que le personnge reu PH de dgts lors qu9il ne lui restit plus que IH de vieD pr exempleAD on rmne l vie H pour viter d9voir une vie ngtive @el ne fit ps trs proD une vie ngtiveAF he toute fonD H de vieD le personnge est onsidr omme mortF it voil pour l premire mthode 3 ellezD on enhne 3 PIW

CHAPITRE 13.

LES CLASSES (PARTIE 1/2)

Personnage : :attaquer
void ersonngeXXttquer@ersonnge 8ileA { ileFreevoirhegts@mdegtsermeAY GGyn inflige l ile les dgts que use notre rme }

gette mthode est peutEtre trs ournteD elle n9en est ps moins trs intressnte 3 yn reoit en prmtre une rfrene vers un ojet de type PersonnageF yn urit pu reevoir ussi un pointeur misD omme les rfrenes sont plus files mnipulerD on ne v ps s9en priverF v rfrene onerne le personnge ile que l9on doit ttquerF our in)iger des dgts l ileD on ppelle s mthode recevoirDegats en fisnt X cible.recevoirDegat
s

uelle quntit de dgts envoyer l ile c ous vez l rponse sous vos yeux X le nomre de points de dgts indiqus pr l9ttriut m_degatsArme 3 yn envoie don l ile l vleur de m_degatsArme de notre personngeF
Personnage::boirePotionDeVie
void ersonngeXXoireotionheie@int quntiteotionA { mvie Ca quntiteotionY if @mvie b IHHA GGsnterdition de dpsser IHH de vie { mvie a IHHY }

ve personnge reprend utnt de vie que e que permet de ruprer l potion qu9il oitF yn vri(e toutefois qu9il ne dpsse ps les IHH de vie rD omme on l9 dit plus ttD il est interdit de dpsser ette vleurF
Personnage::changerArme
void ersonngeXXhngererme@string nomxouvelleermeD int degtsxouvelleermeA { mnomerme a nomxouvelleermeY mdegtserme a degtsxouvelleermeY }

our hnger d9rmeD on stoke dns nos ttriuts le nom de l nouvelle rme insi que ses nouveux dgtsF ves instrutions sont trs simples X on fit simplement psser dns nos ttriuts e qu9on reu en prmtresF PPH

SPARER PROTOTYPES ET DFINITIONS

Personnage::estVivant
ool ersonngeXXestivnt@A { if @mvie b HA GGlus de H de vie c { return trueY GGesD il est vivnt 3 } else { return flseY GGpeD il n9est plus vivnt 3 } }

gette mthode permet de vri(er que le personnge est toujours vivntF ille renvoie vri @trueA s9il plus de H de vie et fux @falseA sinonF
Code complet de Personnage.cpp

in rsumD voii le ode omplet de Personnage.cpp X


5inlude 4ersonngeFh4 using nmespe stdY void ersonngeXXreevoirhegts@int nhegtsA { mvie Ea nhegtsY GGyn enlve le nomre de dgts reus l vie du personnge if @mvie ` HA GGour viter d9voir une vie ngtive { mvie a HY GGyn met l vie H @el veut dire mortA }

void ersonngeXXttquer@ersonnge 8ileA { ileFreevoirhegts@mdegtsermeAY GGyn inflige l ile les dgts que use notre rme } void ersonngeXXoireotionheie@int quntiteotionA { mvie Ca quntiteotionY if @mvie b IHHA GGsnterdition de dpsser IHH de vie { mvie a IHHY

PPI

CHAPITRE 13.

LES CLASSES (PARTIE 1/2)

void ersonngeXXhngererme@string nomxouvelleermeD int degtsxouvelleermeA { mnomerme a nomxouvelleermeY mdegtserme a degtsxouvelleermeY } ool ersonngeXXestivnt@A { if @mvie b HA GG lus de H de vie c { return trueY GGesD il est vivnt 3 } else { return flseY GGpeD il n9est plus vivnt 3 } }

gopier e ode gode we X UHRPQP 


main.cpp

etour u main()F remire hose ne ps oulier X inlure Personnage.h pour pouvoir rer des ojets de type PersonnageF
5inlude 4ersonngeFh4 GGxe ps oulier

ve main() reste le mme que tout l9heureD on n9 ps esoin de le modi(erF eu (nlD le ode est don trs ourt et le (hier main.cpp ne fit qu9utiliser les ojets X
5inlude `iostremb 5inlude 4ersonngeFh4 GGxe ps oulier using nmespe stdY int min@A { ersonnge dvidD golithY GGgrtion de P ojets de type ersonnge X dvid et golith golithFttquer@dvidAY GGgolith ttque dvid dvidFoireotionheie@PHAY GGdvid rupre PH de vie en uvnt une potion golithFttquer@dvidAY GGgolith rttque dvid dvidFttquer@golithAY GGdvid ontreEttqueFFF 9est ssez lir non c

PPP

SPARER PROTOTYPES ET DFINITIONS

golithFhngererme@4houle hhe trnhnte vnneuse de l mort4D RHAY golithFttquer@dvidAY } return HY

N'excutez pas le programme pour le moment. En eet, nous n'avons toujours pas vu comment faire pour initialiser les attributs, ce qui rend notre programme inutilisable. Nous verrons comment le rendre pleinement fonctionnel au prochain chapitre et vous pourrez alors (enn !) l'excuter.

our le moment il fudr don vous ontenter de votre imgintionF issyez d9imginer que hvid et qolith sont ien en trin de omttre 3
1

En rsum
! ! ! ! sl est nessire de rer une lsse pour pouvoir ensuite rer des ojetsF v lsse est le pln de onstrution de l9ojetF ne lsse est onstitue d9ttriuts et de mthodes @vriles et fontionsAF ves lments qui onstituent l lsse peuvent tre pulis ou privsF 9ils sont puE lisD tout le monde peut les utiliser n9importe o dns le odeF 9ils sont privsD seule l lsse peut les utiliserF ! in progrmmtion oriente ojetD on suit l rgle d9enpsultion X on rend les ttriE uts privsD (n d9oliger les utres dveloppeurs utiliser uniquement les mthodesF

1. Je ne veux pas vous gcher la chute mais, normalement, c'est David qui gagne la n !

PPQ

CHAPITRE 13.

LES CLASSES (PARTIE 1/2)

PPR

Chapitre

14
Dicult :

Les classes (Partie 2/2)

llez, on enchane ! Pas question de s'endormir, on est en plein dans la POO, l. Au chapitre prcdent, nous avons appris crer une classe basique, rendre le code modulaire en POO et surtout nous avons dcouvert le principe d'encapsulation (je vous rappelle que l'encapsulation est trs importante, c'est la base de la POO). Dans ce chapitre, nous allons dcouvrir comment initialiser nos attributs l'aide d'un constructeur, lment indispensable toute classe qui se respecte. Puisqu'on parlera de constructeur, on parlera aussi de destructeur, vous verrez que cela va de pair. Nous complterons notre classe Personnage et nous l'associerons une nouvelle classe Arme que nous allons crer. Nous dcouvrirons alors tout le pouvoir qu'orent les combinaisons de classes et vous devriez normalement commencer imaginer pas mal de possibilits partir de l.

PPS

CHAPITRE 14.

LES CLASSES (PARTIE 2/2)

Constructeur et destructeur
eprenonsF xous vons mintennt Q (hiers X ! main.cpp X il ontient le main()D dns lequel nous vons r deux ojets de type Personnage X david et goliathF ! Personnage.h X 9est le header de l lsse PersonnageF xous y fisons (gurer les prototypes des mthodes et les ttriutsF xous y d(nissons l porte @public G privateA de hun des lmentsF our respeter le prinipe d9enpsultionD tous nos ttriuts sont privsD 9estEEdire non essiles de l9extrieurF ! Personnage.cpp X 9est le (hier dns lequel nous implmentons nos mthodesD 9estE Edire dns lequel nous rivons le ode soure des mthodesF our l9instntD nous vons d(ni et implment ps ml de mthodesF te voudris vous prler ii de P mthodes prtiulires que l9on retrouve dns l pluprt des lsses X le onstruteur et le destruteurF ! le constructeur X 9est une mthode ppele utomtiquement hque fois que l9on re un ojet s sur ette lsseF ! le destructeur X 9est une mthode ppele utomtiquement lorsqu9un ojet est dtruitD pr exemple l (n de l fontion dns lquelle il t dlr ouD si l9ojet t llou dynmiquement ve newD lors d9un deleteF oyons plus en dtil omment fontionnent es mthodes un peu prtiuliresF F F

Le constructeur
gomme son nom l9indiqueD 9est une mthode qui sert construire l9ojetF hs qu9on re un ojetD le onstruteur est utomtiquement ppelF r exempleD lorsqu9on rit dns le main() X
ersonnge dvidD golithY

le onstruteur de l9ojet david est ppelD insi que elui de l9ojet goliathF
Un constructeur par dfaut est automatiquement cr par le compilateur. C'est un constructeur vide, qui ne fait rien de particulier. On a cependant trs souvent besoin de crer soi-mme un constructeur qui remplace ce constructeur vide par dfaut.
Le rle du constructeur

i le onstruteur est ppel lors de l rtion de l9ojetD e n9est ps pour fire joliF in fitD le rle prinipl du onstruteur est d9initialiser les ttriutsF in e'etD souvenezEvous X nos ttriuts sont dlrs dns Personnage.h mis ils ne sont ps initiliss 3 PPT

CONSTRUCTEUR ET DESTRUCTEUR

evoii le ode du (hier Personnage.h X


5inlude `stringb lss ersonnge { puliX void void void void ool reevoirhegts@int nhegtsAY ttquer@ersonnge 8ileAY oireotionheie@int quntiteotionAY hngererme@stdXXstring nomxouvelleermeD int degtsxouvelleermeAY estivnt@AY

privteX int mvieY int mmnY stdXXstring mnomermeY int mdegtsermeY

}Y

xos ttriuts m_vieD m_mana et m_degatsArmes ne sont ps initiliss 3 ourquoi c re qu9on n9 ps le droit d9initiliser les ttriuts iiF g9est justement dns le onstruteur qu9il fut le fireF
En fait, le constructeur est indispensable pour initialiser les attributs qui ne sont pas des objets (ceux qui ont donc un type classique : int, double, ch ar. . .). En eet, ceux-ci ont une valeur inconnue en mmoire (cela peut tre 0 comme -3451). En revanche, les attributs qui sont des objets, comme c'est ici le cas de m_nomArme qui est un string, sont automatiquement initialiss par le langage C++ avec une valeur par dfaut.
Crer un constructeur
Le constructeur est une mthode mis une mthode un peu prtiulireF in e'etD pour rer un onstruteurD il y deux rgles respeter X ! sl fut que l mthode it le mme nom que l lsseF hns notre sD l mthode devr don s9ppeler  ersonnge F ! v mthode ne doit rien renvoyerD ps mme void 3 g9est une mthode sns uun type de retourF i on dlre son prototype dns Personnage.hD el donne le ode suivnt X
5inlude `stringb

PPU

CHAPITRE 14.

LES CLASSES (PARTIE 2/2)

lss ersonnge { puliX ersonnge@AY GGgonstruteur void reevoirhegts@int nhegtsAY void ttquer@ersonnge 8ileAY void oireotionheie@int quntiteotionAY void hngererme@stdXXstring nomxouvelleermeD int degtsxouvelleermeAY ool estivnt@AY privteX int mvieY int mmnY stdXXstring mnomermeY int mdegtsermeY

}Y

ve onstruteur se voit du premier oup d9il X dj pre qu9il n9 uun type de retourD ensuite pre qu9il porte le mme nom que l lsseF it si on en pro(tit pour oder e onstruteur dns Personnage.cpp c oii quoi pourrit ressemler son implmenttion X
ersonngeXXersonnge@A { mvie a IHHY mmn a IHHY mnomerme a 4pe rouille4Y mdegtserme a IHY }

Notez que j'ai utilis ici des accents. Ne vous en proccupez pas pour le moment, j'y reviendrai.

ous noterez une fois de plus qu9il n9y ps de type de retourD ps mme void F t9i hoisi de mettre l vie et le mn IHHD le mximumD e qui est logiqueF t9i 'et pr dfut une rme ppele  pe rouille qui fit IH de dgts hque oupF it voil 3 xotre lsse Personnage un onstruteur qui initilise les ttriutsD elle est dsormis pleinement utilisleF wintenntD hque fois que l9on re un ojet de type PersonnageD eluiEi est initilis IHH points de vie et de mnD ve l9rme  pe rouille F xos deux ompres david et goliath ommenent don glit lorsqu9ils sont rs dns le main() X
1

1. C'est une erreur que l'on fait souvent, c'est pourquoi j'insiste sur ce point !

PPV

CONSTRUCTEUR ET DESTRUCTEUR

ersonnge dvidD golithY GGves onstruteurs de dvid et golith sont ppels

Autre faon d'initialiser avec un constructeur : la liste d'initialisation

ve gCC permet d9initiliser les ttriuts de l lsse d9une utre mnire @un peu dE routnteA ppele liste d'initialisationF g9est une tehnique que je vous reommnde d9utiliser qund vous le pouvez @9est elle que nous utiliserons dns e oursAF eprenons le onstruteur que nous venons de rer X
ersonngeXXersonnge@A { mvie a IHHY mmn a IHHY mnomerme a 4pe rouille4Y mdegtserme a IHY }

ve ode que vous llez voir iEdessous produit le mme e'et X


ersonngeXXersonnge@A X mvie@IHHAD mmn@IHHAD mnomerme@4pe rouille4AD mdegtserme@IHA { GGien mettre dns le orps du onstruteurD tout dj t fit 3 }

v nouveutD 9est qu9on rjoute un symole deuxEpoints @ XA suivi de l liste des ttriuts que l9on veut initiliser veD entre prenthsesD l vleurF eve e odeD on initilise l vie IHHD le mn IHHD l9ttriut m_nomArme  pe rouille D etF gette tehnique est un peu surprennteD surtout queD du oupD on n9 plus rien mettre dns le orps du onstruteur entre les oldes X tout dj t fit vnt 3 ille toutefois l9vntge d9tre  plus propre et se rvler prtique dns l suite du hpitreF yn utiliser don utnt que possile les listes d9initilistion ve les onstruteursD 9est une onne hitude prendreF
Le prototype du constructeur (dans le .h) ne change pas. Toute la partie qui suit les deux-points n'apparat pas dans le prototype.
Surcharger le constructeur

ous svez qu9en gCCD on le droit de surhrger les fontionsD don de surhrger les mthodesF it omme le onstruteur est une mthodeD on le droit de le surhrger lui ussiF ourquoi je vous en prle c ge n9est ps pr hsrd X en fitD le onstruteur est une mthode que l9on tendne euoup surhrgerF gel permet de rer un ojet de plusieurs fons di'rentesF PPW

CHAPITRE 14.

LES CLASSES (PARTIE 2/2)

our l9instntD on r un onstruteur sns prmtre X


ersonnge@AY

yn ppelle el X le constructeur par dfaut @il fllit ien lui donner un nomD le puvreAF upposons que l9on souhite rer un personnge qui it ds le dprt une meilleure rmeF F F omment fire c g9est l que l surhrge devient utileF yn v rer un deuxime onstruteur qui prendr en prmtre le nom de l9rme et ses dgtsF hns Personnage.hD on rjoute don e prototype X
ersonnge@stdXXstring nomermeD int degtsermeAY

Le prxe std:: est ici obligatoire, comme je vous l'ai dit plus tt, car on n'utilise pas la directive usingnamespacestd; dans le .h (je vous renvoie au chapitre prcdent si vous avez un trou de mmoire).

v9implmenttion dns Personnage.cpp ser l suivnte X


ersonngeXXersonnge@string nomermeD int degtsermeA X mvie@IHHAD mmn@IHHAD mnomerme@nomermeAD mdegtserme@degtsermeA { }

ous noterez ii tout l9intrt de pr(xer les ttriuts pr  m X insiD on peut fire l di'rene dns le ode entre m_nomArmeD qui est un ttriutD et nomArmeD qui est le prmtre envoy u onstruteurF siD on ple simplement dns l9ttriut de l9ojet le nom de l9rme envoy en prmtreF yn reopie juste l vleurF g9est tout te mis il fut le fireD sinon l9ojet ne se  souviendr ps du nom de l9rme qu9il possdeF v vie et le mnD euxD sont toujours (xs IHH @il fut ien les initiliserA Y mis l9rmeD qunt elleD peut mintennt tre renseigne pr l9utilisteur lorsqu9il re l9ojetF
Quel utilisateur ?

ouvenezEvous X l9utilisteurD 9est elui qui re et utilise les ojetsF ve onepteurD 9est elui qui re les lssesF hns notre sD l rtion des ojets est fite dns le m ain()F our le momentD l rtion de nos ojets ressemle el X
ersonnge dvidD golithY

gomme on n9 spi( uun prmtreD 9est le onstruteur pr dfut @elui sns prmtreA qui ser ppelF wintenntD supposons que l9on veuille donner ds le dprt PQH

CONSTRUCTEUR ET DESTRUCTEUR

une meilleure rme qolith Y on indique entre prenthses le nom et l puissne de ette rme X
ersonnge dvidD golith@4pe iguise4D PHAY

qolith est quip ds s rtion de l9pe iguiseF hvid est quip de l9rme pr dfutD l9pe rouilleF gomme on n9 spi( uun prmtre lors de l rtion de d avidD 9est le onstruteur pr dfut qui ser ppel pour luiF our goliathD omme on spi( des prmtresD 9est le onstruteur qui prend en prmtre un string et un int qui ser ppelF Exercice X on urit ussi pu permettre l9utilisteur de modi(er l vie et le mn de dprt mis je ne l9i ps fit iiF ge n9est ps ompliquD vous pouvez l9rire pour vous entrnerF gel vous fer un troisime onstruteur surhrgF

Le destructeur
ve destruteur est une mthode ppele lorsque l9ojet est supprim de l mmoireF on prinipl rle est de dsllouer l mmoire @via des deleteA qui t lloue dynmiquementF hns le s de notre lsse PersonnageD on n9 fit uune llotion dynmique @il n9y uun newAF ve destruteur est don inutileF gependntD vous en urez ertinement esoin un jour ou l9utre r on est souvent men fire des llotions dynmiquesF enezD l9ojet string pr exempleD vous royez qu9il fontionne omment c sl un destruteur qui lui permetD juste vnt l destrution de l9ojetD de supprimer le tleu de char qu9il llou dynmiquement en mmoireF sl fit don un delete sur le tleu de charD e qui permet de grder une mmoire propre et d9viter les fmeuses  fuites de mmoire F
Crer un destructeur

fien que e soit inutile dns notre s @je n9i ps utilis d9llotion dynmique pour ne ps trop ompliquer les hoses tout de suiteAD je vis vous montrer omment on re un destruteurF oii les rgles suivre X ! n destruteur est une mthode qui ommene pr un tilde @~A suivi du nom de l lsseF ! n destruteur ne renvoie uune vleurD ps mme void @omme le onstruteurAF ! itD nouveut X le destruteur ne peut prendre uun prmtreF sl y don toujours un seul destruteurD il ne peut ps tre surhrgF hns Personnage.hD le prototype du destruteur ser don X
~ersonnge@AY

hns Personnage.cppD l9implmenttion ser X PQI

CHAPITRE 14.

LES CLASSES (PARTIE 2/2)

ersonngeXX~ersonnge@A { GB ien mettre ii r on ne fit ps d9llotion dynmique dns l lsse ersonngeF ve destruteur est don inutile mis je le mets pour montrer quoi el ressemleF in temps normlD un destruteur fit souvent des delete et quelques utres vrifitions si nessire vnt l destrution de l9ojetF BG }

fonD vous l9urez omprisD mon destruteur ne fit rienF ge n9tit mme ps l peine de le rer @il n9est ps oligtoire prs toutAF gel vous montre nnmoins l produre suivreF oyez rssursD nous ferons des llotions dynmiques plus tt que vous ne le pensez et nous urons lors grnd esoin du destruteur pour dsllouer l mmoire 3

Les mthodes constantes


ves mthodes onstntes sont des mthodes de  leture seule F illes possdent le motEl const la n de leur prototype et de leur dclarationF und vous dites  m mthode est onstnte D vous indiquez u ompilteur que votre mthode ne modi(e ps l9ojetD 9estEEdire qu9elle ne modi(e l vleur d9uun de ses ttriutsF r exempleD une mthode qui se ontente d90her l9rn des informtions sur l9ojet est une mthode onstnte X elle ne fit que lire les ttriutsF in revnheD une mthode qui met jour le niveu de vie d9un personnge ne peut ps tre onstnteF yn l9utilise insi X
GGrototype de l mthode @dns le FhA X void mwethode@int prmetreA onstY GGhlrtion de l mthode @dns le FppA X void wglsseXXmwethode@int prmetreA onst { }

yn utiliser le motEl const sur des mthodes qui se ontentent de renvoyer des informtions sns modi(er l9ojetF g9est le s pr exemple de l mthode estVivant ()D qui indique si le personnge est toujours vivnt ou nonF ille ne modi(e ps l9ojetD elle se ontente de vri(er le niveu de vieF
ool ersonngeXXestivnt@A onst { if @mvie b HA {

PQP

ASSOCIER DES CLASSES ENTRE ELLES

return trueY } else { return flseY }

En revanche, une mthode comme recevoirDegats() ne peut pas tre dclare constante ! En eet, elle modie le niveau de vie du personnage puisque celui-ci reoit des dgts.

yn pourrit trouver d9utres exemples de mthodes onernesF ensez pr exemple l mthode size() de l lsse string X elle ne modi(e ps l9ojetD elle ne fit que nous informer de l longueur du texte ontenu dns l hneF
Concrtement, quoi cela sert-il de crer des mthodes constantes ?

gel sert priniplement Q hoses X ! Pour vous X vous svez que votre mthode ne fit que lire les ttriuts et vous vous interdisez ds le dut de les modi(erF i pr erreur vous tentez d9en modi(er unD le ompilteur plnte en vous reprohnt de ne ps respeter l rgle que vous vous tes (xeF it elD 9est ienF ! Pour les utilisateurs de votre classe X 9est trs importnt ussi pour euxD el leur indique que l mthode se ontente de renvoyer un rsultt et qu9elle ne modi(e ps l9ojetF hns une doumenttionD le motEl const pprt dns le prototype de l mthode et 9est un exellent inditeur de e qu9elle fitD ou plutt de e qu9elle ne peut ps fire @el pourrit se trduire pr X  ette mthode ne modi(er ps votre ojet AF ! Pour le compilateur X si vous vous rppelez le hpitre sur les vrilesD je vous onseillis de toujours dlrer const e qui peut l9treF xous sommes ii dns le mme sF yn o're des grnties ux utilisteurs de l lsse et on ide le ompilteur gnrer du ode inire de meilleure qulitF

Associer des classes entre elles


v progrmmtion oriente ojet devient vriment intressnte et puissnte lorsqu9on se met ominer plusieurs ojets entre euxF our l9instntD nous n9vons r qu9une seule lsse X PersonnageF yr en prtiqueD un progrmme ojet est un progrmme onstitu d9une multitude d9ojets di'rents 3 sl n9y ps de seretD 9est en prtiqunt que l9on pprend petit petit penser ojetF ge que nous llons voir pr l suite ne ser ps nouveu X vous llez rutiliser tout e PQQ

CHAPITRE 14.

LES CLASSES (PARTIE 2/2)

que vous svez dj sur l rtion de lssesD de mnire mliorer notre petit q et vous entrner mnipuler enore plus d9ojetsF

La classe Arme
te vous propose dns un premier temps de rer une nouvelle lsse ArmeF lutt que de mettre les informtions de l9rme @m_nomArmeD m_degatsArmeA diretement dns Perso nnageD nous allons l'quiper d'un objet de type ArmeF ve doupge de notre progrmme ser lors un peu plus dns l logique d9un progrmme orient ojetF
Souvenez-vous de ce que je vous ai dit au dbut : il y a 100 faons direntes de concevoir un mme programme en POO. Tout est dans l'organisation des classes entre elles, la manire dont elles communiquent, etc. Ce que nous avons fait jusqu'ici n'tait pas mal mais je veux vous montrer qu'on peut faire autrement, un peu plus dans l'esprit objet, donc. . . mieux.

ui dit nouvelle lsse dit deux nouveux (hiers X ! Arme.h X ontient l d(nition de l lsse Y ! Arme.cpp X ontient l9implmenttion des mthodes de l lsseF
On n'est pas oblig de procder ainsi. On pourrait tout mettre dans un seul chier. On pourrait mme mettre plusieurs classes par chier, rien ne l'interdit en C++. Cependant, pour des raisons d'organisation, je vous recommande de faire comme moi.
Arme.h

oii e que je propose de mettre dns Arme.h X


5ifndef hipewi 5define hipewi 5inlude `iostremb 5inlude `stringb lss erme { puliX erme@AY erme@stdXXstring nomD int degtsAY void hnger@stdXXstring nomD int degtsAY void ffiher@A onstY privteX

PQR

ASSOCIER DES CLASSES ENTRE ELLES

}Y

stdXXstring mnomY int mdegtsY

5endif

wis prt les include qu9il ne fut ps oulierD le reste de l lsse est trs simpleF yn met le nom de l9rme et ses dgts dns des ttriuts etD omme e sont des ttriutsD on vri(e qu9ils sont ien privs @pensez l9enpsultionAF ous remrquerez qu9u lieu de m_nomArme et m_degatsArmeD j9i hoisi de nommer mes ttriuts m_nom et m_degats tout simplementF i l9on y r)hitD 9est en e'et plus logique X on est dj dns l lsse ArmeD e n9est ps l peine de repriser dns les ttriuts qu9il s9git de l9rmeD on le sit 3 insuiteD on joute un ou deux onstruteursD une mthode pour hnger d9rme tout momentD et une utre @llezD soyons fousA pour 0her le ontenu de l9rmeF este implmenter toutes es mthodes dns Arme.cppF wis 9est fileD vous svez dj le fireF
Arme.cpp

intrnezEvous rire Arme.cppD 9est tout teD les mthodes font u mximum deux lignesF frefD 9est l porte de tout le mondeF oii mon Arme.cpp pour omprer X
5inlude 4ermeFh4 using nmespe stdY ermeXXerme@A X mnom@4pe rouille4AD mdegts@IHA { } ermeXXerme@string nomD int degtsA X mnom@nomAD mdegts@degtsA { } void ermeXXhnger@string nomD int degtsA { mnom a nomY mdegts a degtsY } void ermeXXffiher@A onst

PQS

CHAPITRE 14.

LES CLASSES (PARTIE 2/2)

{ }

out `` 4erme X 4 `` mnom `` 4 @hgts X 4 `` mdegts `` 4A4 `` endlY

x9ouliez ps d9inlure Arme.h si vous voulez que el fontionneF


Et ensuite ?

xotre lsse Arme est reD de e t tout est onF wis mintenntD il fut dpter l lsse Personnage pour qu9elle utilise non ps m_nomArme et m_degatsArmeD mis un ojet de type ArmeF it lF F F les hoses se ompliquentF

Adapter la classe Personnage pour utiliser la classe Arme


v lsse Personnage v suir quelques modi(tions pour utiliser l lsse estez ttentifs r utiliser un ojet dans un ojetD 9est un peu prtiulierF
Personnage.h ArmeF

ouD diretion le .hF yn ommene pr enlever les deux ttriuts m_nomArme et m_deg atsArme qui ne servent plus rienF ves mthodes n9ont ps esoin d9tre hngesF in fitD il vut mieux ne ps y touE herF ourquoi c re que les mthodes peuvent dj tre utilises pr quelqu9un @pr exemple dns notre main()AF i on les renomme ou si on en supprimeD le progrmme ne fontionner plusF ge n9est peutEtre ps grve pour un si petit progrmme misD dns le s d9un gros progrmmeD si on supprime une mthodeD 9est l tstrophe ssure dns le reste du progrmmeF it je ne vous prle mme ps de eux qui rivent des iliothques gCC X siD d9une version l9utre des mthodes disprissentD tous les progrmmes qui utilisent l iliothque ne fontionneront plus 3 te vis peutEtre vous surprendre en vous disnt el mis 9est l tout l9intrt de l progrmmtion oriente ojetD et plus prtiulirement de l9encapsulation X on peut hnger les ttriuts omme on veutD vu qu9ils ne sont ps essiles de l9extrieur Y on ne ourt ps le risque que quelqu9un les utilise dj dns le progrmmeF in revnheD pour les mthodesD fites plus ttentionF ous pouvez jouter de nouvelles mthodesD modi(er l9implmenttion de elles existntesD mis ps en supprimer ou en renommerD sinon l9utilisteur risque d9voir des prolmesF gette petite r)exion sur l9enpsultion tnt fite @vous en omprendrez tout le sens ve l prtiqueAD il fut jouter un ojet de type Arme notre lsse PersonnageF
Il faut penser ajouter un include de Arme.h si on veut pouvoir utiliser un objet de type Arme.

PQT

ASSOCIER DES CLASSES ENTRE ELLES

oii mon nouveu Personnage.h X


5ifndef hipiyxxeqi 5define hipiyxxeqi 5inlude `iostremb 5inlude `stringb 5inlude 4ermeFh4 GGxe e oulier d9inlure ermeFh pour en voir l dfinition lss ersonnge { puliX ersonnge@AY ersonnge@stdXXstring nomermeD int degtsermeAY ~ersonnge@AY void reevoirhegts@int nhegtsAY void ttquer@ersonnge 8ileAY void oireotionheie@int quntiteotionAY void hngererme@stdXXstring nomxouvelleermeD int degtsxouvelleermeAY ool estivnt@A onstY privteX int mvieY int mmnY erme mrmeY GGxotre ersonnge possde une erme

}Y

5endif

Personnage.cpp

xous n9vons esoin de hnger que les mthodes qui utilisent l9rmeD pour les dpterF yn ommene pr les onstruteurs X
ersonngeXXersonnge@A X mvie@IHHAD mmn@IHHA { } ersonngeXXersonnge@string nomermeD int degtsermeA X mvie@IHHAD mmn@IHHAD mrme@nomermeD degtsermeA { }

PQU

CHAPITRE 14.

LES CLASSES (PARTIE 2/2)

eutEtre ne voyezEvous ps ien pourquoiF i je peux vous donner un onseilD 9est de ne ps vous prendre l tte essyer de omprendre ii le pourquoi du ommentF gontentezEvous de toujours utiliser les listes d'initialisation avec vos constructeursD el vous viter ien des prolmesF evenons u odeF hns le premier onstruteurD 9est le onstruteur pr dfut de l lsse Arme qui est ppel tndis queD dns le seondD on ppelle elui qui prend en prmtre un string et un intF v mthode recevoirDegats n9 ps esoin de hngerF in revnheD l mthode at taquer est dliteF in e'etD on ne peut ps fire X
void ersonngeXXttquer@ersonnge 8ileA { ileFreevoirhegts@mrmeFmdegtsAY }

xotre ojet m_arme est ii initilis ve les vleurs reues en prmtre pr Personna ge(nomArme,degatsArme)F g9est l que l liste d9initilistion devient utileF in e'etD on n9urit ps pu initiliser m_arme sns une liste d9initilistion 3

ourquoi estEe interdit c re que m_degats est un ttriut et queD omme tout ttriut qui se respeteD il est priv 3 hintreF F F xous sommes en trin d9utiliser l lsse Arme u sein de l lsse Personnage etD omme nous sommes utilisteursD nous ne pouvons ps der ux lments privsF gomment rsoudre le prolme c sl n9y ps QT solutionsF gel v peutEtre vous surprendre mis on doit rer une mthode pour ruprer l vleur de et ttriutF gette mthode est ppele accesseur et ommene gnrlement pr le pr(xe  get @ ruprer D en nglisAF hns notre sD notre mthode s9ppellerit getDegatsF yn onseille gnrlement de rjouter le motEl const ux esseurs pour en fire des mthodes onstntesD puisqu9elles ne modi(ent ps l9ojetF
int ermeXXgethegts@A onst { return mdegtsY }

x9ouliez ps de mettre jour Arme.h ve le prototypeD qui ser le suivnt X


int gethegts@A onstY

oilD el peut prtre idiot et pourtntD 9est une surit nessireF yn est prfois olig de rer une mthode qui fit seulement un return pour der indiretement un ttriutF PQV

ACTION !

De mme, on cre parfois des accesseurs permettant de modier des attributs. Ces accesseurs sont gnralement prcds du prxe  set  ( mettre , en anglais). Vous avez peut-tre l'impression qu'on viole la rgle d'encapsulation ? Eh bien non. La mthode permet de faire des tests pour vrier qu'on ne met pas n'importe quoi dans l'attribut, donc cela reste une faon scurise de modier un attribut.

ous pouvez mintennt retourner dns Personnage.cpp et rire X


void ersonngeXXttquer@ersonnge 8ileA { ileFreevoirhegts@mrmeFgethegts@AAY }

getDegats

renvoie le nomre de dgtsD qu9on envoie l mthode recevoirDegats de l ileF (ou 3 ve reste des mthodes n9 ps esoin de hngerD prt changerArme de l lsse Per sonnage X
void ersonngeXXhngererme@string nomxouvelleermeD int degtsxouvelleermeA { mrmeFhnger@nomxouvelleermeD degtsxouvelleermeAY }

yn ppelle l mthode changer de m_armeF ve Personnage rperute don l demnde de hngement d9rme l mthode changer de son ojet m_armeF gomme vous pouvez le voirD on peut fire ommuniquer des ojets entre euxD ondiE tion d9tre ien orgnis et de se demnder hque instnt  estEe que j9i le droit d9der et lment ou ps c F x9hsitez ps rer des esseurs si esoin est X mme si el peut prtre lourdD 9est l onne mthodeF in uun s vous ne devez mettre un ttriut public pour simpli(er un prolmeF ous perdriez tous les vnE tges et l surit de l yy @et vous n9uriez uun intrt ontinuer le gCC dns e sAF

Action !
xos personnges omttent dns le main()D misF F F nous ne voyons rien de e qui se psseF sl serit ien d90her l9tt de hun des personnges pour svoir o ils en sontF te vous propose de rer une mthode afficherEtat dns PersonnageF gette mthode ser hrge de fire des cout pour 0her dns l onsole l vieD le mn et l9rme du personngeF PQW

CHAPITRE 14.

LES CLASSES (PARTIE 2/2)

Prototype et include
yn rjoute le prototypeD tout teD dns le .h X
void ffiheritt@A onstY

Implmentation
smplmentons ensuite l mthodeF g9est simpleD on simplement fire des coutF qre ux ttriutsD on peut fire pprtre toutes les informtions reltives u personnge X
void ersonngeXXffiheritt@A onst { out `` 4ie X 4 `` mvie `` endlY out `` 4wn X 4 `` mmn `` endlY mrmeFffiher@AY }

gomme vous pouvez le voirD les informtions sur l9rme sont demndes l9ojet m_arme via s mthode afficher()F inore une foisD les ojets ommuniquent entre eux pour ruprer les informtions dont ils ont esoinF

Appel de afficherEtat dans le main()


fienD tout el 9est ien eu misD tnt qu9on n9ppelle ps l mthodeD elle ne sert rien te vous propose don de omplter le main() et de rjouter l (n les ppels de mthode X
int min@A { GGgrtion des personnges ersonnge dvidD golith@4pe iguise4D PHAY GGeu omt 3 golithFttquer@dvidAY dvidFoireotionheie@PHAY golithFttquer@dvidAY dvidFttquer@golithAY golithFhngererme@4houle hhe trnhnte vnneuse de l mort4D RHAY golithFttquer@dvidAY GGemps mort 3 oyons voir l vie de hunFFF out `` 4hvid4 `` endlY dvidFffiheritt@AY out `` endl `` 4qolith4 `` endlY golithFffiheritt@AY

PRH

ACTION !

return HY

yn peut en(n exuter le progrmme et voir quelque hose dns l onsole 3


hvid ie X RH wn X IHH erme X pe rouille @hegts X IHA qolith ie X WH wn X IHH erme X houle hhe trnhnte vnneuse de l mort @hegts X RHA

Si vous tes sous Windows, vous aurez probablement un bug avec les accents dans la console. Ne vous en proccupez pas, ce qui nous intresse ici c'est le fonctionnement de la POO. Et puis de toute manire, dans la prochaine partie du livre, nous travaillerons avec de vraies fentres donc, la console, c'est temporaire pour nous. ;-)

our que vous puissiez vous fire une onne ide du projet dns son ensemleD je vous propose de tlhrger un (hier zip ontennt X ! main.cpp ! Personnage.cpp ! Personnage.h ! Arme.cpp ! Arme.h  lhrger le projet q gode we X WPVHQS  te vous invite fire des tests pour vous entrnerF r exemple X ! gontinuez fire omttre david et goliath dns le main() en 0hnt leur tt de temps en tempsF ! sntroduisez un troisime personnge dns l9rne pour rendre le omt plus rutl intressntF ! joutez un ttriut m_nom pour stoker le nom du personnge dns l9ojetF our le momentD nos personnges ne svent mme ps omment ils s9ppellentD 9est un peu teF hu oupD je pense qu9il fudrit modi(er les onstruteurs et oliger l9utilisteur indiquer un nom pour le personnge lors de s rtionF F F moins que vous ne donniez un nom pr dfut si rien n9est pris c vous de hoisir 3 ! joutez des cout dns les utres mthodes de Personnage pour indiquer hque fois e qui est en trin de se psser @ mhin oit une potion qui lui redonne PH points de vie AF ! joutez d9utres mthodes u gr de votre imgintionF F F et pourquoi ps des ttques mgiques qui utilisent du mn c PRI

CHAPITRE 14.

LES CLASSES (PARTIE 2/2)

! in(nD pour l9instntD le omt est rit dns le main() mis vous pourriez lisser le joueur hoisir les ttques dns l onsole l9ide de cinF renez et exerie trs u srieuxD ei est peutEtre l se de votre futur wwyq rvolutionnire 3
2

Prcision utile : la phrase ci-dessus tait une boutade : ce cours ne vous apprendra pas crer un MMORPG, vu le travail phnomnal que cela reprsente. Mieux vaut commencer par se concentrer sur de plus petits projets ralistes, et notre RPG en est un. Ce qui est intressant ici, c'est de voir comment est conu un jeu orient objet (comme c'est le cas de la plupart des jeux aujourd'hui). Si vous avez bien compris le principe, vous devriez commencer voir des objets dans tous les jeux que vous connaissez ! Par exemple, un btiment dans Starcraft 2 est un objet qui a un niveau de vie, un nom, il peut produire des units (via une mthode), etc.

i vous ommenez voir des ojets prtoutD 9est on signe 3 g9est e que l9on ppelle  penser ojet F

Mga schma rsum


groyezEmoi si vous le voulez mis je ne vous demnde mme ps vriment d9tre E ples de progrmmer tout e qu9on vient de voir en gCCF te veux que vous reteniez le prinipeD le oneptD omment tout el est genF it pour retenirD rien de tel qu9un mg shm ien mstoD non c yuvrez grnd vos yeuxD je veux que vous soyez ples de reproduire l (gure IRFI les yeux ferms l tte en s ve du poil grtter dns le dos 3

En rsum
! ve onstruteur est une mthode ppele utomtiquement lorsqu9on re l9ojetF ve destruteurD luiD est ppel lorsque l9ojet est supprimF ! yn peut surhrger un onstruteurD 9estEEdire rer plusieurs onstruteursF gel permet de rer un ojet de di'rentes mniresF ! ne mthode onstnte est une mthode qui ne hnge ps l9ojetF gel signi(e que les ttriuts ne sont ps modi(s pr l mthodeF ! uisque le prinipe d9enpsultion impose de protger les ttriutsD on re des mthodes trs simples ppeles esseurs qui renvoient l vleur d9un ttriutF r exempleD getDegats() renvoie l vleur de l9ttriut degatsF ! n ojet peut ontenir un utre ojet u sein de ses ttriutsF ! v progrmmtion oriente ojet impose un ode trs struturF g9est e qui rend le ode soupleD prenne et rutilisleF
2.  Un jeu de rle massivement multi-joueurs , si vous prfrez !

PRP

MGA SCHMA RSUM

Figure IRFI ! sum de l struture du ode

PRQ

CHAPITRE 14.

LES CLASSES (PARTIE 2/2)

PRR

Chapitre

15
Dicult :

La surcharge d'oprateurs

n l'a vu, le langage C++ propose beaucoup de fonctionnalits qui peuvent se rvler trs utiles si on arrive s'en servir correctement. Une des fonctionnalits les plus tonnantes est  la surcharge des oprateurs , que nous allons tudier dans ce chapitre. C'est une technique qui permet de raliser des oprations mathmatiques intelligentes entre vos objets, lorsque vous utilisez dans votre code des symboles tels que +, -, *, etc. Au nal, vous allez voir que votre code sera plus court et plus clair, et qu'il gagnera donc en lisibilit.

PRS

CHAPITRE 15.

LA SURCHARGE D'OPRATEURS

Petits prparatifs
Qu'est-ce que c'est ?
ve prinipe est trs simpleF upposons que vous yez r une lsse pour stoker une dure @pr exemple RhPQmA et que vous yez deux ojets de type Duree que vous voulez dditionner pour onntre l dure totleF in temps normlD il fudrit rer une fontion X
resultt a dditionner@dureeID dureePAY

v fontion additionner rliserit ii l somme de duree1 et duree2D et stokerit l vleur insi otenue dns resultatF gel fontionne mis e n9est ps frnhement lisileF ge que je vous propose dns e hpitreD 9est d9tre ples d9rire el X
resultt a dureeI C dureePY

in lirD on fit ii omme si les ojets tient de simples nomresF wis omme un ojet est ien plus omplexe qu9un nomre @vous vez eu l9osion de vous en rendre ompteAD il fut expliquer l9ordinteur omment e'etuer l9oprtionF

La classe Duree pour nos exemples


outes les lsses ne sont ps forment dptes l surhrge d9oprteursF einsiD dditionner des ojets de type Personnage serit pour le moins inutileF xous llons don hnger d9exempleD e ser l9osion de vous rer un peu l9espritD sinon vous llez (nir pr roire que le gCC ne sert qu9 rer des qF gette lsse Duree ser ple de stoker des heuresD des minutes et des seondesF ssurezEvousD 9est une lsse reltivement file rire @plus file que Personnage en tout s 3AD el ne devrit vous poser uun prolme si vous vez ompris les hpitres prdentsF
Duree.h
5ifndef hiphii 5define hiphii lss huree { puliX huree@int heures a HD int minutes a HD int seondes a HAY privteX

PRT

PETITS PRPARATIFS

}Y

int mheuresY int mminutesY int mseondesY

5endif

ghque ojet de type Duree stoker un ertin nomre d9heuresD de minutes et de seondesF ous noterez que j9i utilis des vleurs pr dfut u s o l9utilisteur urit l )emme de les priserF yn pourr don rer un ojet de plusieurs fons di'rentes X
huree huree huree huree hronoY GG our stoker H heureD H minute et H seonde hrono@SAY GG our stoker S heuresD H minute et H seonde hrono@SD QHAY GG our stoker S heuresD QH minutes et H seonde hrono@HD IPD SSAY GG our stoker H heureD IP minutes et SS seondes

Duree.cpp

v9implmenttion de notre onstruteur est expdie en QH seondesD montre en minF


5inlude 4hureeFh4 hureeXXhuree@int heuresD int minutesD int seondesA X mheures@heuresAD mminutes@minutesAD mseondes@seondesA { }

Et dans main.cpp ?

our l9instnt notre main.cpp ne dlre que deux ojets de type DureeD que j9initilise un peu u hsrd X
int min@A { huree dureeI@HD IHD PVAD dureeP@HD ISD PAY } return HY

oilD nous sommes mintennt prts 'ronter les surhrges d9oprteurs 3 PRU

CHAPITRE 15.

LA SURCHARGE D'OPRATEURS

Les plus perspicaces d'entre vous auront remarqu que rien ne m'interdit de crer un objet avec 512 minutes et 1455 secondes. En eet, on peut crire Duree chrono(0, 512, 1455); sans tre inquit. Normalement, cela devrait tre interdit ou, tout du moins, notre constructeur devrait tre assez intelligent pour  dcouper  les minutes et les convertir en heures/minutes, et de mme pour les secondes, an que minutes et secondes n'excdent pas 60. Je ne le fais pas ici mais je vous encourage modier votre constructeur pour faire cette conversion si ncessaire, cela vous entranera ! tant donn qu'il faut exploiter des if et quelques petites oprations mathmatiques dans le constructeur, vous ne pourrez pas utiliser la liste d'initialisation.

Les oprateurs arithmtiques


xous llons ommener pr voir les oprteurs mthmtiques les plus lssiquesD svoir l9ddition @CAD l soustrtion @EAD l multiplition @BAD l division @GA et le modulo @7AF ne fois que vous urez ppris vous servir de l9un d9entre euxD vous verrez que vous surez vous servir de tous les utresF our tre ples d9utiliser le symole  C entre deux ojetsD vous devez rer une fontion ynt prisment pour nom operator+ et dote du prototype X
yjet opertorC@yjet onst8 D yjet onst8 AY

Mme si l'on parle de classe, ceci n'est pas une mthode. C'est une fonction normale situe l'extrieur de toute classe.

v fontion reoit deux rfrenes sur les ojets @rfrenes onstntesD qu9on ne peut don ps modi(erA dditionnerF ot de notre lsse DureeD on doit don rjouter ette fontion @ii dns le .hA X
huree opertorC@huree onst8 D huree onst8 AY

g9est l premire fois que vous utilisez des rfrenes onstntesF in pge IIPD je vous vis expliqu queD lors d9un pssge pr rfreneD l vrile @ou l9ojetA n9est ps opieF xotre lsse Duree ontient trois entiersD utiliser une rfrene permet don d9viter l opie inutile de es trois entiersF siD le gin est ssez ngligele misD si vous prenez un ojet de type stringD qui peut ontenir un texte trs longD l opie prendr lors un temps importntF g9est pour el queD lorsque l9on mnipule des ojetsD on prfre utiliser des rfrenesF gependntD on imerit ien que les fontions ou mthodes ne modi(ent ps l9ojet reuF g9est pour el que l9on utilise une rfrene onstnteF und on fit a + bD a et b ne doivent ps tre modi(sF ve motEl const est don essentiel iiF PRV

LES OPRATEURS ARITHMTIQUES

Mode d'utilisation
Comment marche ce truc ?

hs le moment o vous vez r ette fontion operator+D vous pouvez dditionner deux ojets de type Duree X
resultt a dureeI C dureePY

ge n9est ps de l mgieF in fit le ompilteur  trduit el pr X


resultt a opertorC@dureeID dureePAY

g9est ien plus lssique et omprhensile pour luiF sl ppelle don l fontion operator+ en pssnt en prmtres duree1 et duree2F v fontionD elleD renvoie un rsultt de type DureeF

Les oprateurs raccourcis


ge n9est ps le seul moyen d9e'etuer une ddition 3 ppelezEvous les versions rE ouries des oprteursF t de +D on trouvit +=D et insi de suite pour les utres oprteursF gontrirement +D qui est une fontionD += est une mthode de l lsseF oii son prototype X
huree8 opertorCa@huree onst8 dureeAY

ille reoit en rgument une utre Duree dditionner et renvoie une rfrene sur l9ojet luiEmmeF xous verrons plus loin quoi sert ette rfreneF xous voii don ve deux mnires d9e'etuer une dditionF
resultt a dureeI C dureePY GGtilistion de opertorC dureeI Ca dureePY GGtilistion de l mthode opertorCa de l9ojet 9dureeI9

ous vous en doutez peutEtreD les orps de es fontions seront trs semllesF i l9on sit fire le lul ve +D il ne fut qu9une petite modi(tion pour otenir elui de +=D et vieEversF g9est somme toute deux fois l mme oprtion mthmtiqueF ves progrmmeurs sont des finnts et rire deux fois l mme fontion devient vite ennuyeuxF g9est pourquoi on utilise gnrlement une de es deux oprtions pour d(nir l9utreF it l rgle veut que l9on d(nisse operator+ en ppelnt l mthode operator+=F PRW

CHAPITRE 15.

LA SURCHARGE D'OPRATEURS

Mais comment est-ce possible ?

renons un exemple plus simple que des DureeD des int pr exempleD et nlysons e qui se psse qund on herhe les dditionnerF
int @RAD @SAD @HAY a C Y GG vut W

yn prend l vrile aD on lui joute b et on met le tout dns cF gel revient presque rire X
int @RAD @SAD @HAY Ca Y a Y GG vut W mis vut glement W

v di'rene est queD dns e deuxime exempleD l vrile a hng de vleurF i pr ontre on e'etue une opie de a vnt de l modi(erD e prolme disprtF
int @RAD @SAD @HAY int opie@AY opie Ca Y a opieY GG vut W et vut toujours R

Le mme principe est valable pour * et *=, - et -=, etc.

yn peut don e'etuer l9oprtion + en fisnt une opie suivie d9un +=F g9est e prinipe que l9on v utiliser pour d(nir l fontion operator+ pour notre lsse DureeF rfoisD il fut euoup r)hir pour tre finntF
huree opertorC@huree onst8 D huree onst8 A { huree opie@AY opie Ca Y return opieY }

it voil 3 sl ne nous reste plus qu9 d(nir l mthode operator+=F


Ce passage est peut-tre un peu dicile saisir au premier abord. L'lment important mmoriser, c'est la manire dont on crit la dnition de operator+ l'aide de la mthode operator+=. Vous pourrez toujours revenir plus tard sur la justication.

PSH

LES OPRATEURS ARITHMTIQUES

Implmentation de +=
v9implmenttion n9est ps vriment omplique mis il v qund mme flloir r)hir un peuF in e'etD jouter des seondesD minutes et heures el vD mis il fut fire ttention l retenue si les seondes ou minutes dpssent THF te vous reommnde d9essyer d9rire l mthode vousEmmesD 9est un exellent exerie lgorithmiqueD el entretient le erveu et el vous rend meilleur progrmmeurF oii e que donne mon implmenttion pour eux qui ont esoin de l solution X
huree8 hureeXXopertorCa@onst huree 8dureePA { GGI X jout des seondes mseondes Ca dureePFmseondesY GGixeptionnellement utoris r mme lsse GGi le nomre de seondes dpsse THD on rjoute des minutes GGit on met un nomre de seondes infrieur TH mminutes Ca mseondes G THY mseondes 7a THY GGP X jout des minutes mminutes Ca dureePFmminutesY GGi le nomre de minutes dpsse THD on rjoute des heures GGit on met un nomre de minutes infrieur TH mheures Ca mminutes G THY mminutes 7a THY GGQ X jout des heures mheures Ca dureePFmheuresY } return BthisY

gopier e ode gode we X UPHHHR  ge n9est ps un lgorithme ultrEomplexe misD omme je vous vis ditD il fut r)hir un tout petit peu qund mme pour pouvoir l9rireF gomme nous sommes dns une mthode de l lsseD nous pouvons diretement modi(er les ttriutsF yn y joute les heuresD minutes et seondes de l9ojet reu en prmtreD svoir duree2F yn ii exeptionnellement le droit d9der diretement ux ttriuts de et ojet r on se trouve dns une mthode de l mme lsseF g9est un peu tordu mis el nous ide ien @sinon il urit fllu rer des mthodes omme getHeures()AF jouter les seondesD 9est fileF wis on doit ensuite jouter un reste si on dpss TH seondes @don jouter des minutesAF te ne vous explique ps omment el fonE tionne dns le dtilD je vous lisse un peu vous remuer les mningesF ge n9est vriment ps ien di0ile @9est du niveu des tous premiers hpitres du oursAF ous noterez PSI

CHAPITRE 15.

LA SURCHARGE D'OPRATEURS

que 9est un s o l9oprteur modulo @7AD 9estEEdire le reste de l division entireD est trs utileF frefD on fit de mme ve les minutes Y qunt ux heuresD 9est enore plus file vu qu9il n9y ps de reste @on peut dpsser les PR heures don ps de prolmeAF pinlementD il n9y que l dernire ligne qui devrit vous surprendreF v mthode renvoie l9ojet luiEmme l9ide de *thisF this est un motEl prtiulier du lngge dont nous reprlerons dns un prohin hpitreF g9est un pointeur vers l9ojet qu9on est en trin de mnipulerF gette ligne peut tre trduite en frnis pr X  envoie l9ojet point pr le pointeur this F ves risons profondes de l9existene de ette ligne insi que de l rfrene omme type de retour sont ssez ompliquesF eu niveu de e oursD prenez el omme une reette de uisine pour vos oprteursF

Quelques tests
our mes testsD j9i d jouter une mthode afficher() l lsse Duree @elle fit tout tement un cout de l dureA X
5inlude `iostremb 5inlude 4hureeFh4 using nmespe stdY int min@A { huree dureeI@HD IHD PVAD dureeP@HD ISD PAY huree resulttY dureeIFffiher@AY out `` 4C4 `` endlY dureePFffiher@AY resultt a dureeI C dureePY out `` 4a4 `` endlY resulttFffiher@AY } return HY

it le rsultt tnt ttendu X


HhIHmPVs C HhISmPs a HhPSmQHs

PSP

LES OPRATEURS ARITHMTIQUES

goolD el mrheF fonD mis 9tit trop fileD il n9y vit ps de reste dns mon lulF gorsons un peu les hoses ve d9utres vleurs X
IhRSmSHs C IhISmSHs a QhImRHs

ehhh 3 gel mrhe 3 t9i ien entendu test d9utres vleurs pour tre ien sr que el fontionnit misD de toute videneD el mrhe trs ien et mon lgorithme est don onF fonD on en viendrit presque oulier l9essentiel dns tout elF out e qu9on fit lD 9tit pour pouvoir rire ette ligne X
resultt a dureeI C dureePY

v surhrge de l9oprteur + nous permis de rendre notre ode lirD simple et lisileD lors qu9en temps normlD nous urions d utiliser une mthodeF x9oulions ps non plus l9oprteur +=F yn peut tout fit l9utiliser diretementF
5inlude `iostremb 5inlude 4hureeFh4 using nmespe stdY int min@A { huree dureeI@HD IHD PVAD dureeP@HD ISD PAY dureeIFffiher@AY out `` 4Ca4 `` endlY dureePFffiher@AY dureeI Ca dureePY GGtilistion direte de l9oprteur Ca out `` 4a4 `` endlY dureeIFffiher@AY } return HY

ge ode 0he ien sr l mme hose que notre premier testF te vous lisse essyer d9utres vleurs pour vous onvinre que tout est orretF PSQ

CHAPITRE 15.

LA SURCHARGE D'OPRATEURS

Tlcharger le projet
our eux d9entre vous qui n9urient ps ien suivi l produreD je vous propose de tlhrger le projet ontennt X ! main.cpp Y ! Duree.cpp Y ! Duree.h Y ! insi que le (hier .cbp de gode: :floks @si vous utilisez et shi omme moiAF  lhrger le projet gode we X VRTVPR 

Bonus track #1
ge qui est vriment symp dns tout el 9est queD tel que e systme est onuD on peut trs ien dditionner d9un seul oup plusieurs dures sns uun prolmeF r exempleD je rjoute juste une troisime dure dns mon main() et je l9dditionne ux utres X
int min@A { huree dureeI@ID RSD SHAD dureeP@ID ISD SHAD dureeQ @HD VD PHAY huree resulttY dureeIFffiher@AY out `` 4C4 `` endlY dureePFffiher@AY out `` 4C4 `` endlY dureeQFffiher@AY resultt a dureeI C dureeP C dureeQY out `` 4a4 `` endlY resulttFffiher@AY } return HY

IhRSmSHs C IhISmSHs C HhVmPHs a QhIHmHs

in fitD l ligneEl ii est X PSR

LES OPRATEURS ARITHMTIQUES

resultt a dureeI C dureeP C dureeQY

gel revient rire X


resultt a opertorC@opertorC@dureeID dureePAD dureeQAY

ve tout s9imrique dns une logique implle et vient se pler (nlement dns l9ojet resultatF
Notez que le C++ ne vous permet pas de changer la priorit des oprateurs.

Bonus track #2
it pour notre seond onus trkD shez qu9on n9est ps olig d9dditionner des Duree ve des DureeD du moment que el reste logique et omptileF r exempleD on pourrit trs ien dditionner une Duree et un intF yn onsidrerit dns e s que le nomre int est un nomre de seondes jouterF gel nous permettr d9rire pr exemple X
resultt a duree C QHY

ive l surhrge des fontions et des mthodes 3 v fontion operator+ se d(nit en utilisnt le mme modle qu9vnt X
huree opertorC@huree onst8 dureeD int seondesA { huree opie@dureeAY opie Ca seondesY return opieY }

ous les luls sont reports dns l mthode operator+=D omme prdemmentF
huree8 opertorCa@int seondesAY

Les autres oprateurs arithmtiques


wintennt que vous vez vu ssez en dtil le s d9un oprteur @elui d9dditionD pour eux qui ont l mmoire ourteAD vous llez voir queD pour l pluprt des utres oprteursD 9est trs file et qu9il n9y ps de di0ult supplmentireF ve tout est de s9en servir orretement pour l lsse que l9on mnipuleF ges oprteurs sont du mme type que l9dditionF ous les onnissez dj X PSS

CHAPITRE 15.

LA SURCHARGE D'OPRATEURS

! l soustrtion @EA Y ! l multiplition @BA Y ! l division @GA Y ! le modulo @7AD 9estEEdire le reste de l division entireF our surhrger es oprteursD rien de plus simple X rez une fontion dont le nom ommene pr operator suivi de l9oprteur en questionF gel donne don X ! operator-() Y ! operator*() Y ! operator/() Y ! operator%()F xous devons ien sr jouter ussi les versions rouries orrespondntesD sous forme de mthodesF ! operator-=() Y ! operator*=() Y ! operator/=() Y ! operator%=()F our notre lsse DureeD il peut tre intressnt de d(nir l soustrtion @operator-AF te vous lisse le soin de le fire en vous snt sur l9dditionD el ne devrit ps tre trop ompliquF in revnheD les utres oprteurs ne servent a priori rien X en e'etD on ne multiplie ps des dures entre ellesD et on les divise enore moinsF gomme quoiD tous les oprteurs ne sont ps utiles toutes les lsses X ne d(nissez don que eux qui vous seront vriment utilesF

Les oprateurs de ux


rmi les nomreuses hoses qui ont d vous hoquer qund vous vez ommen le gCCD dns l tgorie  oulh 9est izrre el mis on verr plus trd D il y l9injetion dns les )ux d9entreEsortieF herrire e nom rre se hent les symoles  et F und les utiliseEtEon c ellons llonsD vous n9llez ps me fire roire que vous vez l mmoire si ourteF
out `` 4gouou 34Y in bb vrileY

pigurezEvous justement que  et  sont des oprteursF ve ode iEdessus revient don rire X
opertor``@outD 4gouou 34AY opertorbb@inD vrileAY

yn don fit ppel ux fontions operator et operator 3 PST

LES OPRATEURS DE FLUX

Dnir ses propres oprateurs pour cout


xous llons ii nous intresser plus prtiulirement l9oprteur  utilis ve coutF ves oprteurs de )ux sont d(nis pr dfut pour les types de vriles intD doubleD charD insi que pour les ojets omme stringF yn peut en e'et ussi ien rire X
out `` 4gouou 34Y

F F F que X
out `` ISY

fonD le prolme 9est que cout ne onnt ps votre lsse )mnt neuve DureeD et il ne possde don ps de fontion surhrge pour les ojets de e typeF r onsquentD on ne peut ps rire X
huree hrono@HD PD QHAY out `` hronoY GGirreur X il n9existe ps de fontion opertor``@outD huree 8dureeA

u9 el ne tienneD nous llons rire ette fontion 3


Quoi ? ! Mais on ne peut pas modier le code de la bibliothque standard ?

hjD si vous vous tes poss l questionD rvo X 9est que vous ommenez ien vous reprerF in e'etD 9est une fontion utilisnt un ojet de l lsse ostream @dont cout est une instneA que l9on doit d(nirD et on n9 ps s u ode orrespondntF
Lorsque vous incluez <iostream>, un objet cout est automatiquement dclar comme ceci : ostream cout;. ostream est la classe, cout est l'objet.

yn ne peut ps modi(er l lsse ostream mis on peut trs ien rire une fontion qui reoit un de es ojets en rgumentF oyons don omment rdiger ette fmeuse fontionF

Implmentation d'operator
gommenez pr rire l fontion X
ostrem8 opertor``@ ostrem 8fluxD huree onst8 duree A { flux `` dureeFmheures `` 4h4 `` dureeFmminutes `` 4m4 `` dureeFmseondes

PSU

CHAPITRE 15.

LA SURCHARGE D'OPRATEURS

`` 4s4Y GGirreur return fluxY }

gomme vous pouvez le voirD 9est similire operator+ suf qu9iiD le type de retour est une rfrene et non un ojetF ve premier prmtre @rfrene sur un ojet de type ostreamA qui vous ser utoE mtiquement pss est en fit l9ojet cout @que l9on ppelle ii flux dns l fontion pour viter les on)its de nomAF ve seond prmtre est une rfrene onstnte vers l9ojet de type Duree que vous tentez d90her en utilisnt l9oprteur F v fontion doit ruprer les ttriuts qui l9intressent dns l9ojet et les envoyer l9ojet flux @qui n9est utre que coutAF insuiteD elle renvoie une rfrene sur et ojetD e qui permet de fire une hne X
out `` dureeI `` dureePY

Si je compile cela plante ! Cela me dit que je n'ai pas le droit d'accder aux attributs de l'objet duree depuis la fonction !

ih oui 9est prfitement norml r on est l9extrieur de l lsseD et les ttriuts m_heuresD m_minutes et m_secondes sont privsF yn ne peut don ps les lire depuis et endroit du odeF Q solutions X ! ous rez des esseurs omme on l9 vu @es fmeuses mthodes getHeures()D getMinutes()D F F FAF gel mrhe ien mis 9est un peu ennuyeux rireF ! ous utilisez le onept d9mitiD que nous verrons dns un utre hpitreF ! yu ien vous utilisez l tehnique que je vis vous montrerF yn opte ii pour l troisime solution @nonD sns lgue cAF ghngez l premire ligne de l fontion suivnt e modle X
ostrem 8opertor``@ ostrem 8fluxD huree onst8 dureeA { dureeFffiher@fluxA Y GG `E ghngement ii return fluxY }

it rjoutez dns le (hier Duree.h une mthode afficher() l lsse Duree X


void ffiher@stdXXostrem 8fluxA onstY

oii l9implmenttion de l mthode dns Duree.cpp X PSV

LES OPRATEURS DE FLUX

void hureeXXffiher@ostrem 8fluxA onst { flux `` mheures `` 4h4 `` mminutes `` 4m4 `` mseondes `` 4s4Y }

yn psse don le relis une mthode l9intrieur de l lsse quiD elleD le droit d9der ux ttriutsF v mthode prend en prmtre l rfrene vers l9ojet flux pour pouvoir lui envoyer les vleurs qui nous intressentF ge que l9on n9 ps pu fire dns l fontion operatorD on le donne fire une mthode de l lsse DureeF ixtement omme pour operator+ en somme 3 yn dlgu le trvil une mthode de l lsse quiD elleD s ux ttriutsF

Ouf ! Maintenant dans le main(), que du bonheur !


fonD 9tit un peu de gymnstique mis mintenntD e n9est que du onheurF ous llez pouvoir 0her trs simplement vos ojets de type Duree dns votre main() X
int min@A { huree dureeI@PD PSD PVAD dureeP@HD ITD QQAY out `` dureeI `` 4 et 4 `` dureeP `` endlY } return HY

sultt X
PhPSmPVs et HhITmQQs

infntin 3 gomme quoiD on prend un peu de temps pour rire l lsse mis ensuiteD qund on doit l9utiliserD 9est extrmement simple 3 it l9on peut mme ominer les oprteurs dns une seule expressionF pire une ddiE tion et 0her le rsultt diretement X
int min@A { huree dureeI@PD PSD PVAD dureeP@HD ITD QQAY out `` dureeI C dureeP `` endlY } return HY

gomme pour les intD doubleD etF nos ojets deviennent rellement simples utiliserF PSW

CHAPITRE 15.

LA SURCHARGE D'OPRATEURS

Les oprateurs de comparaison


ges oprteurs vont vous permettre de omprer des ojets entre euxF ve plus utilis est prolement l9oprteur d9glit @aaA qui permet de vri(er si deux ojets sont guxF g9est vous d9rire le ode de l mthode qui dtermine si les ojets sont idenE tiquesD l9ordinteur ne peut ps le deviner pour vous r il ne onnt ps l  logique de vos ojetsF ous es oprteurs de omprison ont en ommun un point prtiulier X ils renvoient un boolen @boolAF g9est normlD es oprteurs rpondent des questions du type  estEil plus grnd que c ou  estEil gl c F

L'oprateur ==
our ommenerD on v rire l9implmenttion de l9oprteur d9glitF ous llez voir qu9on s9inspire euoup de l tehnique utilise pour l9oprteur F ve reylge des idesD 9est ien @surtout lorsque el peut nous fire ggner du tempsAF
ool opertoraa@huree onst8 D huree onst8 A { GGeste si Fmheure aa Fmheure etF if @Fmheures aa Fmheures 88 Fmminutes aa Fmminutes 88 Fmseondes aa FmseondesA return trueY else return flseY }

yn ompre hque fois un ttriut de l9ojet dns lequel on se trouve ve un ttriut de l9ojet de rfrene @les heures ve les heuresD les minutes ve les minutesF F FAF i es Q vleurs sont identiquesD lors on peut onsidrer que les ojets sont identiques et renvoyer trueF uf qu9il y un petit soui X il nous fudrit lire les ttriuts des ojets a et bF gomme le veut l rgleD ils sont privs et don inessile depuis l9extrieur de l lsseF eppliquons don l mme strtgie que pour l9oprteur F yn ommene pr rer une mthode estEgal() qui renvoie true si b est gl l9ojet dont on ppel l mthodeF
ool hureeXXestigl@huree onst8 A onst { GGeste si Fmheure aa Fmheure etF if @mheures aa Fmheures 88 mminutes aa Fmminutes 88 mseondes aa FmseondesA return trueY else return flseY }

PTH

LES OPRATEURS DE COMPARAISON

it on utilise ette mthode dns l9oprteur d9glit X


ool opertoraa@huree onst8 D huree onst8 A { return Festigl@AY }

hns le main()D on peut fire un simple test de omprison pour vri(er que l9on fit les hoses orretement X
int min@A { huree dureeI@HD IHD PVAD dureeP@HD IHD PVAY if @dureeI aa dureePA out `` 4ves durees sont identiques4Y else out `` 4ves durees sont differentes4Y } return HY

sultt X
ves durees sont identiques

L'oprateur !=
ester l9glitD 9est ien mis prfoisD on ime svoir si deux ojets sont di'rentsF yn rit lors un oprteur !=F geluiElD il est trs simple rireF our tester si deux ojets sont di'rentsD il su0t de tester s9ils ne sont ps gux 3
ool opertor3a@huree onst8 D huree onst8 A { if@ aa A GGyn utilise l9oprteur aa qu9on dfini prdemment 3 return flseY GG9ils sont guxD lors ils ne sont ps diffrents else return trueY GGit s9ils ne sont ps guxD 9est qu9ils sont diffrents }

te vous vis dit que e serit fileF utiliser des oprteurs dj rits est une onne hitude prendreF h9illeursD on l9vit dj fit pour + qui utilisit +=F PTI

CHAPITRE 15.

LA SURCHARGE D'OPRATEURS

L'oprateur <
i l9oprteur == peut s9ppliquer l pluprt des ojetsD il n9est ps ertin que l9on puisse dire de tous nos ojets lequel est le plus grndF ous n9ont ps forment une notion de grndeurF renez pr exemple notre lsse PersonnageD il serit ssez peu judiieux de vri(er si un Personnage est  infrieur ou non un utre @ moins que vous ne ompriez les viesF F F vous de voirAF in tout sD ve l lsse DureeD on de l hne X il est file et  logique de vri(er si une Duree est infrieure une utreF oii mon implmenttion pour l9oprteur < @ est stritement infrieur A X
ool opertor`@huree onst 8D huree onst8 A { if@Festlusetitue@AA return trueY else return flseY }

it l mthode estPlusPetitQue() de l lsse Duree X


ool hureeXXestlusetitue@huree onst8 A onst { if @mheures ` FmheuresA return trueY else if @mheures aa Fmheures 88 mminutes ` FmminutesA return trueY else if @mheures aa Fmheures 88 mminutes aa Fmminutes 88 mseondes ` FmseondesA return trueY else return flseY }

eve un peu de r)exionD on (nit pr trouver et lgorithme Y il su0t d9tiver un peu ses mningesF ous noterez que l mthode renvoie false si les dures sont identiques X 9est norml r il s9git de l9oprteur <F in revnheD si 9vit t l mthode de l9oprteur `a @ infrieur ou gl AD il urit fllu renvoyer trueF te vous lisse le soin de tester dns le main() si el fontionne orretementF

Les autres oprateurs de comparaison


yn ne v ps les rire iiD el surhrgerit inutilementF wis omme pour != et ==D il su0t d9utiliser orretement < pour tous les implmenterF te vous invite essyer de les implmenter pour notre lsse DureeD el onstituer un on exerie sur le sujetF sl reste notmment X PTP

LES OPRATEURS DE COMPARAISON

! operator>() Y ! operator<=() Y ! operator>=()F i vous vez un peu du ml vous reprer dns le odeD e que je peux omprendreD je mets votre disposition le projet ompletD omme prdemmentD dns un zipF  lhrger les soures gode we X IQRVHV 

En rsum
! ve gCC permet de surhrger les oprteursD 9estEEdire de rer des mthodes pour modi(er le omportement des symoles CD ED BD GD baD etF ! our surhrger un oprteurD on doit donner un nom pris s mthode @operator+ pour le symole C pr exempleAF ! ges mthodes doivent prendre des prmtres et renvoyer prfois des vleurs d9un ertin type prisF gel dpend de l9oprteur que l9on surhrgeF ! sl ne fut ps user de l surhrge d9oprteur r elle peut voir l9e'et inverse du ut reherhD qui est de rendre l leture du ode plus simpleF

PTQ

CHAPITRE 15.

LA SURCHARGE D'OPRATEURS

PTR

Chapitre

16
Dicult :

TP : La POO en pratique avec ZFraction

ous avez appris dans les chapitres prcdents crer et manipuler des classes, il est donc grand temps de mettre tout cela en pratique avec un TP. C'est le premier TP sur la POO, il porte donc sur les bases. C'est le bon moment pour arrter un peu la lecture du cours, souer et essayer de raliser cet exercice par vousmmes. Vous aurez aussi l'occasion de vrier vos connaissances et donc, si besoin, de retourner lire les chapitres sur les lments qui vous ont manqus. Dans ce TP, vous allez devoir crire une classe reprsentant la notion de fraction. Le C++ permet d'utiliser des nombres entiers via le type int, des nombres rels via le type double, mais il ne propose rien pour les nombre rationnels. vous de palier ce manque !

PTS

CHAPITRE 16.

TP: LA POO EN PRATIQUE A VEC ZFRACTION

Prparatifs et conseils
v lsse que nous llons rliser n9est ps trs omplique et il est ssez is d9imginer quelles mthodes et oprteurs nous llons utiliserF get exerie v en prtiulier tester vos onnissnes sur X ! les ttriuts et leurs droits d9s Y ! les onstruteurs Y ! l surhrge des oprteursF g9est don le dernier moment pour rviser 3

Description de la classe ZFraction


gommenons pr hoisir un nom pour notre lsseF sl serit judiieux qu9il ontienne le mot  frtion etD omme vous tes en trin de lire un vivre du roD je vous propose d9jouter un  u dutF ge ser don ZFractionF ge n9est ps super originl misD u moinsD on sit diretement quoi on 'ireF tiliser des int ou des double est trs simpleF yn les dlreD on les initilise et on utilise ensuite les oprteurs omme sur une lultrieF ge serit vriment super de pouvoir fire l mme hose ve des frtionsF ge qui serit enore mieuxD e serit de pouvoir omprer des frtions entre elles (n de dterminer lquelle est l plus grndeF yn imerit don ien que le main() suivnt ompile et fontionne orretement X
5inlude `iostremb 5inlude 4prtionFh4 using nmespe stdY int min@A { prtion @RDSAY prtion @PAY prtion DdY a CY d a BY

GGhlre une frtion vlnt RGS GGhlre une frtion vlnt PGI @e qui vut PA GGhlre deux frtions vlnt H GGglule RGS C PGI a IRGS GGglule RGS B PGI a VGS

out `` `` 4 C 4 `` `` 4 a 4 `` `` endlY out `` `` 4 B 4 `` `` 4 a 4 `` d `` endlY if@ b A out `` 4 est plus grnd que F4 `` endlY else if@aaA out `` 4 est egl F4 `` endlY else

PTT

PRPARATIFS ET CONSEILS

out `` 4 est plus petit que F4 `` endlY } return HY

it voii le rsultt espr X


RGS C P a IRGS RGS B P a VGS est plus petit que F

our rriver elD il nous fudr don X ! rire l lsse ve ses ttriuts Y ! r)hir ux onstruteurs implmenter Y ! surhrger les oprteurs CD BD D ` et aa @u moinsAF
En maths, lorsque l'on manipule des fractions, on utilise toujours des fractions 8 simplies, c'est--dire que l'on crira 4 5 plutt que 10 , mme si ces deux fractions ont la mme valeur. Il faudra donc faire en sorte que notre classe Z Fraction respecte cette rgle.

te n9i rien de plus jouter onernnt l desription du F ous pourrez trouverD dns les ours de mths disponiles sur le ite du roD ertins rppels sur les luls ve les nomres rtionnelsF i vous vous sentez prtsD lors llezEy 3  ppels sur les frtions gode we X QQHQPU  i pr ontre vous vez peur de vous lner seulsD je vous propose de vous ompgner pour les premiers psF

Crer un nouveau projet


our rliser e D vous llez devoir rer un nouveu projetF tilisez l9shi que vous voulezD pour m prt vous svez que j9utilise gode: :floksF ge projet ser onstitu de trois (hiers que vous pouvez dj rer X ! main.cpp X e (hier ontiendr uniquement l fontion main()F hns l fontion main()D nous rerons des ojets ss sur notre lsse ZFraction pour tester son fontionnementF l (nD votre fontion main() devr ressemler elle que je vous i montr plus hutF ! ZFraction.h X e (hier ontiendr le prototype de notre lsse ZFraction ve l liste de ses ttriuts et les prototypes de ses mthodesF ! ZFraction.cpp X e (hier ontiendr l9implmenttion des mthodes de l lsse ZFractionD 9estEEdire le  ode l9intrieur des mthodesF PTU

CHAPITRE 16.

TP: LA POO EN PRATIQUE A VEC ZFRACTION

Faites attention aux noms des chiers, en particulier aux majuscules et minuscules. Les chiers ZFraction.h et ZFraction.cpp commencent par deux lettres majuscules. Si vous crivez  zfraction  ou encore  Zfraction , cela ne marchera pas et vous aurez des problmes.

Le code de base des chiers


xous llons rire un peu de ode dns hun de es (hiersD le strit minimum (n de pouvoir ommenerF
main.cpp

fonD eluiElD je vous l9i dj donnF wis pour ommener en doueurD je vous propose de simpli(er l9intrieur de l fontion main() et d9y jouter des instrutions u fur et mesure de l9vnement de votre lsseF
5inlude `iostremb 5inlude 4prtionFh4 using nmespe stdY int min@A { prtion @IDSAY GG gre une frtion vlnt IGS return HY }

our l9instntD on se ontente d9un ppel u onstruteur de ZFractionF our le resteD on verr plus trdF
ZFraction.h

ge (hier ontiendr l d(nition de l lsse ZFractionF sl inlut ussi iostream pour nos esoins futurs @nous urons esoin de fire des cout dns l lsse les premiers tempsD ne seritEe que pour dugger notre lsseAF
5ifndef hippegsyx 5define hippegsyx 5inlude `iostremb lss prtion { puliX privteX

PTV

PRPARATIFS ET CONSEILS

}Y 5endif

our l9instntD l lsse est vide Y je ne vis ps non plus tout fireD e n9est ps le utF t9y i qund mme mis une prtie prive et une prtie puliqueF ouvenezEvous de l rgle priniple de l yy qui veut que tous les ttriuts soient dns l prtie priveF te vous en voudris euoup si vous ne l respetiez psF
Comme tous les chiers .h, ZFraction.h contient deux lignes commenant par  #  au dbut du chier et une autre tout la n. Code: :Blocks cre automatiquement ces lignes mais, si votre IDE ne le fait pas, pensez les ajouter : elles vitent bien des soucis de compilation.
ZFraction.cpp

g9est le (hier qui v ontenir les d(nitions des mthodesF gomme notre lsse est enore videD il n9y rien y rireF sl fut simplement penser inlure l9entte ZFrac tion.hF
5inlude 4prtionFh4

xous voil en(n prts ttquer l progrmmtion 3

Choix des attributs de la classe


v premire tpe dns l rtion d9une lsse est souvent le hoix des ttriutsF sl fut se demnder de quelles riques de se notre lsse est onstitueF evezEvous une petite ide c oyons el ensemleF n nomre rtionnel est ompos de deux nomres entiers pE pels respetivement le numrteur @elui qui est uEdessus de l rre de frtionA et le dnominteur @elui du dessousAF gel nous fit don deux onstituntsF in gCCD les nomres entiers s9ppellent des intF ejoutons don deux int notre lsse X
5ifndef hippegsyx 5define hippegsyx 5inlude `iostremb lss prtion { puliX privteX

PTW

CHAPITRE 16.

TP : LA POO EN PRATIQUE AVEC ZFRACTION

int mnumerteurY int mdenominteurY }Y 5endif

GGve numrteur de l frtion GGve dnominteur de l frtion

xos ttriuts ommenent toujours pr le pr(xe  m F g9est une onne hitude de progrmmtion que je vous i enseigne dns les hpitres prdents gel nous permettrD pr l suiteD de svoir si nous sommes en trin de mnipuler un ttriut de l lsse ou une simple vrile  lole une mthodeF

Les constructeurs
te ne vis ps tout vous dire non plus misD dns le main() d9exemple que je vous i prsent tout u dutD nous utilisions trois onstruteurs di'rents X ! ve premier reevit omme rguments deux entiersF sls reprsentient respetivement le numrteur et le dnominteur de l frtionF g9est sns doute le plus intuitif des trois rireF ! ve deuxime onstruteur prend un seul entier en rgument et onstruit une frtion gle e nomre entierF gel veut dire queD dns e sD le dnominteur vut IF ! in(nD le dernier onstruteur ne prend uun rgument @onstruteur pr dfutA et re une frtion vlnt HF te ne vis rien expliquer de plusF te vous propose de ommener pr rire u moins le premier de es trois onstruteursF ves utres suivront rpidementD j9en suis srF

Les oprateurs
v prt l plus importnte de e ser l9implmenttion des oprteursF sl fut ien r)hir l mnire de les rire et vous pouvez ien sr vous inspirer de e qui t fit pour l lsse Duree du hpitre prdentD pr exemple utiliser l mthode oper ator+= pour d(nir l9oprteur + ou rire une mthode estEgalA() pour l9oprteur d9glitF ne onne hose fire est de ommener pr l9oprteur <<F ous pourrez lors filement tester vos utres oprteursF

Simplier les fractions


v9importntD ve les frtionsD est de toujours mnipuler des frtions simpli(esD 2 4 9estEEdire que l9on prfre rire 5 plutt que 10 F sl serit ien que notre lsse fsse de mme et simpli(e elleEmme l frtion qu9elle reprsenteF sl nous fut don un moyen mthmtique de le fire puis trduire le tout en gCCF i l9on une frtion a b D il fut luler le plus grnd ommun diviseur de a et b puis PUH

CORRECTION

diviser a et b pr e nomreF r exempleD le PGCD de 4 et 10 est 2D e qui veut dire 4 que l9on peut diviser les numrteur et dnominteur de 10 pr 2D et nous otenons 2 ien 5 F gluler le qgh n9est ps une oprtion fileF eussiD je vous propose pour le fire une fontion que je vous invite jouter dns votre (hier ZFraction.cpp X
1

int pgd@int D int A { while @ 3a HA { onst int t a Y a 7Y atY } return Y }

sl fut jouter le prototype orrespondnt dns ZFraction.h X


5ifndef hippegsyx 5define hippegsyx 5inlude `iostremb lss prtion { GGgontenu de l lsseFFF }Y int pgd@int D int AY 5endif

ous pourrez lors utiliser ette fontion dns les mthodes de l lsseF ellez u oulot 3

Correction
vhez vos lviersD le temps imprti est oul 3 sl est temps de psser l phse de orretionF ous vez ertinement pss ps ml de temps r)hir ux di'rentes mthodesD oprteurs et utres horreurs joyeusets du gCCF i vous n9vez ps russi tout fireD e n9est ps grve X lire l orretion pour sisir les grnds prinipes devrit vous iderF it puis vous surez peutEtre vous rttrper ve les mliortions proposes en (n de hpitreF
1. Plus grand commun diviseur

PUI

CHAPITRE 16.

TP: LA POO EN PRATIQUE A VEC ZFRACTION

ns plus ttendreD je vous propose de psser en revue les di'rentes tpes de rtion de l lsseF

Les constructeurs
te vous vis suggr de ommener pr le onstruteur prennt en rgument deux entiersD le numrteur et le dnominteurF oii m versionF
prtionXXprtion@int numD int denA Xmnumerteur@numAD mdenominteur@denA { }

yn utilise l liste d9initilistion pour remplir les ttriuts m_numerateur et m_denom inateur de l lsseF tusqueElD rien de sorierF in ontinunt sur ette lneD on peut rire les deux utres onstruteurs X
prtionXXprtion@int entierA Xmnumerteur@entierAD mdenominteur@IA { } prtionXXprtion@A Xmnumerteur@HAD mdenominteur@IA { }
0 sl fllit se rppeler que le nomre 5 s9ritD sous forme de frtionD 5 1 et 0D 1 F hns e domineD le hier des hrges est don rempliF evnt de ommener fire des hoses ompliquesD rivons l9oprteur << pour 0her notre frtionF in s d9erreurD on pourr insi filement voir e qui se psse dns l lsseF

Acher une fraction


gomme nous l9vons vu u hpitre sur les oprteursD l meilleure solution onsiste utiliser une mthode affiche() dns l lsse et ppeler ette mthode dns l fontion <<F te vous invite rutiliser le ode du hpitre prdent (n d9voir diretement le ode de l9oprteurF
ostrem8 opertor``@ostrem8 fluxD prtion onst8 frtionA { frtionFffihe@fluxAY return fluxY }

it pour l mthode affiche()D je vous propose ette version X PUP

CORRECTION

void prtionXXffihe@ostrem8 fluxA onst { if@mdenominteur aa IA { flux `` mnumerteurY } else { flux `` mnumerteur `` 9G9 `` mdenominteurY } }

Notez le

const qui gure dans le prototype de la mthode. Il montre que affiche() ne modiera pas l'objet : normal, puisque nous nous contentons

d'acher ses proprits.

ous vez ertinement rit quelque hose d9pprohntF t9i distingu le s o le dnominteur vut IF ne frtion dont le dnominteur vut I est un nomre entierD on n9 don ps esoin d90her l rre de frtion et le dnominteurF wis 9est juste une question d9esthtiqueF

L'oprateur d'addition
gomme pour <<D le mieux est d9employer l reette du hpitre prdent X d(nir une mthode operator+=() dns l lsse et l9utiliser dns l fontion operator+()F
prtion opertorC@prtion onst8 D prtion onst8 A { prtion opie@AY opieCaY return opieY }

v di0ult rside dns l9implmenttion de l9oprteur d9ddition rouriF in ressortnt mes hiers de mthsD j9i retrouv l formule d9ddition de deux frE tions X
a b

c d

a d + b c b d

Pour ceux qui ne sont pas l'aise avec les maths, sachez que le point sert multiplier.

gel donne en gCC X


prtion8 prtionXXopertorCa@prtion onst8 utreA {

PUQ

CHAPITRE 16.

TP: LA POO EN PRATIQUE A VEC ZFRACTION

mnumerteur a utreFmdenominteur B mnumerteur C mdenominteur B utreF mnumerteurY mdenominteur a mdenominteur B utreFmdenominteurY } return BthisY

Comme tous les oprateurs raccourcis, l'oprateur += doit renvoyer une rfrence sur *this. C'est une convention.

L'oprateur de multiplication
v formule de multiplition de deux frtions est enore plus simple que l9ddition X it je ne vis ps vous surprendre si je vous dis qu9il fut utiliser l mthode operato r*=() et l fontion operator*()F te pense que vous vez ompris le truF
prtion opertorB@prtion onst8 D prtion onst8 A { prtion opie@AY opieBaY return opieY } prtion8 prtionXXopertorBa@prtion onst8 utreA { mnumerteur Ba utreFmnumerteurY mdenominteur Ba utreFmdenominteurY } return BthisY
a b

c d

a c b d

Les oprateurs de comparaison


gomprer des frtions pour tester si elles sont gles revient vri(er que leurs numE rteurs d9une prtD et leurs dnominteurs d9utre prtD sont guxF v9lgorithme est don nouveu reltivement simpleF te vous proposeD omme toujoursD de psser pr une mthode de l lsse puis d9utiliser ette mthode dns les oprteurs externesF
ool prtionXXestigl@prtion onst8 utreA onst { if@mnumerteur aa utreFmnumerteur 88 mdenominteur aa utreFmdenomint eurA

PUR

CORRECTION

return trueY else return flseY

ool opertoraa@prtion onst8 D prtion onst8 A { if@Festigl@AA return trueY else return flseY } ool opertor3a@prtion onst8 D prtion onst8 A { if@Festigl@AA return flseY else return trueY }

ne fois que l mthode estEgal() est implmenteD on deux oprteurs pour le prix d9un seulF rfitD je n9vis ps envie de r)hir deux foisF

Les oprateurs d'ordre


sl ne nous reste plus qu9 rire un oprteur permettnt de vri(er si une frtion est plus petite que l9utreF sl y plusieurs moyens d9y prvenirF oujours dns mes livres de mthsD j9i retrouv une vieille reltion intressnte X
sPetitQue()

gette reltion peut tre trduite en gCC pour otenir le orps de l mthode estPlu X
ool prtionXXestlusetitue@prtion onst8 utreA onst { if@mnumerteur B utreFmdenominteur ` mdenominteur B utreFmnumerteurA return trueY else return flseY }

a b

<

c d

a d < b c

it ette foisD e n9est ps un pk  P en I D mis  R en I F eve un peu de r)exionD on peut utiliser ette mthode pour les oprteurs <D >D <= et >=F
ool opertor`@prtion onst8 D prtion onst8 A GGri si ` don si est plus petit que {

PUS

CHAPITRE 16.

TP: LA POO EN PRATIQUE A VEC ZFRACTION

if@Festlusetitue@AA return trueY else return flseY

ool opertorb@prtion onst8 D prtion onst8 A GGri si b don si est plus petit que { if@Festlusetitue@AA return trueY else return flseY } ool opertor`a@prtion onst8 D prtion onst8 A GGri si `a don si n9est ps plus petit que { if@Festlusetitue@AA return flseY else return trueY } ool opertorba@prtion onst8 D prtion onst8 A GGri si ba don si n9est ps plus petit que { if@Festlusetitue@AA return flseY else return trueY }

eve es qutre derniers oprteursD nous vons fit le tour de e qui tit demndF F F ou presqueF sl nous reste voir l prtie l plus di0ile X le prolme de l simpli(tion des frtionsF

Simplier les fractions


te vous i expliqu dns l prsenttion du prolme quel lgorithme utiliser pour simpli(er une frtionF sl fut luler le qgh du numrteur et du dnominteurD puis diviser les deux ttriuts de l frtion pr e nomreF gomme 9est une oprtion qui doit tre exute di'rents endroitsD je vous propose d9en fire une mthode de l lsse (n de s9prgner l rriture de l9lgorithmeF gette mthode n9 ps tre ppele pr les utilisteurs de l lsseD 9est de l mnique interneF ille v don dns l prtie prive de l lsseF
2

2. Plus grand commun diviseur

PUT

CORRECTION

void prtionXXsimplifie@A { int nomreapgd@mnumerteurD mdenominteurAY GGglul du qgh mnumerteur Ga nomreY mdenominteur Ga nomreY GGit on simplifie

Quand faut-il utiliser cette mthode ?

g9est une onne question mis vous devriez voir l rponseF sl fut simpli(er l frtion hque fois qu9un lul est e'etuD 9estEEdire dns les mthodes operator+=() et operator*=() X
prtion8 prtionXXopertorCa@prtion onst8 utreA { mnumerteur a utreFmdenominteur B mnumerteur C mdenominteur B utreF mnumerteurY mdenominteur a mdenominteur B utreFmdenominteurY simplifie@AY return BthisY GGyn simplifie l frtion

prtion8 prtionXXopertorBa@prtion onst8 utreA { mnumerteur Ba utreFmnumerteurY mdenominteur Ba utreFmdenominteurY simplifie@AY return BthisY GGyn simplifie l frtion

wis e n9est ps tout 3 und l9utilisteur onstruit une frtionD rien ne grntit qu9il 4 le fsse orretementF sl peut trs ien initiliser s ZFraction ve les vleurs 8 pr exempleF sl fut don ussi ppeler l mthode dns le onstruteurD qui prend deux rgumentsF
prtionXXprtion@int numD int denA Xmnumerteur@numAD mdenominteur@denA { simplifie@AY GGyn simplifie u s o l9utilisteur GGeurit entr de muvises informtions }

PUU

CHAPITRE 16.

TP : LA POO EN PRATIQUE AVEC ZFRACTION

it voil 3 in fitD si vous regrdez ienD nous vons d jouter un ppel l mthode simplifie() dns toutes les mthodes qui ne sont ps dlres onstntes 3 ghque fois que l9ojet est modi(D il fut simpli(er l frtionF xous urions pu viter de r)hir et simplement nlyser notre ode l reherhe de es mthodesF tiliser co nst est don un tout de suritF yn voit tout de suite o il fut fire des vri(tions @ppeler simplifie()A et o 9est inutileF xotre lsse est mintennt fontionnelle et respete les ritres que je vous i impossF rip rip rip rourr 3

Aller plus loin


xotre lsse est termineF hisons qu9elle remplit les onditions poses en dut de hpitreF wis vous en onviendrezD on est enore loin d9voir fit le tour du sujetF yn peut fire euoup plus ve des frtionsF te vous propose de tlhrger le ode soure de e D si vous le souhitezD vnt d9ller plus loin X  lhrger le ode soure gode we X TRSHRT  oyons mintennt e que l9on pourrit fire en plus X ! Ajouter des mthodes numerateur() et denominateur() qui renvoient le numE rteur et le dnominteur de l ZFraction sns l modi(erF ! Ajouter une mthode nombreReel() qui onvertit notre frtion en un doubleF ! Simplier les constructeurs omme pour l lsse DureeF in r)hissnt ienD on peut fusionner les trois onstruteurs en un seul ve des vleurs pr dfutF ! Proposer plus d'oprateurs X nous vons implment l9ddition et l multipliE tionD il nous mnque l soustrtion et l divisionF ! our l9instntD notre lsse ne gre que les frtions positivesF g9est insu0snt 3 sl fudrit permettre des fractions ngativesF i vous vous lnez dns ette theD il v flloir fire des hoix importnts @sur l mnire de grer le signeD pr exempleAF ge que je vous proposeD 9est de toujours pler le signe de l frtion u numrteurF 1 1 einsiD 4 devr utomtiquement tre onverti en 4 F in plus de simpli(er les frtionsD vos oprteurs devront don ussi veiller pler le signe u on endroitF nouveuD je vous onseille d9utiliser une mthode priveF ! i vous utorisez les frtions ngtivesD lors il serit judiieux de proposer l'oprateur  moins unaire F g9est l9oprteur qui trnsforme un nomre positif en nomre ngtif omme dns b=-a;F gomme les utres oprteurs rithmtiquesD il se dlre en dehors de l lsseF on prototype est X ZFractionoperator-(ZFractio nconst&a);F g9est nouveu mis ps trs di0ile si l9on utilise les onnes mthodes de l lsseF ! Ajouter des fonctions mathmatiques telles que abs()D sqrt() ou pow()D preE nnt en rguments des ZFractionF ensez inlure l9enEtte cmathF
3

3. Je ne vous ai pas parl de cet oprateur.

PUV

ALLER PLUS LOIN

te pense que el v vous demnder ps ml de trvil mis 9est tout n(e pour vous X il fut ps ml d9expriene ve les lsses pour rriver  penser ojet et il n9y que l prtique qui peut vous iderF te ne vis ps vous fournir une orretion dtille pour hun de es points mis je peux vous proposer une solution possile X  emliortions de zprtion gode we X VVRQUR  it si vous vez d9utres idesD n9hsitez ps les jouter votre lsse 3

PUW

CHAPITRE 16.

TP : LA POO EN PRATIQUE AVEC ZFRACTION

PVH

Chapitre

17
Dicult :

Classes et pointeurs

ans les chapitres prcdents, j'ai volontairement vit d'utiliser les pointeurs avec les classes. En eet, les pointeurs en C++ sont un vaste et sensible sujet. Comme vous l'avez probablement remarqu par le pass, bien grer les pointeurs est essentiel car, la moindre erreur, votre programme risque de :  consommer trop de mmoire parce que vous oubliez de librer certains lments ;  planter si votre pointeur pointe vers n'importe o dans la mmoire. Comment associe-t-on classes et pointeurs ? Quelles sont les rgles connatre, les bonnes habitudes prendre ? Voil un sujet qui mritait au moins un chapitre lui tout seul !

PVI

CHAPITRE 17.

CLASSES ET POINTEURS

Attention, je classe ce chapitre entre  trs dicile  et  trs trs dicile .

Bref, vous m'avez compris, les pointeurs en C++, ce n'est pas de la tarte alors quadruplez d'attention lorsque vous lirez ce chapitre.

Pointeur d'une classe vers une autre classe


eprenons notre lsse PersonnageF hns les prdents hpitresD nous lui vons jout une Arme que nous vons diretement intgre ses ttriuts X
lss ersonnge { puliX GGuelques mthodesFFF privteX erme mrmeY GG v9erme est 4ontenue4 dns le ersonnge GGFFF

}Y

sl y plusieurs fons di'rentes d9ssoier des lsses entre ellesF gelleEi fontionne ien dns notre s mis l9Arme est vriment  lie u PersonnageD elle ne peut ps en sortirF hmtiquementD el donnerit quelque hose de omprle l (gure IUFIF

Figure IUFI ! ne lsse ontennt une utre lsse

ous le voyezD l9Arme est vriment dans le PersonnageF sl y une utre tehniqueD plus soupleD qui o're plus de possiilits mis qui est plus omplexe X ne ps intgrer l9Arme u Personnage et utiliser un pointeur l pleF eu niveu de l dlrtion de l lsseD le hngement orrespond F F F une toile en plus X
lss ersonnge { puliX

PVP

POINTEUR D'UNE CLASSE VERS UNE AUTRE CLASSE

GGuelques mthodesFFF privteX erme BmrmeY GGv9erme est un pointeurD l9ojet n9est plus ontenu dns le ersonnge GGFFF

}Y

xotre Arme tnt un pointeurD on ne peut plus dire qu9elle pprtient u Personnage @(gure IUFPAF

Figure IUFP ! hes lsses lies pr un pointeur

yn onsidre que l9Arme est mintennt externe u PersonnageF ves vntges de ette tehnique sont les suivnts X ! ve Personnage peut hnger d9Arme en fisnt tout simplement pointer m_arme vers un utre ojetF r exempleD si le Personnage possde un inventire @dns un s dosAD il peut hnger son Arme tout moment en modi(nt le pointeurF ! ve Personnage peut donner son Arme un utre PersonnageD il su0t de hnger les pointeurs de hun des personngesF ! i le Personnage n9 plus d9ArmeD il su0t de mettre le pointeur m_arme HF
Les pointeurs permettent de rgler le problme que l'on avait vu pour le jeu de stratgie Warcraft III : un personnage peut avoir une cible qui change grce un pointeur interne, exactement comme ici.

wis des dfutsD il y en ussiF qrer une lsse qui ontient des pointeursD e n9est ps de l trteD vous pouvez me roireD et d9illeurs vous llez le onstterF
Alors, faut-il utiliser un pointeur ou pas pour l'Arme ? Les 2 faons de faire sont valables et chacune a ses avantages et ses dfauts. Utiliser un pointeur est probablement ce qu'il y a de plus souple mais c'est aussi plus dicile. Retenez donc qu'il n'y a pas de  meilleure  mthode adapte tous les cas. Ce sera vous de choisir, en fonction de votre cas, si vous intgrez directement un objet dans une classe ou si vous utilisez un pointeur.

PVQ

CHAPITRE 17.

CLASSES ET POINTEURS

Gestion de l'allocation dynamique


yn v voir ii omment on trville qund une lsse ontient des pointeurs vers des ojetsF yn trville l enore sur l lsse Personnage et je suppose que vous vez mis l9ttriut m_arme en pointeur omme je l9i montr un peu plus hut X
lss ersonnge { puliX GGuelques mthodesFFF privteX erme BmrmeY GGv9erme est un pointeurD l9ojet n9est plus ontenu dns le ersonnge GGFFF

}Y

Je ne rcris volontairement pas tout le code, juste l'essentiel pour que nous puissions nous concentrer dessus.

xotre Arme tnt un pointeurD il v flloir le rer pr le iis d9une llotion dynE mique ve newF inonD l9ojet ne se rer ps tout seulF

Allocation de mmoire pour l'objet


votre visD o se fit l9llotion de mmoire pour notre Arme c sl n9y ps QT endroits pour el X 9est dns le constructeurF g9est en e'et le rle du onstruteur de fire en sorte que l9ojet soit ien onstruitD don notmment que tous les pointeurs pointent vers quelque hoseF hns notre sD nous sommes oligs de fire une llotion dynmiqueD don d9utiliser newF oii e que el donne dns le onstruteur pr dfut X
ersonngeXXersonnge@A X mrme@HAD mvie@IHHAD mmn@IHHA { mrme a new erme@AY }

i vous vous souvenez ienD on vit ussi fit un seond onstruteur pour eux qui voulient que le Personnage ommene ve une rme plus puissnte ds le dutF sl fut l ussi y fire une llotion dynmique X PVR

GESTION DE L'ALLOCATION DYNAMIQUE

ersonngeXXersonnge@string nomermeD int degtsermeA X mrme@HAD mvie@IHHAD mmn@IHHA { mrme a new erme@nomermeD degtsermeAY }

oii sns plus ttendre les explitions X newArme() ppelle le onstruteur pr dfut de l lsse Arme tndis que newArme(nomArme,degatsArme) ppelle le onstruteur surhrgF ve new renvoie l9dresse de l9ojet rD dresse qui est stoke dns notre pointeur m_armeF r suritD on initilise d9ord le pointeur H dns l liste d9initilistion puis on fit l9llotion ve le new entre les oldes du onstruteurF

Dsallocation de mmoire pour l'objet


xotre Arme tnt un pointeurD lorsque l9ojet de type Personnage est supprimD l9erme ne disprt ps toute seule 3 i on se ontente d9un new dns le onstruteurD et qu9on ne met rien dns le destruteurD lorsque l9ojet de type Personnage est dtruit nous vons un prolme @(gure IUFQAF

Figure IUFQ ! eul Personnage est supprim

v9ojet de type Personnage disprt el et ien mis l9ojet de type Arme susiste en mmoire et il n9y plus uun pointeur pour se  rppeler son dresseF in lirD l9Arme v trner en mmoire et on ne pourr plus jmis l supprimerF g9est e qu9on ppelle une fuite de mmoireF our rsoudre e prolmeD il fut fire un delete de l9Arme dns le destructeur du personnge (n que l9Arme soit supprime avant le personngeF ve ode est tout simple X
ersonngeXX~ersonnge@A { delete mrmeY }

PVS

CHAPITRE 17.

CLASSES ET POINTEURS

gette fois le destruteur est rellement indispensleF wintenntD lorsque quelqu9un demnde dtruire le PersonnageD il se psse ei X IF eppel du destruteurF F F et donD dns notre sD suppression de l9Arme @ve le deleteA Y PF uis suppression du PersonnageF eu (nlD les deux ojets sont el et ien supprims et l mmoire reste propre @(gure IUFRAF

Figure IUFR ! ous les ojets sont proprement supprims

N'oubliez pas que m_arme est maintenant un pointeur !


gel implique de hnger toutes les mthodes qui l9utilisentF r exemple X
void ersonngeXXttquer@ersonnge 8ileA { ileFreevoirhegts@mrmeFgethegts@AAY }

F F F devient X
void ersonngeXXttquer@ersonnge 8ileA { ileFreevoirhegts@mrmeEbgethegts@AAY }

xotez l di'rene X le point t rempl pr l )he r m_arme est un pointeurF

Le pointeur this
ge hpitre tnt di0ileD je vous propose un pssge un peu plus oolF uisqu9on prle de yy et de pointeursD je me dois de vous prler du pointeur thisF PVT

LE POINTEUR

THIS

hns toutes les lssesD on dispose d9un pointeur ynt pour nom thisD qui pointe vers l'objet actuelF te reonnis que e n9est ps simple imginer mis je pense que el psser mieux ve un shm mison @(gure IUFSAF

Figure IUFS ! ve pointeur this

ghque ojet @ii de type PersonnageA possde un pointeur this qui pointe versF F F l9ojet luiEmme 3
this tant utilis par le langage C++ dans toutes les classes, vous ne pouvez pas crer de variable appele this car cela susciterait un conit. De mme, si vous commencez essayer d'appeler vos variables class, new, delete, return, etc. vous aurez un problme. Ces mots-cls sont ce qu'on appelle

des  mots-cls rservs . Le langage C++ se les rserve pour son usage personnel, vous n'avez donc pas le droit de crer des variables (ou des fonctions) portant ces noms-l.

Mais. . . quoi peut bien servir this ?

pondre ette question me ser dlitF in revnhe je peux vous donner un exemple X vous tes dns une mthode de votre lsse et ette mthode doit renvoyer un pointeur vers l9ojet uquel elle pprtientF ns le thisD on ne pourrit ps l9rireF oil e que el pourrit donner X
ersonngeB ersonngeXXgetedresse@A onst { return thisY }

xous l9vons en fit dj renontr une foisD lors de l surhrge de l9oprteur +=F ouvenezEvousD notre oprteur ressemlit ei X
huree8 hureeXXopertorCa@onst huree 8dureePA {

PVU

CHAPITRE 17.

CLASSES ET POINTEURS

GGhes luls ompliqusFFF } return BthisY

this

tnt un pointeur sur un ojetD *this est l9ojet luiEmme 3 xotre oprteur renvoie don l9ojet luiEmmeF v rison pour lquelle on doit renvoyer l9ojet est omE plique mis 9est l forme orrete des oprteursF te vous propose don simplement d9pprendre ette syntxe pr urF prt pour l surhrge des oprteursD vous n9vez ertinement ps utiliser this dns l9immdit mis il rriver un jour oD pour rsoudre un prolme prtiulierD vous urez esoin d9un tel pointeurF ge jourElD souvenezEvous qu9un ojet peut  retrouver son dresse l9ide du pointeur thisF gomme 9est l9endroit le plus dpt pour en prler dns e oursD j9en pro(teF gel ne v ps hnger votre vie tout de suite mis il se peut queD ien plus trdD dns plusieurs hpitresD je vous dise tel un vieillrd sur s nne  ouvenezEvousD souvenezEvous du pointeur this 3 F elors ne l9ouliez ps 3

Le constructeur de copie
ve constructeur de copie est une surcharge prtiulire du onstruteurF ve onstruE teur de opie devient gnrlement indispensle dns une lsse qui ontient des poinE teurs et el tome ien vu que 9est prisment notre s iiF

Le problme
our ien omprendre l9intrt du onstruteur de opieD voyons onrtement e qui se psse lorsqu9on re un ojet en lui 'etntF F F un utre ojet 3 r exemple X
int min@A { ersonnge golith@4ipe iguise4D PHAY ersonnge dvid@golithAY GGyn re dvid prtir de golithF dvid ser une  opie } return HY de golithF

vorsqu9on onstruit un ojet en lui 'etnt diretement un utre ojetD omme on vient de le fire iiD le ompilteur ppelle une mthode ppele constructeur de copieF ve rle du onstruteur de opie est de copier la valeur de tous les attributs du premier ojet dns le seondF hon david rupre l vie de goliathD le mn de goliathD etF PVV

LE CONSTRUCTEUR DE COPIE

Dans quels cas le constructeur de copie est-il appel ?

yn vient de le voirD le onstruteur de opie est ppel lorsqu9on re un nouvel ojet en lui 'etnt l vleur d9un utre X
ersonnge dvid@golithAY GGeppel du onstruteur de opie @s IA

gei est stritement quivlent X


ersonnge dvid a golithY GGeppel du onstruteur de opie @s PA

hns e seond sD 9est ussi u onstruteur de opie qu9on fit ppelF wis e n9est ps tout 3 vorsque vous envoyez un ojet une fontion sns utiliser de pointeur ni de rfreneD l9ojet est l ussi opi 3 smginons l fontion X
void mpontion@ersonnge unersonngeA { }

i vous ppelez ette fontion qui n9utilise ps de pointeur ni de rfreneD lors l9ojet ser opi en utilisntD u moment de l9ppel de l fontionD un onstruteur de opie X
mpontion@qolithAY GGeppel du onstruteur de opie @s QA

fien entenduD il est gnrlement prfrle d9utiliser une rfrene r l9ojet n9 ps esoin d9tre opiF gel v don ien plus vite et nessite moins de mmoireF outefoisD il rriver des s o vous urez esoin de rer une fontion quiD omme iiD fit une opie de l9ojetF
Si vous n'crivez pas vous-mmes un constructeur de copie pour votre classe, il sera gnr automatiquement pour vous par le compilateur. Ok, c'est sympa de sa part mais le compilateur est. . . bte (pour ne pas le froisser). En fait, le constructeur de copie gnr se contente de copier la valeur de tous les attributs. . . et mme des pointeurs !

ve prolme c ih ien justementD il se trouve queD dns notre lsse PersonnageD un des ttriuts est un pointeur 3 ue fit l9ordinteur c sl opie l vleur du pointeurD don l9dresse de l9ArmeF eu (nlD les P ojets ont un pointeur qui pointe vers le mme ojet de type Arme @(gure IUFTA 3 eh les foures 3 PVW

CHAPITRE 17.

CLASSES ET POINTEURS

Figure IUFT ! v9ordinteur opi le pointeurD les deux Personnages pointent vers l

mme Arme

Si on ne fait rien pour rgler cela, imaginez ce qui se passe lorsque les deux personnages sont dtruits. . . Le premier est dtruit ainsi que son arme car le destructeur ordonne la suppression de l'arme avec un delete. Et quand arrive le tour du second personnage, le delete plante (et votre programme avec) parce que l'arme a dj t dtruite !

ve onstruteur de opie gnr utomtiquement pr le ompilteur n9est ps ssez intelligent pour omprendre qu9il fut llouer de l mmoire pour une utre ArmeF F F u9 el ne tienneD nous llons le lui expliquerF

Cration du constructeur de copie


ve onstruteur de opieD omme je vous l9i dit un peu plus hutD est une surhrge prtiulire du onstruteurD qui prend pour prmtreF F F une rfrene onstnte vers un ojet du mme type 3 i vous ne trouvez ps el lirD peutEtre qu9un exemple vous iderF
lss ersonnge { puliX ersonnge@AY ersonnge@ersonnge onst8 personngeegopierAY GGve prototype du onstruteur de opie ersonnge@stdXXstring nomermeD int degtsermeAY ~ersonnge@AY GB

PWH

LE CONSTRUCTEUR DE COPIE

FFF plein d9utres mthodes qui ne nous intressent ps ii BG privteX int mvieY int mmnY erme BmrmeY

}Y

in rsumD le prototype d9un onstruteur de opie est X


yjet@yjet onst8 ojetegopierAY

ve const indique simplement que l9on n9 ps le droit de modi(er les vleurs de l9obj etACopier @9est logiqueD on seulement esoin de  lire ses vleurs pour le opierAF rivons l9implmenttion de e onstruteurF sl fut opier tous les ttriuts du pers onnageACopier dns le Personnage tuelF gommenons pr les ttriuts  simples D 9estEEdire eux qui ne sont ps des pointeurs X
ersonngeXXersonnge@ersonnge onst8 personngeegopierA X mvie@personngeegopierFmvieAD mmn@personngeegopierFmmnAD mrme@HA { }

Vous vous demandez peut-tre comment cela se fait qu'on puisse accder aux attributs m_vie et m_mana du personnageACopier ? Si vous vous l'tes demand, je vous flicite, cela veut dire que le principe d'encapsulation commence rentrer dans votre tte. Eh oui, en eet, m_vie et m_mana sont privs donc on ne peut pas y accder depuis l'extrieur de la classe. . . sauf qu'il y a une exception ici : on est dans une mthode de la classe Personnage et on a donc le droit d'accder tous les lments (mme privs) d'un autre Personnage. C'est un peu tordu, je l'avoue, mais dans le cas prsent cela nous simplie grandement la vie. Retenez donc qu'un objet de type X peut accder tous les lments (mme privs) d'un autre objet du mme type X.

sl reste mintennt  opier

m_armeF

i on rit X

mrme a personngeegopierFmrmeY

F F F on fit extement l mme erreur que le ompilteurD 9estEEdire qu9on ne opie que l9dresse de l9ojet de type Arme et non l9ojet en entier 3 our rsoudre le prolmeD il fut opier l9ojet de type Arme en fisnt une llotion dynmiqueD don un newF ettentionD rohezEvous pre que e n9est ps simpleF i on fit X PWI

CHAPITRE 17.

CLASSES ET POINTEURS

mrme a new erme@AY

F F F on re ien une nouvelle Arme mis on utilise le onstruteur pr dfutD don el re l9Arme de seF yr on veut voir extement l mme Arme que elle du personn ageACopier @eh ien ouiD 9est un onstruteur de opieAF v onne nouvelleD omme je vous l9i dit plus hutD 9est que le onstruteur de opie est utomtiquement gnr pr le ompilteurF nt que l lsse n9utilise ps de pointeurs vers des ttriutsD il n9y ps de dngerF it el tome ienD l lsse Arme n9utilise ps de pointeurD on peut don se ontenter du onstruteur qui t gnrF sl fut don ppeler le onstruteur de opie de ArmeD en pssnt en prmtre l9ojet opierF ous pourriez penser qu9il fut fire ei X
mrme a new erme@personngeegopierFmrmeAY

resque 3 uf que m_arme est un pointeur et le prototype du onstruteur de opie est X


erme@erme onst8 rmeAY

F F F e qui veut dire qu9il fut envoyer l9ojet luiEmme et ps son dresseF ous vous souvenez de l mnire d9otenir l9ojet @ou l vrileA prtir de son dresse c yn utilise l9toile B 3 gel donne u (nl X
mrme a new erme@B@personngeegopierFmrmeAAY

gette ligne lloue dynmiquement une nouvelle rmeD en se snt sur l9rme du per sonnageACopierF s simpleD je le reonnisD mis relisez plusieurs fois les tpes de mon risonnement et vous llez omprendreF our ien suivre tout e que j9i ditD il fut vriment que vous soyez u point sur tout X les pointeursD les rfrenesD et lesF F F onstruteurs de opieF

Le constructeur de copie une fois termin


ve onstruteur de opie orret ressemler don u (nl ei X
ersonngeXXersonnge@ersonnge onst8 personngeegopierA X mvie@personngeegopierFmvieAD mmn@personngeegopierFmmnAD mrme@HA { mrme a new erme@B@personngeegopierFmrmeAAY }

einsiD nos deux personnges ont hun une rme identique mis dupliqueD (n d9viter les prolmes que je vous i expliqus plus hut @(gure IUFUAF PWP

LE CONSTRUCTEUR DE COPIE

Figure IUFU ! ghque personnge mintennt son rme

L'oprateur d'aectation
xous vons dj prl de l surhrge des oprteurs mis il y en un que je ne vous i ps prsent X il s9git de l9oprteur d9'ettion @operator=AF
Le compilateur crit automatiquement un oprateur d'aectation par dfaut mais c'est un oprateur  bte . Cet oprateur bte se contente de copier une une les valeurs des attributs dans le nouvel objet, comme pour le constructeur de copie gnr par le compilateur.

v mthode operator= ser ppele ds qu9on essie d9'eter une vleur l9ojetF g9est le sD pr exempleD si nous 'etons notre ojet l vleur d9un utre ojet X
dvid a golithY

Ne confondez pas le constructeur de copie avec la surcharge de l'oprateur = (operator=). Ils se ressemblent beaucoup mais il y a une dirence : le constructeur de copie est appel lors de l'initialisation ( la cration de l'objet) tandis que la mthode operator= est appele si on essaie d'aecter un autre objet par la suite, aprs son initialisation.
ersonnge dvid a golithY GGgonstruteur de opie dvid a golithY GGopertora

gette mthode e'etue le mme trvil que le onstruteur de opieF rire son imE plmenttion est don reltivement simpleD une fois qu9on ompris le prinipe ien srF PWQ

CHAPITRE 17.

CLASSES ET POINTEURS

ersonnge8 ersonngeXXopertora@ersonnge onst8 personngeegopierA { if@this 3a 8personngeegopierA GGyn vrifie que l9ojet n9est ps le mme que elui reu en rgument { mvie a personngeegopierFmvieY GGyn opie tous les hmps mmn a personngeegopierFmmnY delete mrmeY mrme a new erme@B@personngeegopierFmrmeAAY } return BthisY GGyn renvoie l9ojet luiEmme }

sl y tout de mme qutre di'renes X ! gomme e n9est ps un onstruteurD on ne peut ps utiliser l liste d9initilistion et don tout se psse entre les oldesF ! sl fut penser vri(er que l9on n9est ps en trin de fire david=davidD que l9on trville don ve deux ojets distintsF sl fut don vri(er que leurs dresses mmoires @this et &personnageACopierA soient di'rentesF ! sl fut renvoyer *this omme pour les oprteurs +=D -=D etF g9est une rgle respeterF ! sl fut penser supprimer l9nienne Arme vnt de rer l nouvelleF g9est e qui est fit u niveu de l9instrution deleteD surligne dns le odeF gei n9tit ps nessire dns le onstruteur de opie puisque le personnge ne possdit ps d9rme vntF get oprteur est toujours similire elui que je vous donne pour l lsse Personna geF ves seuls lments qui hngent d9une lsse l9utre sont les lignes (gurnt dns le ifF te vous i en quelque sorte donn l reette universelleF sl y une hose importnte retenir u sujet de et oprteur X il v toujours de pir ve le onstruteur de opieF F
Si l'on a besoin d'crire un constructeur de copie, alors il faut aussi obligatoirement crire une surcharge de operator=

g9est une rgle trs importnte respeterF ous risquez de grves prolmes de poinE teurs si vous ne l respetez psF gomme vous ommenez vous en rendre ompteD l yy n9est ps simpleD surtout qund on ommene mnipuler des ojets ve des pointeursF reureusementD vous urez l9osion de prtiquer tout el pr l suite et vous llez petit petit prendre l9hitude d9viter les piges des pointeursF PWR

LE CONSTRUCTEUR DE COPIE

En rsum
! our ssoier des lsses entre ellesD on peut utiliser les pointeurs X une lsse peut ontenir un pointeur vers une utre lsseF ! vorsque les lsses sont ssoies pr un pointeurD il fut veiller ien lirer l mmoire (n que tous les lments soient supprimsF ! sl existe une surhrge prtiulire du onstruteur ppele  onstruteur de opie F g9est un onstruteur ppel lorsqu9un ojet doit tre opiF sl est importnt de le d(nir lorsqu9un ojet utilise des pointeurs vers d9utres ojetsF ! ve pointeur this est un pointeur qui existe dns tous les ojetsF sl pointe versF F F l9ojet luiEmmeF

PWS

CHAPITRE 17.

CLASSES ET POINTEURS

PWT

Chapitre

18
Dicult :

L'hritage

ous allons maintenant dcouvrir une des notions les plus importantes de la POO : l'hritage. Qu'on se rassure, il n'y aura pas de mort. ;-) L'hritage est un concept trs important qui reprsente une part non ngligeable de l'intrt de la programmation oriente objet. Bref, cela ne rigole pas. Ce n'est pas le moment de s'endormir au fond, je vous ai l'il ! Dans ce chapitre nous allons rutiliser notre exemple de la classe Personnage, que nous simplierons beaucoup pour nous concentrer uniquement sur ce qui est important. En clair, nous ne garderons que le strict minimum, histoire d'avoir un exemple simple mais que vous connaissez dj. Allez, bon courage : cette notion n'est pas bien dure comprendre, elle est juste trs riche.

PWU

CHAPITRE 18.

L'HRITAGE

Exemple d'hritage simple


ous devez vous dire que le terme  rritge est trnge dns le lngge de l proE grmmtionF wis vous llez le voirD il n9en est rienF elors 9est quoi l9hritge c g9est une tehnique qui permet de rer une lsse prtir d9une utre lsseF ille lui sert de modleD de se de dprtF gel permet d9viter d9voir rrire un mme ode soure plusieurs foisF

Comment reconnatre un hritage ?


g9est la question se poserF gertins ont tellement t trumtiss pr l9hritge qu9ils en voient prtoutD d9utres u ontrire @surtout les dutntsA se demndent hque fois s9il y un hritge fire ou psF ourtnt e n9est ps  mystique D il est trs file de svoir s9il y une reltion d9hritge entre deux lssesF gomment c in suivnt ette rgle trs simple X Il y a hritage quand on peut dire :  A est un B F s de pniqueD e ne sont ps des mthsF it (n de vous persuderzD je vis prendre un exemple trs simple X on peut dire  n guerrier est un personnge ou enore  n mgiien est un personnge F yn peut don d(nir un hritge X  l lsse Guerrier hrite de Personnage D  l lsse Magicien hrite de Personnage F our tre sr que vous ompreniez ienD voii quelques exemples supplmentires et orrets d9hritge X ! une voiture est un vhiule @Voiture hrite de VehiculeA Y ! un us est un vhiule @Bus hrite de VehiculeA Y ! un moineu est un oiseu @Moineau hrite d9OiseauA Y ! un oreu est un oiseu @Corbeau hrite d9OiseauA Y ! un hirurgien est un doteur @Chirurgien hrite de DocteurA Y ! un diplodous est un dinosure @Diplodocus hrite de DinosaureA Y ! etF in revnheD vous ne pouvez ps dire  n dinosure est un diplodous D ou enore  n us est un oiseu F honD dns es s lD on ne peut ps fire d9hritge ouD plus extementD el n9urit uun sens
J'insiste mais il est trs important de respecter cette rgle. Vous risquez de vous retrouver confronts de gros problmes de logique dans vos codes si vous ne le faites pas.

evnt de voir omment rliser un hritge en gCCD il fut que je pose l9exemple sur lequel on v trvillerF PWV

EXEMPLE D'HRITAGE SIMPLE

Notre exemple : la classe Personnage


etit rppel X ette lsse reprsente un personnge d9un jeu vido de type q @jeu de rleAF sl n9est ps nessire de svoir jouer ou d9voir jou un q pour suivre mon exempleF t9i simplement hoisi eluiEl r il est plus ludique que l pluprt des exemples rnts que les profs d9informtique iment utiliser @oitureD filiothequeD niversiteD ompeeisseneF F F AF xous llons un peu simpli(er notre lsse PersonnageF oii e sur quoi je vous propose de prtir X
5ifndef hipiyxxeqi 5define hipiyxxeqi 5inlude `iostremb 5inlude `stringb lss ersonnge { puliX ersonnge@AY void reevoirhegts@int degtsAY void oupheoing@ersonnge 8ileA onstY privteX int mvieY stdXXstring mnomY

}Y

5endif

xotre Personnage un nom et une quntit de vieF yn n9 mis qu9un seul onstruE teurD elui pr dfutF sl permet d9initiliser le Personnage ve un nom et lui donne IHH points de vieF ve Personnage peut reevoir des dgtsD via l mthode recevoirDegats() et en distriuerD via l mthode coupDePoing()F titre informtifD voii l9implmenttion des mthodes dns Personnage.cpp X
5inlude 4ersonngeFh4 using nmespe stdY ersonngeXXersonnge@A X mvie@IHHAD mnom@4tk4A { } void ersonngeXXreevoirhegts@int degtsA { mvie Ea degtsY

PWW

CHAPITRE 18.

L'HRITAGE

} void ersonngeXXoupheoing@ersonnge 8ileA onst { ileFreevoirhegts@IHAY }

ien d9extrordinire pour le momentF

La classe Guerrier hrite de la classe Personnage


sntressonsEnous mintennt l9hritge X l9ide est de rer une nouvelle lsse qui soit une sousElsse de PersonnageF yn dit que ette lsse hrite de PersonnageF our et exempleD je vis rer une lsse Guerrier qui hrite de PersonnageF v d(nition de l lsseD dns Guerrier.hD ressemle ei X
5ifndef hipqisi 5define hipqisi 5inlude 5inlude 5inlude GGxe ps `iostremb `stringb 4ersonngeFh4 oulier d9inlure ersonngeFh pour pouvoir en hriter 3

lss querrier X puli ersonnge GGignifie X rer une lsse querrier qui hrite de l lsse ersonnge { }Y 5endif

qre e qu9on vient de fireD l lsse Guerrier ontiendr de se tous les ttriuts et toutes les mthodes de l lsse PersonnageF hns un tel sD l lsse Personnage est ppele l lsse  wre et l lsse Guerrier l lsse  pille F
Mais quel intrt de crer une nouvelle classe si c'est pour qu'elle contienne les mmes attributs et les mmes mthodes ?

ettendezD justement 3 ve truD 9est qu9on peut rajouter des attributs et des mthodes spciales dans la classe GuerrierF r exempleD on pourrit rjouter une mthode qui ne onerne que les guerriersD du genre frapperCommeUnSourdAvecUnMarteau @on okD 9est un nom de mthode un peu longD je l9voueD mis l9ide est lAF
5ifndef hipqisi 5define hipqisi

QHH

EXEMPLE D'HRITAGE SIMPLE

5inlude `iostremb 5inlude `stringb 5inlude 4ersonngeFh4 lss querrier X puli ersonnge { puliX void frppergommenourdevenwrteu@A onstY GGwthode qui ne onerne que les guerriers }Y 5endif

hmtiquementD on reprsente l sitution omme l (gure IVFIF

Figure IVFI ! n hritge entre lsses

ve shm se lit de s en hutD 9estEEdire que  Guerrier hrite de Personnage F Guerrier est l lsse (lleD Personnage est l lsse mreF yn dit que Guerrier est une  spilistion de l lsse PersonnageF ille possde toutes les rtristiques d9un Personnage @de l vieD un nomD elle peut reevoir des dgtsA mis elle possde en plus des rtristiques propres u Guerrier omme frapperCommeUnSourdAvecU nMarteau()F
Retenez bien que, lorsqu'on fait un hritage, on hrite des mthodes et des attributs. Je n'ai pas reprsent les attributs sur le schma ci-dessus pour viter de le surcharger mais la vie et le nom du Personnage sont bel et bien hrits, ce qui fait qu'un Guerrier possde aussi de la vie et un nom !

QHI

CHAPITRE 18.

L'HRITAGE

ous ommenez omprendre le prinipe c in gCCD qund on deux lsses qui sont lies pr l reltion  est un D on utilise l9hritge pour mettre en videne e lienF n Guerrier  est un Personnage mlior qui possde une mthode supplmentireF ge onept n9 l9ir de rien omme el mis royezEmoiD el fit l di'rene 3 ous n9llez ps trder voir tout e que el de puissnt lorsque vous prtiquerezD plus loin dns le oursF

La classe Magicien hrite aussi de Personnage


nt qu9il n9y qu9un seul hritgeD l9intrt semle enore limitF wis multiplions un peu les hritges et les spilistions et nous llons vite voir tout l9intrt de l hoseF r exempleD si on rit une lsse Magicien qui hrite elle ussi de Personnag e c eprs toutD un Magicien est un PersonnageD don il peut ruprer les mmes proprits de se X de l vieD un nomD donner un oup de poingD etF v di'reneD 9est que le Magicien peut ussi envoyer des sorts mgiquesD pr exemple bouleDeF eu et bouleDeGlaceF our utiliser s mgieD il une rserve de mgie qu9on ppelle  wn @el fit un ttriut rjouterAF und Mana tome zroD il ne peut plus lner de sortF
5ifndef hipweqsgsix 5define hipweqsgsix 5inlude `iostremb 5inlude `stringb 5inlude 4ersonngeFh4 lss wgiien X puli ersonnge { puliX void oulehepeu@A onstY void ouleheqle@A onstY privteX int mmnY

}Y

5endif

te ne vous donne ps l9implmenttion des mthodes @le .cppA iiD je veux juste que vous ompreniez et reteniez le prinipe @(gure IVFPAF xotez queD sur le shmD je n9i reprsent que les mthodes des lsses mis les ttriuts @vieD nomF F F A sont eux ussi hrits 3 it le plus euD 9est qu9on peut fire une lsse qui hrite d9une lsse qui hrite d9une utre lsse 3 smginons qu9il y it deux types de mgiiens X les mgiiens lnsD qui sont des gentils qui envoient des sorts de gurisonD et les mgiiens noirs qui sont des QHP

LA DRIVATION DE TYPE

Figure IVFP ! heux lsses hritent d9une mme lsse

mhnts qui utilisent leurs sorts pour tuer des gens @(gure IVFQAF it el pourrit ontinuer longtemps omme elF ous verrez dns l prohine prtie sur l iliothque gCC t qu9il y souvent inq ou six hritges qui sont fits l suiteF g9est vous dire si 9est utilis 3
1

La drivation de type
smginons le ode suivnt X
ersonnge monersonngeY querrier monquerrierY monersonngeFoupheoing@monquerrierAY monquerrierFoupheoing@monersonngeAY

i vous ompilezD el fontionneF wis si vous tes ttentifsD vous devriez vous demnE der pourquoi el fontionnD pre que normlement el n9urit ps d 3 F F F xonD vous ne voyez ps c ellezD un petit e'ortF oii le prototype de coupDePoing @il est le mme dns l lsse Personnage et dns l lsse GuerrierD rppelezEvousA X
void oupheoing@ersonnge 8ileA onstY
1. Super exemple, j'en suis er.

QHQ

CHAPITRE 18.

L'HRITAGE

Figure IVFQ ! wultiples hritges

QHR

LA DRIVATION DE TYPE

und on fit monGuerrier.coupDePoing(monPersonnage);D on envoie ien en prE mtre un PersonnageF wis qund on fit monPersonnage.coupDePoing(monGuerrie r);D el mrhe ussi et le ompilteur ne hurle ps l mort lors queD selon toute logiqueD il le devrit 3 in e'etD l mthode coupDePoing ttend un Personnage et on lui envoie un GuerrierF ourquoi dile el fontionneEtEil c ih ienF F F 9est justement une proprit trs intressnte de l9hritge en gCC que vous venez de douvrir l X on peut substituer un objet de la classe lle un pointeur ou une rfrence vers un objet de la classe mre. ge qui veut direD dns une utre lngue que le hinoisD qu9on peut fire el X
ersonnge Bmonersonnge@HAY querrier Bmonquerrier a new querrier@AY monersonnge a monquerrierY GG wisFFF misFFF mrhe 3c

ves deux premires lignes n9ont rien d9extrordinire X on re un pointeur Personnage mis H et un pointeur Guerrier qu9on initilise ve l9dresse d9un nouvel ojet de type GuerrierF r ontreD l dernire ligne est ssez surprennteF xormlementD on ne devrait pas pouvoir donner un pointeur de type Personnage un pointeur de type GuerrierF g9est omme mlnger les torhons et les serviettesD el ne se fit psF elors ouiD en temps norml le ompilteur n9epte ps d9hnger des pointeurs @ou des rfrenesA de types di'rentsF wis Personnage et Guerrier ne sont ps n9importe quels types X Guerrier hrite de PersonnageF it l rgle onntreD 9est justement qu9on peut aecter un lment enfant un lment parent 3 in fit 9est logique puisque Guerrier est un PersonnageF
Par contre, l'inverse est faux ! On ne peut pas faire monGuerrier = monPersonnage;. Cela plante et c'est strictement interdit. Attention au sens de l'aectation, donc.

gel nous permet don de pler un lment dns un pointeur @ou une rfreneA de type plus gnrlF g9est trs prtique dns notre s lorsqu9on psse une ile en prmtre X
void oupheoing@ersonnge 8ileA onstY

xotre mthode coupDePoing est ple de fire ml n9importe quel Personnage 3 u9il soit GuerrierD MagicienD MagicienBlancD MagicienNoir ou utreD 9est un Personnage prs toutD don on peut lui donner un coupDePoingF te reonnis que 9est un peu hoqunt u dut mis on se rend ompte qu9en rlitD 9est trs ien fitF gel fontionneD puisque l mthode coupDePoing se ontente d9ppeler des mthodes de l lsse Personnage @recevoirDegatsA et que es mthodes se trouvent forment dns toutes les lsses (lles @GuerrierD MagicienAF i vous ne omprenez psD relisezEmoi et vous devriez sisir pourquoi el fontionneF QHS

CHAPITRE 18.

L'HRITAGE

Eh bien non, moi je ne comprends pas ! Je ne vois pas pourquoi cela marche si on fait objetMere = objetFille;. L on aecte la lle la mre or la lle possde des attributs que la mre n'a pas. Cela devrait coincer ! L'inverse ne serait-il pas plus logique ?

te vous rssureD j9i mis des mois vnt d9rriver omprendre e qui se pssit vriment @omment elD vous n9tes ps rssurs cAF otre erreur est de roire qu9on 'ete l (lle l mre or e n9est ps le s X on sustitue un pointeur @ou une rfreneAF ge n9est ps du tout preilF ves ojets restent omme ils sont dns l mmoireD on ne fit que diriger le pointeur vers l prtie de l (lle qui t hriteF v lsse (lle est onstitue de deux moreux X les ttriuts et mthodes hrites de l mre d9une prtD et les ttriuts et mthodes qui lui sont propres d9utre prtF in fisnt objetMere=objetFille;D on dirige le pointeur objet Mere vers les ttriuts et mthodes hrits uniquement @(gure IVFRAF

Figure IVFR ! v drivtion de type

te peux di0ilement pousser l9explition plus loinD j9espre que vous llez omprendreF inonD ps de pniqueD j9i survu plusieurs mois en progrmmtion gCC sns ien omprendre e qui se pssit et je n9en suis ps mort @mis 9est mieux si vous omE prenez 3AF in tout sD shez que 9est une tehnique trs utiliseD on s9en sert vriment souvent en gCC 3 ous douvrirez el pr l prtiqueD dns l prohine prtie de e livreD en utilisnt tF QHT

HRITAGE ET CONSTRUCTEURS

Hritage et constructeurs
ous vez peutEtre remrqu que je n9i ps enore prl des onstruteurs dns les lsses (lles @GuerrierD MagicienF F F AF g9est justement le moment de s9y intresserF yn sit que Personnage un onstruteur @pr dfutA d(ni omme ei dns le .h X
ersonnge@AY

F F F et son implmenttion dns le .cpp X


ersonngeXXersonnge@A X mvie@IHHAD mnom@4tk4A { }

gomme vous le svezD lorsqu9on re un ojet de type PersonnageD le onstruteur est ppel vnt toute hoseF wis mintenntD que se psseEtEil lorsqu9on re pr exemple un Magicien qui hrite de Personnage c ve Magicien le droit d9voir un onstruteur lui ussi 3 istEe que el ne risque ps d9interfrer ve le onstruteur de Personnage c sl fut pourtnt ppeler le onstruteur de Personnage si on veut que l vie et le nom soient initiliss 3 in fitD les hoses se droule dns l9ordre suivnt X IF ous demndez rer un ojet de type Magicien Y PF ve ompilteur ppelle d9ord le onstruteur de l lsse mre @PersonnageA Y QF uisD le ompilteur ppelle le onstruteur de l lsse (lle @MagicienAF in lirD 9est d9ord le onstruteur du  prent qui est ppelD puis elui du (lsD et ventuellement elui du petitE(ls @s9il y un hritge d9hritgeD omme 9est le s ve MagicienBlancAF

Appeler le constructeur de la classe mre


our ppeler le onstruteur de Personnage en premierD il fut y fire ppel depuis le onstruteur de MagicienF g9est dns un s omme el qu9il est indispensle de se servir de l liste d9initilistion @vous svezD tout e qui suit le symole deuxEpoints dns l9implmenttionAF
wgiienXXwgiien@A X ersonnge@AD mmn@IHHA { }

QHU

CHAPITRE 18.

L'HRITAGE

ve premier lment de l liste d9initilistion indique de fire ppel en premier lieu u onstruteur de l lsse prente PersonnageF uis on rlise les initilistions propres u Magicien @omme l9initilistion du mn IHHAF
Lorsqu'on cre un objet de type Magicien, le compilateur appelle le constructeur par dfaut de la classe mre (celui qui ne prend pas de paramtre).

Transmission de paramtres
ve gros vntge de ette tehnique est que l9on peut  trnsmettre les prmtres du onstruteur de Magicien u onstruteur de PersonnageF r exempleD si le onstruE teur de Personnage prend un nom en prmtreD il fut que le Magicien epte lui ussi e prmtre et le fsse psser u onstruteur de Personnage X
wgiienXXwgiien@string nomA X ersonnge@nomAD mmn@IHHA { }

fien entenduD si on veut que el mrheD il fut ussi surhrger le onstruteur de Personnage pour qu9il epte un prmtre string 3
ersonngeXXersonnge@string nomA X mvie@IHHAD mnom@nomA { }

it voil omment on fit  remonter des prmtres d9un onstruteur un utre pour s9ssurer que l9ojet se re orretementF

Schma rsum
our ien mmoriser e qui se psseD rien de tel qu9un shm rsumnt tout eiD n9estEe ps @(gure IVFSA c sl fut ien entendu le lire dns l9ordre pour en omprendre le fontionnementF yn ommene pr demnder rer un MagicienF  yh mis 9est un ojet se dit le ompilteurD  il fut que j9ppelle son onstruteur F yrD le onstruteur du Magici en indique qu9il fut d9ord ppeler le onstruteur de l lsse prente PersonnageF ve ompilteur v don voir l lsse prente et exute son odeF sl revient ensuite u onstruteur du Magicien et exute son odeF ne fois que tout el est fitD notre ojet merlin devient utilisle et on peut en(n fire suir les pires svies notre ile QHV

HRITAGE ET CONSTRUCTEURS

Figure IVFS ! yrdre d9ppel des onstruteurs

QHW

CHAPITRE 18.

L'HRITAGE

La porte protected
sl me serit vriment impossile de vous prler d9hritge sns vous prler de l porte protectedF etuellementD les portes @ou droits d9sA que vous onnissez dj sont X ! public X les lments qui suivent sont essiles depuis l9extrieur de l lsse Y ! private X les lments qui suivent ne sont ps essiles depuis l9extrieur de l lsseF te vous i en prtiulier donn l rgle fondmentle du gCCD l9enpsultionD qui veut que l9on emphe systmtiquement u monde extrieur d9der ux ttriuts de nos lssesF v porte protected est un utre type de droit d9s que je lsseris entre public @le plus permissifA et private @le plus restritifAF sl n9 de sens que pour les lsses qui se font hriter @les lsses mresA mis on peut l9utiliser sur toutes les lssesD mme qund il n9y ps d9hritgeF oii s signi(tion X les lments qui suivent protected ne sont ps essiles depuis l9extrieur de l lsseD sauf si 9est une lsse (lleF gel veut direD pr exempleD que si l9on met des lments en protected dns l lsse PersonnageD on y ur s dns les lsses (lles Guerrier et MagicienF eve l porte privateD on n9urit ps pu y der 3
En pratique, je donne personnellement toujours la porte protected aux attributs de mes classes. Le rsultat est comparable private (donc cela respecte l'encapsulation) sauf qu'au cas o j'hrite un jour de cette classe, j'aurai aussi directement accs aux attributs. Cela est souvent ncessaire, voire indispensable, sinon on doit utiliser des tonnes d'accesseurs (mthodes getVie(), getMana(), etc.) et cela rend le code bien plus lourd.
lss ersonnge { puliX ersonnge@AY ersonnge@stdXXstring nomAY void reevoirhegts@int degtsAY void oupheoing@ersonnge 8ileA onstY protetedX GGrivD mis essile ux lments enfnts @querrierD wgiienA int mvieY stdXXstring mnomY

}Y

yn peut lors diretement mnipuler l vie et le nom dns tous les lments enfnts de PersonnageD omme Guerrier et Magicien 3 QIH

LE MASQUAGE

Le masquage
erminons e hpitre ve une notion qui nous servir dns l suite X le msqugeF

Une fonction de la classe mre


sl serit intressnt pour notre petit q que nos personnges ient le moyen de se prsenterF gomme 9est une tion que devrient pouvoir rliser tous les personngesD quels que soient leur rleD l fontion sePresenter() v dns l lsse PersonnageF
lss ersonnge { puliX ersonnge@AY ersonnge@stdXXstring nomAY void reevoirhegts@int degtsAY void oupheoing@ersonnge8 ileA onstY void seresenter@A onstY protetedX int mvieY stdXXstring mnomY

}Y

Remarquez le const qui indique que le personnage ne sera pas modi quand il se prsentera. Vous en avez maintenant l'habitude, mais j'aime bien vous rafrachir la mmoire.

it dns le (hier .cpp X


void ersonngeXXseresenter@A onst { out `` 4fonjourD je m9ppelle 4 `` mnom `` 4F4 `` endlY out `` 4t9i enore 4 `` mvie `` 4 points de vieF4 `` endlY }

yn peut don rire un main() omme eluiEi X


int min@A { ersonnge mrel@4wrel4AY mrelFseresenter@AY } return HY

QII

CHAPITRE 18.

L'HRITAGE

ge qui nous donne videmment le rsultt suivnt X


fonjourD je m9ppelle wrelF t9i enore IHH points de vieF

La fonction est hrite dans les classes lles


ous le svez djD un Guerrier est un Personnage etD pr onsquentD il peut gleE ment se prsenterF
int min@A{ querrier lnelot@4vnelot du v4AY lnelotFseresenter@AY } return HY

eve pour rsultt X


fonjourD je m9ppelle vnelot du vF t9i enore IHH points de vieF

tusque lD rien de ien prtiulier ni de di0ileF

Le masquage
smginons mintennt que les guerriers ient une mnire di'rente de se prsenterF sls doivent en plus priser qu9ils sont guerriersF xous llons don rire une version di'rente de l fontion sePresenter()D spilement pour eux X
void querrierXXseresenter@A onst { out `` 4fonjourD je m9ppelle 4 `` mnom `` 4F4 `` endlY out `` 4t9i enore 4 `` mvie `` 4 points de vieF4 `` endlY out `` 4te suis un querrier redoutleF4 `` endlY }

Mais il y aura deux fonctions avec le mme nom et les mmes arguments dans la classe ! C'est interdit !

ous vez tort et risonF heux fontions ne peuvent voir l mme signture @nom et type des rgumentsAF wisD dns le dre des lssesD 9est di'rentF v fontion de l lsse Guerrier remplace elle hrite de l lsse PersonnageF QIP

LE MASQUAGE

i l9on exute le mme main() qu9vntD on otient ette fois le rsultt souhitF
fonjourD je m9ppelle vnelot du vF t9i enore IHH points de vieF te suis un querrier redoutleF

und on rit une fontion qui le mme nom que elle hrite de l lsse mreD on prle de masquageF v fontion hrite de Personnage est msqueD heF
Pour masquer une fonction, il sut qu'elle ait le mme nom qu'une autre fonction hrite. Le nombre et le type des arguments ne joue aucun rle.

g9est ien prtique el 3 und on fit un hritgeD l lsse (lle reoit utomtiE quement toutes les mthodes de l lsse mreF i une de es mthodes ne nous plt psD on l rrit dns l lsse (lle et le ompilteur sur quelle version ppelerF i 9est un GuerrierD il utilise l  version Guerrier de sePresenter() et si 9est un Personnage ou un MagicienD il utilise l version de se @(gure IVFTAF

Figure IVFT ! rinipe du msquge

qrdez ien e shm en mmoireD il nous ser utile u prohin hpitreF

conomiser du code
ge qu9on rit est ien mis on peut fire enore mieuxF i l9on regrdeD l fontion sePresenter() de l lsse Guerrier deux lignes identiques e qu9il y dns l QIQ

CHAPITRE 18.

L'HRITAGE

mme fontion de l lsse PersonnageF yn pourrit don onomiser des lignes de ode en ppelnt l fontion msqueF
conomiser des lignes de code est souvent une bonne attitude adopter, le code est ainsi plus facile maintenir. Et souvenez-vous, tre fainant est une qualit importante pour un programmeur.

yn imerit don rire quelque hose du genre X


void querrierXXseresenter@A onst { ppellfontionmsquee@AY GGgel ffiherit les informtions de se out `` 4te suis un querrier redoutleF4 `` endlY GGit ensuite les informtions spifiques

sl fudrit don un moyen d9ppeler l fontion de l lsse mreF

Le dmasquage
()F

yn imerit ppeler l fontion dont le nom omplet est X Personnage::sePresenter issyons don X
void querrierXXseresenter@A onst { ersonngeXXseresenter@AY out `` 4te suis un querrier redoutleF4 `` endlY }

it 9est mgiqueD el donne extement e que l9on espritF


fonjourD je m9ppelle vnelot du vF t9i enore IHH points de vieF te suis un querrier redoutleF

yn prle dns e s de dmasquageD puisqu9on pu utiliser une fontion qui tit msqueF yn utilis ii l9oprteur :: ppel oprateur de rsolution de porteF sl sert dterminer quelle fontion @ou vrileA utiliser qund il y migut ou si il y plusieurs possiilitsF QIR

LE MASQUAGE

En rsum
! v9hritge permet de spiliser une lsseF ! vorsqu9une lsse hrite d9une utre lsseD elle rupre toutes ses proprits et ses mthodesF ! pire un hritge du sens si on peut dire que l9ojet A  est un ojet BF r exempleD une Voiture  est un VehiculeF ! v lsse de se est ppele lsse mre et l lsse qui en hrite est ppele lsse (lleF ! ves onstruteurs sont ppels dns un ordre ien pris X lsse mreD puis lsse (lleF ! in plus de public et privateD il existe une porte protectedF ille est quivlente private mis elle est un peu plus ouverte X les lsses (lles peuvent elles ussi der ux lmentsF ! i une mthode le mme nom dns l lsse (lle et l lsse mreD 9est l mthode l plus spiliseD elle de l lsse (lleD qui est ppeleF

QIS

CHAPITRE 18.

L'HRITAGE

QIT

Chapitre

19
Dicult :

Le polymorphisme

ous avez bien compris le chapitre sur l'hritage ? C'tait un chapitre relativement dicile. Je ne veux pas vous faire peur mais celui que vous tes en train de lire est du mme acabit. C'est sans doute le chapitre le plus complexe de tout le cours mais vous allez voir qu'il va nous ouvrir de nouveaux horizons trs intressants. Mais au fait, de quoi allons-nous parler ? Le titre est simplement  le polymorphisme , ce qui ne nous avance pas vraiment. Si vous avez fait un peu de grec, vous tes peuttre mme de dcortiquer ce mot.  Poly  signie  plusieurs , comme dans polygone ou polytechnique, et  morphe  signie  forme  comme dans. . . euh. . . amorphe ou zoomorphe. Nous allons donc parler de choses ayant plusieurs formes. Ou, pour utiliser des termes informatiques, nous allons crer du code fonctionnant de direntes manires selon le type qui l'utilise.

QIU

CHAPITRE 19.

LE POLYMORPHISME

Je vous conseille vivement de relire le chapitre sur les pointeurs (page 171) avant de continuer.

La rsolution des liens


gommenons en doueur ve un peu d9hritge tout simpleF ous en vez mrre de notre q c woi ussiF renons un utre exemple pour vrier un peuF ettquons don l rtion d9un progrmme de gestion d9un grge et des vhiules qui y sont sttionnsF smginons que notre (er grgiste she rprer l fois des voitures et des motosF hns son progrmmeD il urit les lsses suivntes X VehiculeD Voiture et MotoF
lss ehiule { puliX void ffihe@A onstY

GGeffihe une desription du ehiule

}Y

protetedX int mprixY GGghque vhiule un prix

lss oiture X puli ehiule GGne oiture i x ehiule { puliX void ffihe@A onstY privteX int mportesY GGve nomre de portes de l voiture GGne woto i x ehiule

}Y

lss woto X puli ehiule { puliX void ffihe@A onstY

}Y

privteX doule mvitesseY GGv vitesse mximle de l moto

v9exemple est ien sr simpli( u mximum X il mnque euoup de mthodesD d9ttriuts insi que les onstruteursF te vous lisse omplter selon vos enviesF ve orps des fontions affiche() est le suivnt X
void ehiuleXXffihe@A onst {

QIV

LA RSOLUTION DES LIENS

out `` 4gei est un vehiuleF4 `` endlY

void oitureXXffihe@A onst { out `` 4gei est une voitureF4 `` endlY } void wotoXXffihe@A onst { out `` 4gei est une motoF4 `` endlY }

ghque lsse 0he don un messge di'rentF it si vous vez ien suivi le hpitre prdentD vous urez remrqu que j9utilise ii le msquge pour red(nir l fontion affiche() de Vehicule dns les deux lsses (llesF issyons don es fontions ve un petit main() tout te X
int min@A { ehiule vY vFffihe@AY woto mY mFffihe@AY } return HY

GGeffihe 4gei est un vehiuleF4 GGeffihe 4gei est une motoF4

te vous invite testerD vous ne devriez rien oserver de prtiulierF wis el v venirF

La rsolution statique des liens


grons une fontion supplmentire qui reoit en prmtre un Vehicule et modi(ons le main() (n d9utiliser ette fontion X
void presenter@ehiule vA { vFffihe@AY } int min@A { ehiule vY presenter@vAY woto mY GGrsente le vhiule pss en rgument

QIW

CHAPITRE 19.

LE POLYMORPHISME

presenter@mAY } return HY

A prioriD rien n9 hngF ves messges 0hs devrient tre les mmesF oyons el X
gei est un vehiuleF gei est un vehiuleF

ve messge n9est ps orret pour l moto 3 g9est omme siD lors du pssge dns l fontionD l vrie nture de l moto s9tit perdue et qu9elle tit redevenue un simple vhiuleF
Comment est-ce possible ?

gomme il y une reltion d9hritgeD nous svons qu9une moto est un vhiuleD un vhiule mlior en quelque sorte puisqu9il possde un ttriut supplmentireF v fontion presenter() reoit en rgument un VehiculeF ge peut tre un ojet relleE ment de type Vehicule mis ussi une Voiture ouD omme dns l9exempleD une MotoF ouvenezEvous de l drivtion de type introduite u hpitre prdentF ge qui est importnt 9est queD pour le ompilteurD l9intrieur de l fontionD on mnipule un VehiculeF eu importe s vrie ntureF sl v don ppeler l  version Vehicule de l mthode afficher() et ps l  version Moto omme on urit pu l9esprerF hns l9exemple du hpitre prdentD 9est l onne version qui tit ppele puisqueD l9intrieur de l fontionD le ompilteur svit s9il vit 'ire un simple personnge ou un guerrierF siD dns l fontion presenter()D ps moyen de svoir e que sont rellement les vhiules reus en rgumentF in termes tehniquesD on prle de rsolution statique des liensF v fontion reoit un VehiculeD 9est don toujours l  version Vehicule des mthodes qui ser utiliseF
C'est le type de la variable qui dtermine quelle fonction membre appeler et non sa vraie nature.

wis vous vous doutez ien queD si je vous prle de tout elD 9est qu9il y un moyen de hnger e omportementF

La rsolution dynamique des liens


ge qu9on imeritD 9est que l fontion presenter() ppelle l onne version de l mthodeF g9estEEdire qu9il fut que l fontion onnisse l vrie nture du VehiculeF g9est e qu9on ppelle l rsolution dynamique des liensF vors de l9exutionD le progrmme utilise l onne version des mthodes r il sit si l9ojet est de type mre ou de type (lleF QPH

LES FONCTIONS VIRTUELLES

our fire elD il fut deux ingrdients X ! utiliser un pointeur ou une rfrene Y ! utiliser des mthodes virtuellesF
Si ces deux ingrdients ne sont pas runis, alors on retombe dans le premier cas et l'ordinateur n'a aucun moyen d'appeler la bonne mthode.

Les fonctions virtuelles


te vous i donn l liste des ingrdientsD llonsEy pour l prprtion du menuF gomE menons pr les mthodes virtuellesF

Dclarer une mthode virtuelle. . .


gel l9ir e'rynt en le lisnt mis 9est trs simpleF sl su0t d9jouter le motEl virtual dns le prototype de l lsse @dns le (hier .h donAF our notre grgeD el donne X
lss ehiule { puliX virtul void ffihe@A onstY

GGeffihe une desription du ehiule

}Y

protetedX int mprixY GGghque vhiule un prix

lss oitureX puli ehiule GGne oiture i x ehiule { puliX virtul void ffihe@A onstY privteX int mportesY GGve nomre de portes de l voiture

}Y

lss woto X puli ehiule GGne woto i x ehiule { puliX virtul void ffihe@A onstY privteX doule mvitesseY GGv vitesse mximle de l moto

}Y

QPI

CHAPITRE 19.

LE POLYMORPHISME

Il n'est pas ncessaire de mettre  virtual  devant les mthodes des classes lles. Elles sont automatiquement virtuelles par hritage. Personnellement, je prfre le mettre pour me souvenir de leur particularit.

tusque lD rien de ien di0ileF xotez ien qu9il n9est ps nessire que toutes les mthodes soient virtuellesF ne lsse peut trs ien proposer des fontions  normles et d9utres virtuellesF
Il ne faut pas mettre virtual dans le chier .cpp mais uniquement dans le .h. Si vous essayez, votre compilateur se vengera en vous insultant copieusement !

. . . et utiliser une rfrence


ve deuxime ingrdient est un pointeur ou une rfreneF ous tes ertinement omme moiD vous prfrez l simpliit etD pr onsquentD les rfrenesF yn ne v qund mme ps s9emter ve des pointeurs juste pour le plisirF rivons don l fontion pre senter() ve omme rgument une rfreneF
void presenter@ehiule onst8 vA { vFffihe@AY } GGrsente le vhiule pss en rgument

int min@A GGien n9 hng dns le min@A { ehiule vY presenter@vAY woto mY presenter@mAY } return HY

J'ai aussi ajout un const. Comme on ne modie pas l'objet dans la fonction, autant le faire savoir au compilateur et au programmeur en dclarant la rfrence constante.

oilF sl ne nous reste plus qu9 tester X


gei est un vehiuleF gei est une motoF

QPP

LES MTHODES SPCIALES

gel mrhe 3 v fontion presenter() ien ppel l onne version de l mthodeF in utilisnt des fontions virtuelles insi qu9une rfrene sur l9ojetD l fontion pres enter() pu orretement hoisir l mthode ppelerF yn urit otenu le mme omportement ve des pointeurs l ple des rfrenesD omme sur le shm IWFIF

Figure IWFI ! pontions virtuelles et pointeurs

n mme moreu de ode eu deux omportements di'rents suivnt le type pss en rgumentF g9est don du polymorphismeF yn dit ussi que les mthodes affiche() ont un comportement polymorphiqueF

Les mthodes spciales


fonD ssez prlF mon tour de vous poser une petite question de thorie X
Quelles sont les mthodes d'une classe qui ne sont jamais hrites ?

v rponse est simple X ! tous les onstruteurs Y ! le destruteurF ous viez trouv c g9est ienF outes les utres mthodes peuvent tre hrites et peuvent voir un omportement polymorphique si on le souhiteF wis qu9en estEil pour es mthodes spiles c QPQ

CHAPITRE 19.

LE POLYMORPHISME

Le cas des constructeurs


n onstruteur virtuel EtEil du sens c xon 3 und je veux onstruire un vhiule quelonqueD je sis lequel je veux onstruireF te peux don l ompiltion dj svoir quel vhiule onstruireF te n9i ps esoin de rsolution dynmique des liens etD pr onsquentD ps esoin de virtulitF Un constructeur ne peut pas tre virtuel. it el v mme plus loinF und je suis dns le onstruteurD je sis quel type je onstruisD je n9i don nouveu ps esoin de rsolution dynmique des liensF h9o l rgle suivnte X on ne peut pas appeler de mthode virtuelle dans un constructeur. Si
on essaye quand mme, la rsolution dynamique des liens ne se fait pas.

Le cas du destructeur
siD 9est un petit peu plus ompliquF F F mlheureusementF grons un petit progrmme utilisnt nos vhiules et des pointeursD puisque 9est un des ingrdients du polymorphismeF
int min@A { ehiule Bv@HAY v a new oitureY GGyn re une oiture et on met son dresse dns un pointeur de ehiule vEbffihe@AY GGyn ffihe 4gei est une voitureF4 delete vY } return HY GGit on dtruit l voiture

xous vons un pointeur et une mthode virtuelleF v ligne v->affiche() 0he don le messge que l9on souhititF ve prolme de e progrmme se situe u moment du d eleteF xous vons un pointeur mis l mthode ppele n9est ps virtuelleF g9est don le destruteur de Vehicule qui est ppel et ps elui de Voiture 3 hns e sD el ne porte ps vriment onsqueneD le progrmme ne plnte psF wis imginez que vous deviez rire une lsse pour le mniement des moteurs letriques d9un rootF i 9est le muvis destruteur qui est ppelD vos moteurs ne s9rrteront peutEtre psF gel peut vite devenir drmtiqueF sl fut don imprtivement ppeler le on destruteurF it pour e fireD une seule solution X rendre le destruteur virtuel 3 gel nous permet de formuler une nouvelle rgle importnte X un destructeur doit toujours tre virtuel si on utilise le polymorphisme. QPR

LES MTHODES SPCIALES

Le code amlior
ejoutons don des onstruteurs et des destruteurs nos lssesF out ser lors orretF
lss ehiule { puliX ehiule@int prixAY GGgonstruit un vhiule d9un ertin prix virtul void ffihe@A onstY virtul ~ehiule@AY GGemrquez le 9virtul9 ii protetedX int mprixY

}Y

lss oitureX puli ehiule { puliX oiture@int prixD int portesAY GGgonstruit une voiture dont on fournit le prix et le nomre de portes virtul void ffihe@A onstY virtul ~oiture@AY privteX int mportesY

}Y

lss woto X puli ehiule { puliX woto@int prixD doule vitessewxAY GGgonstruit une moto d9un prix donn et ynt une ertine vitesse mximle virtul void ffihe@A onstY virtul ~woto@AY privteX doule mvitesseY

}Y

gopier e ode gode we X QVTVIV  sl fut ien sr glement omplter le (hier soure X
ehiuleXXehiule@int prixA Xmprix@prixA {} void ehiuleXXffihe@A onst

QPS

CHAPITRE 19.

LE POLYMORPHISME

GGt9en profite pour modifier un peu les fontions d9ffihge { out `` 4gei est un vehiule outnt 4 `` mprix `` 4 eurosF4 `` endlY } ehiuleXX~ehiule@A GGwme si le destruteur ne fit rienD on doit le mettre 3 {} oitureXXoiture@int prixD int portesA Xehiule@prixAD mportes@portesA {} void oitureXXffihe@A onst { out `` 4gei est une voiture ve 4 `` mportes `` 4 et outnt 4 `` mprix `` 4 eurosF4 `` endlY } oitureXX~oiture@A {} wotoXXwoto@int prixD doule vitessewxA Xehiule@prixAD mvitesse@vitessewxA {} void wotoXXffihe@A onst { out `` 4gei est une moto llnt 4 `` mvitesse `` 4 kmGh et outnt 4 `` mprix `` 4 eurosF4 `` endlY } wotoXX~woto@A {}

gopier e ode gode we X QVTVHR  xous sommes don prts order un exemple onret d9utilistion du polymorphismeF etthez vos eintures 3

Les collections htrognes


te vous i dit tout u dut du hpitre que nous voulions rer un progrmme de gestion d9un grgeF r onsquentD nous llons devoir grer une olletion de voitures et de motosF xous ferons don ppel F F F des tleux dynmiques 3
vetor`oitureb listeoituresY vetor`wotob listewotosY

QPT

LES COLLECTIONS HTROGNES

fien 3 wis ps optimlF i notre mi grgiste ommene reevoir des ommndes pour des sootersD des mionsD des fourgonsD des vlosD etF il v flloir dlrer euE oup de vetorsF gel veut dire qu9il v flloir pporter de grosses modi(tions u ode hque pprition d9un nouveu type de vhiuleF

Le retour des pointeurs


sl serit ien plus judiieux de mettre le tout dns un seul tleu 3 gomme les motos et les voitures sont des vhiulesD on peut dlrer un tleu de vhiules et mettre des motos dednsF wis si nous prodons insiD nous llons lors perdre l vrie nture des ojetsF ouvenezEvous des deux ingrdients du polymorphisme 3 sl nous fut don un tleu de pointeurs ou un tleu de rfrenesF yn ne peut ps rer un tleu de rfrenes D nous llons don devoir utiliser des pointeursF ous vous rppelez du hpitre sur les pointeurs c te vous vis prsent trois s d9utilistionsF in voii don un qutrimeF t9espre que vous ne m9en voulez ps trop de ne ps en voir prl vntF F F
1

int min@A { vetor`ehiuleBb listeehiulesY return HY }

g9est e qu9on ppelle une collection htrogne puisqu9elle ontientD d9une ertine mnireD des types di'rentsF

Utiliser la collection
gommenons pr remplir notre tleuF gomme nous llons der nos vhiules uniquement via les pointeursD nous n9vons ps esoin d9tiquettes sur nos ojets et nous pouvons utiliser l9llotion dynmique pour les rerF in plusD el nous permet d9voir diretement un pointeur mettre dns notre vetorF
int min@A { vetor`ehiuleBb listeehiulesY listeehiulesFpushk@new oiture@ISHHHD SAAY GGt9joute m olletion de vhiules une voiture GGlnt ISHHH euros et ynt S portes listeehiulesFpushk@new oiture@IPHHHD QAAY GGFFF listeehiulesFpushk@new woto@PHHHD PIPFSAAY GGne moto PHHH euros llnt PIPFS kmGh
1. Rappelez-vous, les rfrences ne sont que des tiquettes.

QPU

CHAPITRE 19.

LE POLYMORPHISME

GGyn utilise les voitures et les motos } return HY

v (gure IWFP reprsente notre tleuF

Figure IWFP ! ne olletion htrogne

ves voitures et motos ne sont ps rellement dns les sesF ge sont des pointeursF wis en suivnt les )hesD on de ux vhiulesF fien 3 wis nous venons de fire une grosse fute 3 ghque fois que l9on utilise newD il fut utiliser delete pour vider l mmoireF xous llons don devoir fire ppel une oule pour lirer l mmoire lloueF
int min@A { vetor`ehiuleBb listeehiulesY listeehiulesFpushk@new oiture@ISHHHD SAAY listeehiulesFpushk@new oiture@IPHHHD QAAY listeehiulesFpushk@new woto@PHHHD PIPFSAAY GGyn utilise les voitures et les motos for@int i@HAY i`listeehiulesFsize@AY CCiA { delete listeehiulesiY GGyn lire l iEme se mmoire lloue listeehiulesi a HY GGyn met le pointeur H pour viter les souis } } return HY

QPV

LES COLLECTIONS HTROGNES

sl ne nous reste plus qu9 utiliser nos ojetsF gomme 9est un exemple siqueD ils ne svent fire qu9une seule hose X 0her des informtionsF wis essyons qund mme 3
int min@A { vetor`ehiuleBb listeehiulesY listeehiulesFpushk@new oiture@ISHHHD SAAY listeehiulesFpushk@new oiture@IPHHHD QAAY listeehiulesFpushk@new woto@PHHHD PIPFSAAY listeehiulesHEbffihe@AY GGyn ffihe les informtions de l premire voiture listeehiulesPEbffihe@AY GGit elles de l moto for@int i@HAY i`listeehiulesFsize@AY CCiA { delete listeehiulesiY GGyn lire l iEme se mmoire lloue listeehiulesi a HY GGyn met le pointeur H pour viter les souis } } return HY

te vous inviteD omme toujoursD testerF oii e que vous devriez otenir X
gei est une voiture ve S portes vlnt ISHHH eurosF gei est une moto llnt PIPFS kmGh et vlnt PHHH eurosF

ge sont les onnes versions des mthodes qui sont ppeles 3 gel ne devrit ps tre une surprise e stdeF xous vons des pointeurs @ingrdient IA et des mthodes virtuelles @ingrdient PAF te vous propose d9mliorer un peu e ode en joutnt les lments suivnts X ! ne lsse Camion qui ur omme ttriut le poids qu9il peut trnsporterF ! n ttriut reprsentnt l9nne de frition du vhiuleF ejoutez ussi des mE thodes pour 0her ette informtionF ! ne lsse Garage qui ur omme ttriut le vector<Vehicule*> et proposerit des mthodes pour jouterGsupprimer des vhiules ou pour 0her des informtions sur tous les lments ontenusF ! ne mthode nbrRoues() qui renvoie le nomre de roues des di'rents vhiulesF eprs e lger entrnementD terminons e hpitre ve une volution de notre petit progrmmeF QPW

CHAPITRE 19.

LE POLYMORPHISME

Les fonctions virtuelles pures


evezEvous essy de progrmmer l mthode nbrRoues() du miniEexerie c i e n9est ps le sD il est enore temps de le fireF ille v euoup nous intresser dns l suiteF

Le problme des roues


gomme 9est un peu rptitifD je vous donne m version de l fontion pour les lsses Vehicule et Voiture uniquementF
lss ehiule { puliX ehiule@int prixAY virtul void ffihe@A onstY virtul int nroues@A onstY virtul ~ehiule@AY protetedX int mprixY

GGeffihe le nomre de roues du vhiule

}Y

lss oiture X puli ehiule { puliX oiture@int prixD int portesAY virtul void ffihe@A onstY virtul int nroues@A onstY GGeffihe le nomre de roues de l voiture virtul ~oiture@AY privteX int mportesY

}Y

hu t du .hD ps de souiF g9est le orps des fontions qui risque de poser prolmeF
int ehiuleXXnroues@A onst { GGue mettre ii cccc } int oitureXXnroues@A onst { return RY }

ous l9urez omprisD on ne sit ps vriment quoi mettre dns l  version Vehicu le de l mthodeF ves voitures ont R roues et les motos P misD pour un vhiule QQH

LES FONCTIONS VIRTUELLES PURES

en gnrlD on ne peut rien dire 3 yn imerit ien ne rien mettre ii ou rrment supprimer l fontion puisqu9elle n9 ps de sensF wis si on ne dlre ps l fontion dns l lsse mreD lors on ne pourr ps l9utiliser depuis notre olletion htrogneF sl nous fut don l grder ou u minimum dire qu9elle existe mis qu9on n9 ps le droit de l9utiliserF yn souhiterit insi dire u ompilteur X  hns toutes les classes lles de VehiculeD il y une fontion nomme nbrRoues() qui renvoie un int et qui ne prend uun rgument misD dns l lsse VehiculeD ette fontion n9existe psF g9est e qu9on ppelle une mthode virtuelle pureF our dlrer une telle mthodeD rien de plus simpleF sl su0t d9jouter  a H l (n du prototypeF
lss ehiule { puliX ehiule@int prixAY virtul void ffihe@A onstY virtul int nroues@A onst a HY GGeffihe le nomre de roues du vhiule virtul ~ehiule@AY protetedX int mprixY

}Y

it videmmentD on n9 rien rire dns le .cpp puisqueD justementD on ne sit ps quoi y mettreF yn peut rrment supprimer ompltement l mthodeF v9importnt tnt que son prototype soit prsent dns le .hF

Les classes abstraites


ne lsse qui possde u moins une mthode virtuelle pure est une classe abstraiteF xotre lsse Vehicule est don une lsse striteF ourquoi donner un nom spil es lsses c ih ien pre qu9elles ont une rgle ien prtiulire X on ne peut pas crer d'objet partir d'une classe abstraiteF yuiD ouiD vous vez ien lu 3 v ligne suivnte ne ompiler psF
ehiule v@IHHHHAY GGgrtion d9un vhiule vlnt IHHHH eurosF

hns le jrgon des progrmmeursD on dit qu9on ne peut ps rer d9instne d9une lsse striteF v rison en est simple X si je pouvis rer un VehiculeD lors je pourris essyer d9ppeler l fontion nbrRoues() qui n9 ps de orps et ei n9est ps possileF r ontreD je peux tout fit rire le ode suivnt X
int min@A { ehiuleB ptr@HAY GGn pointeur sur un vhiule

QQI

CHAPITRE 19.

LE POLYMORPHISME

oiture isse@PHHHHDSAY GGyn re une voiture GGgei est utoris puisque toutes les fontions ont un orps ptr a 8isseY GGyn fit pointer le pointeur sur l voiture out `` ptrEbnroues@A `` endlY GGhns l lsse filleD nroues@A existeD ei est don utoris } return HY

siD l9ppel l mthode nbrRoues() est polymorphique puisque nous vons un pointeur et que notre mthode est virtuelleF g9est don l  version Voiture qui est ppeleF hon mme si l  version Vehicule n9existe psD il n9y ps de prolmesF i l9on veut rer une nouvelle sorte de Vehicule @Camion pr exempleAD on ser olig de red(nir l fontion nbrRoues()D sinon ette dernire ser virtuelle pure pr hritge etD pr onsquentD l lsse ser strite elle ussiF yn peut rsumer les fontions virtuelles de l mnire suivnte X ! une mthode virtuelle peut tre red(nie dns une lsse (lle Y ! une mthode virtuelle pure doit tre red(nie dns une lsse (lleF hns l iliothque tD que nous llons trs ientt orderD il y euoup de lsses stritesF sl existe pr exemple une lsse pr sorte de outonD 9estEEdire une lsse pour les outons normuxD une pour les ses oherD etF outes es lsses hritent d9une lsse nomme QAbstractButtonD qui regroupe des proprits ommunes tous les outons @tilleD texteD etFAF wis omme on ne veut ps utoriser les utilisteurs mettre des QAbstractButton sur leurs fentresD les rteurs de l iliothque ont rendu ette lsse striteF

En rsum
! ve polymorphisme permet de mnipuler des ojets d9une lsse (lle via des pointeurs ou des rfrenes sur une lsse mreF ! heux ingrdients sont nessires X des fontions virtuelles et des pointeurs ou rfE renes sur l9ojetF ! i l9on ne sit ps quoi mettre dns le orps d9une mthode de l lsse mreD on peut l dlrer virtuelle pureF ! ne lsse ve des mthodes virtuelles pures est dite striteF yn ne peut ps rer d9ojet prtir d9une telle lsseF

QQP

Chapitre

20
Dicult :

Elments statiques et amiti

ous tenez le coup ? Courage, vos eorts seront bientt largement rcompenss. Ce chapitre va d'ailleurs vous permettre de souer un peu. Vous allez dcouvrir quelques notions spciques aux classes en C++ : les attributs et mthodes statiques, ainsi que l'amiti. Ce sont ce que j'appellerais des  points particuliers  du C++. Ce ne sont pas des dtails pour autant, ce sont des choses connatre. Car oui, tout ce que je vous apprends l, vous allez en avoir besoin et vous allez largement le rutiliser. Je suis sr aussi que vous en comprendrez mieux l'intrt lorsque vous pratiquerez pour de bon. N'allez pas croire que les programmeurs ont invent des trucs un peu complexes comme cela, juste pour le plaisir de programmer de faon tordue. . .

QQQ

CHAPITRE 20.

ELMENTS STATIQUES ET AMITI

Les mthodes statiques


ves mthodes sttiques sont un peu spilesF F F ge sont des mthodes qui pprtiennent l lsse mis ps ux ojets instnis prtir de l lsseF in fitD e sont de tes  fontions rnges dns des lsses qui n9ont ps s ux ttriuts de l lsseF illes s9utilisent d9une mnire un peu prtiulireF te pense que le mieux est enore un exemple 3

Crer une mthode statique


hns le .hD le prototype d9une mthode sttique ressemle ei X
lss wglsse { puliX wglsse@AY stti void mwethode@AY }Y

on implmenttion dns le .cpp ne possde ps en revnhe de motEl static X


void wglsseXXmwethode@A GGxe ps remettre 9stti9 dns l9implmenttion { out `` 4fonjour 34 `` endlY }

insuiteD dns le main()D l mthode sttique s9ppelle omme ei X


int min@A { wglsseXXmwethode@AY } return HY

Mais. . . on n'a pas cr d'objet de type MaClasse et on appelle la mthode quand mme ? C'est quoi ce bazar ?

g9est justement elD l prtiulrit des mthodes sttiquesF our les utiliserD ps esoin de rer un ojetF sl su0t de fire prder le nom de l mthode du nom de l lsse suivi d9un doule deuxEpointsF h9o le X MaClasse::maMethode(); gette mthodeD omme je vous le disisD ne peut ps der ux ttriuts de l lsseF g9est vriment une te fontion mis range dans une classeF gel permet de regrouper les fontions dns des lssesD pr thmeD et ussi d9viter des on)its de nomF QQR

LES ATTRIBUTS STATIQUES

Quelques exemples de l'utilit des mthodes statiques


ves mthodes sttiques peuvent vous prtre un tntinet stupidesF in e'etD quoi on voir invent le modle ojet si 9est pour utoriser les gens rer de tes fontions regroupes dns des lsses c v rponseD 9est qu9on toujours esoin d9utiliser de  tes fontionsD mme en modle ojetD et pour tre un peu ohrentD on les regroupe dns des lsses en prisnt qu9elles sont sttiquesF sl y en e'et des fontions qui ne nessitent ps de rer un ojetD pour lesquelles el n9urit ps de sensF hes exemples c ! sl existe dns l iliothque t une lsse QDate qui permet de mnipuler des dtesF yn peut omprer des dtes entre elles @surhrge d9oprteurA etF gette lsse propose ussi un ertin nomre de mthodes sttiquesD omme currentDate() qui renvoie l dte tuelleF s esoin de rer un ojet pour voir ette informtion 3 sl su0t don de tper QDate::currentDate() pour ruprer l dte tuelleF ! oujours ve tD l lsse QDirD qui permet de mnipuler les dossiers du disque durD propose quelques mthodes sttiquesF r exempleD on trouve QDir::drives() qui renvoie l liste des disques prsents sur l9ordinteur @pr exemple  g X D  h X D etFAF v enoreD el n9urit ps d9intrt d9instnier un ojet prtir de l lsse r e sont des informations gnralesF ! etF t9espre que el vous donne envie de trviller ve t pre que l prtie suivnte de e livre y est onsre 3 YEA

Les attributs statiques


sl existe ussi e qu9on ppelle des attributs statiquesF out omme les mthodes sttiquesD les ttriuts sttiques pprtiennent l lsse et non ux ojets rs prtir de l lsseF

Crer un attribut statique dans une classe


g9est ssez simple en fit X il su0t de rjouter le motEl static u dut de l ligneF n ttriut staticD ien qu9il soit essile de l9extrieurD peut trs ien tre dlr private ou protectedF eppelez el une exeptionD r 9en est ien uneF ixemple X
lss wglsse { puliX wglsse@AY privteX

QQS

CHAPITRE 20.

ELMENTS STATIQUES ET AMITI

stti int monettriutY }Y

uf qu9on ne peut ps initiliser l9ttriut sttique iiF sl fut le fire dns l9espe glolD 9estEEdire en dehors de toute lsse ou fontionD en dehors du main() notammentF
GGsnitiliser l9ttriut en dehors de toute fontion ou lsse @espe glolA int wglsseXXmonettriut a SY

Cette ligne se met gnralement dans le chier .cpp de la classe.

n ttriut dlr omme sttique se omporte omme une vrile gloleD 9estEE dire une vrile essile prtout dns le odeF
Il est trs tentant de dclarer des attributs statiques pour pouvoir accder partout ces variables sans avoir les passer en argument de fonctions, par exemple. C'est gnralement une mauvaise chose car cela pose de gros problmes de maintenance. En eet, comme l'attribut est accessible de partout, comment savoir quel moment il va tre modi ? Imaginez un programme avec des centaines de chiers dans lequel vous devez chercher l'endroit qui modie cet attribut ! C'est impossible. N'utilisez donc des attributs statiques que si vous en avez rellement besoin.

ne des utilistions les plus ourntes des ttriuts sttiques est l rtion d9un ompE teur d9instnesF sl rrive prfois que l9on it esoin de onntre le nomre d9ojets d9une lsse donne qui ont t rsF our y rriverD on re lors un ttriut sttique compteur que l9on initilise zroF yn inrmente ensuite e ompteur dns les onstruteurs de l lsse etD ien srD on le drmente dns le destruteurF
lss ersonnge { puliX ersonnge@string nomAY GGlein de mthodesFFF ~ersonnge@AY privteX string mnomY stti int ompteurY

QQT

L'AMITI

it tout se psse ensuite dns le .cpp orrespondnt X


int ersonngeXXompteur a HY GGyn initilise notre ompteur H ersonngeXXersonnge@string nomA Xmnom@nomA { CCompteurY GGund on re un personngeD on joute I u ompteur } ersonngeXX~ersonnge@A { EEompteurY GGit on enlve I u ompteur lors de l destrution }

yn peut lors tout instnt onntre le nomre de personnges prsents dns le jeu en onsultnt l vleur de l9ttriut Personnage::compteurF
int min@A { GGyn re deux personnges ersonnge golith@4qolith le tenereux4AY ersonnge lnelot@4vnelot le preux4AY GGit on onsulte notre ompteur out `` 4sl y tuellement 4 `` ersonngeXXompteur `` 4 personnges en jeuF4 `` endlY return HY }

imple et e0e non c ous verrez d9utres exemples d9ttriuts sttiques dns l suiteF ge n9est ps el qui mnque en gCCF

L'amiti
ous svez rer des lsses mresD des lsses (llesD des lsses petitesE(llesD etF X un vri rre gnlogiqueD en quelque sorteF wis en yyD omme dns l vieD il n9y ps que l fmilleD il y ussi les misF

Qu'est-ce que l'amiti ?


 hns les lngges orients ojetD l9miti est le fit de donner un s omplet ux lments d9une lsseF hon si je dlre une fontion f mie de l lsse AD l fontion f pourr modi(er les ttriuts de l lsse A mme si les attributs sont privs ou protgsF v fontion f pourr glement utiliser les fontions prives et protges de l lsse AF QQU

CHAPITRE 20.

ELMENTS STATIQUES ET AMITI

yn dit lors que la fonction f est amie de la classe AF in dlrnt une fontion mie d9une lsseD on sse ompltement l9enpsultion de l lsse puisque quelque hose d9extrieur l lsse pourr modi(er e qu9elle ontientF sl ne fut don ps user de l9mitiF te vous i expliqu ds le dut que l9enpsultion tit l9lment le plus importnt en yy et voil que je vous prsente un moyen de dtourner e oneptF te suis d9ord ve vousD 9est ssez prdoxlF ourtntD utiliser bon escient l9miti peut renforer l9enpsultionF oyons omment 3

Retour sur la classe Duree


our vous prsenter l surhrge des oprteursD j9i utilis l lsse Duree dont le ut tit de reprsenter l notion d9intervlle de tempsF oii le prototype de l lsse X
lss huree { puliX huree@int heures a HD int minutes a HD int seondes a HAY void ffihe@ostrem8 outA onstY GGermet d9rire l dure dns un flux privteX int mheuresY int mminutesY int mseondesY

}Y

GGurhrge de l9oprteur `` pour l9riture dns les flux GGtilise l mthode ffihe@A de huree ostrem 8opertor``@ ostrem 8outD huree onst8 duree AY

te ne vous i mis que l9essentielF sl y vit ien plus d9oprteurs dlrs l (n du hpitreF ge qui v nous intresserD 9est l surhrge de l9oprteur d9injetion dns les )uxF oii e que nous vions rit X
ostrem 8opertor``@ ostrem 8outD huree onst8 duree A { dureeFffiher@outA Y return outY }

it 9est trs souvent l meilleure solution 3 wis ps toujoursF F F in e'etD en fisnt elD vous vez esoin d9rire une mthode affiche() dns l lsseD 9estEEdire que votre lsse v fournir un servie supplmentireF ous llez jouter un levier en plus en surfe de votre lsse @(gure PHFIAF QQV

L'AMITI

Figure PHFI ! xotre lsse fournit un servie supplmentire d90hge

uf que e levier n9est destin qu9 l9oprteur << et ps u reste du mondeF sl y don une mthode dns l lsse quiD d9une ertine mnireD ne sert rien pour un utilisteur normlF hns e sD el ne porte ps vriment onsqueneF i quelqu9un utilise l mthode affiche()D lors rien de dngereux pour l9ojet ne se psseF wis dns d9utres sD il pourrit tre risqu d9voir une mthode qu9il ne fut surtout ps utiliserF g9est omme dns les lortoiresD si vous vez un gros outon rouge ve un riteu indiqunt  xe surtout ps ppuyer D vous pouvez tre srs que quelqu9un vD un jourD fire l9erreur d9ppuyer dessusF ve mieux serit don de ne ps lisser pprtre e levier en surfe de notre ueEojetF ge qui revient mettre l mthode affiche() dns l prtie prive de l lsseF
lss huree { puliX huree@int heures a HD int minutes a HD int seondes a HAY privteX void ffihe@ostrem8 outA onstY int mheuresY int mminutesY int mseondesY GGermet d9rire l dure dns un flux

}Y

QQW

CHAPITRE 20.

ELMENTS STATIQUES ET AMITI

in fisnt elD plus de risque d9ppeler l mthode pr erreurF r ontreD l9oprteur << ne peut plusD lui non plusD l9utiliserF g9est l que l9miti intervientF i l9oprteur  est dlr mi de l lsse DureeD il ur s l prtie prive de l lsse etD pr onsquentD l mthode affiche()F

Dclarer une fonction amie d'une classe


Interro surprise d'anglais. Comment dit-on  ami  en anglais ?

 priend D extement 3 it omme les rteurs du gCC ne voulient ps se sser l tte ve les noms ompliqusD ils ont pris omme motEl friend pour l9mitiF h9illeurs si vous tpez e mot dns votre shiD il devrit s9rire d9une ouleur di'E renteF our dlrer une fontion mie d9une lsseD on utilise l syntxe suivnte X
friend stdXXostrem8 opertor`` @stdXXostrem8 fluxD huree onst8 dureeAY

yn rit friend suivi du prototype de l fontion et on ple le tout l9intrieur de l lsse X


lss huree { puliX huree@int heures a HD int minutes a HD int seondes a HAY privteX void ffihe@ostrem8 outA onstY int mheuresY int mminutesY int mseondesY }Y friend stdXXostrem8 opertor`` @stdXXostrem8 fluxD huree onst8 dureeAY GGermet d9rire l dure dns un flux

Vous pouvez mettre le prototype de la fonction dans la partie publique, protge ou prive de la classe, cela n'a aucune importance.

xotre oprteur << mintennt s tout e qui se trouve dns l lsse DureeD sns uune restritionF sl peut don en prtiulier utiliser l mthode affiche()D QRH

L'AMITI

omme prdemmentD suf que dsormisD 9est le seul lment hors de l lsse qui peut utiliser ette mthodeF yn peut utiliser l mme stue pour les oprteurs == et <F in les dlrnt omme mies de l lsse DureeD es fontions pourront der diretement ux ttriuts et l9on peut lors supprimer les mthodes estPlusPetitQue() et estEgal()F te vous lisse essyerF F F

L'amiti et la responsabilit
tre l9mi de quelqu9un ertines onsquenes en mtire de svoirEvivreF te prsume que vous n9llez ps hez vos mis Qh du mtin pour sger leur jrdin pendnt leur sommeilF in gCCD l9miti implique glement que l fontion mie ne viendr ps dtruire l lsse ni sger ses ttriutsF i vous vez esoin d9une fontion qui doit modi(er grndement le ontenu d9une lsseD lors fites plutt une fontion memre de l lsseF os progrmmes devrient respeter les deux rgles suivntes X ! une fontion mie ne doit psD en prinipeD modi(er l9instne de l lsse Y ! les fontions mies ne doivent tre utilises que si vous ne pouvez ps fire utrementF gette deuxime rgle est trs importnteF i vous ne l respetez psD lors utnt rrter l yy r le onept de lsse perd tout son sensF

En rsum
! ne mthode sttique est une mthode qui peut tre ppele diretement sns rer d9ojetF sl s9git en fit d9une fontion lssiqueF ! n ttriut sttique est prtg pr tous les ojets issus d9une mme lsseF ! ne fontion mie d9une lsse peut der tous ses lmentsD mme les lments privsF ! v9miti doit tre utilise ve primonie en gCCD uniquement lorsque el est nessireF

QRI

CHAPITRE 20.

ELMENTS STATIQUES ET AMITI

QRP

Troisime partie

Crez vos propres fentres avec Qt

QRQ

Chapitre

21
Dicult :

Introduction Qt

es amis, le temps n'est plus aux bavardages mais au concret ! Vous trouverez dicilement plus concret que cette partie du cours, qui prsente la cration d'interfaces graphiques (fentres) avec la bibliothque Qt. Pour bien comprendre cette partie, il est vital que vous ayez lu et compris le dbut de ce cours. Si certaines notions de la programmation oriente objet vous sont encore un peu obscures, n'hsitez pas relire les chapitres correspondants. Nous commencerons par dcouvrir ce qu'est Qt concrtement, ce que cette bibliothque permet de faire et quelles sont ses alternatives. Nous verrons ensuite comment installer et congurer Qt.

QRS

CHAPITRE 21.

INTRODUCTION QT

Dis papa, comment on fait des fentres ?


oil une question que vous vous tes tous dj possD j9en suis sr 3 t9en mettris mme m min ouper F
1

Alors alors, comment on programme des fentres ?

houementD ps d9imptieneF i vous llez trop viteD vous risquez de rler des tpes et de vous retrouver loqus prsF elors llezEy progressivement et dns l9ordreD en outnt ien tout e que j9i vous direF

Un mot de vocabulaire connatre : GUI


evnt d9ller plus loinD je voudris vous fire pprendre e petit mot de voulire r je vis le rutiliser tout u long de ette prtie X GUI F g9est l9rvition de Graphical User InterfaceD soit  snterfe utilisteur grphique F gel dsigne tout e qu9on ppelle grossirement  n progrmme ve des fentres F our que vous puissiez ien omprerD voii un progrmme sns qs @(gure PIFIA et un progrmme qs @(gure PIFPAF
2

Figure PIFI ! rogrmme sns qs @onsoleA


1. Et j'y tiens ma main, c'est vous dire ! 2. Prononcez  Goui 

QRT

DIS PAPA, COMMENT ON FAIT DES FENTRES ?

Figure PIFP ! rogrmme ve qsD ii sous indows

Les dirents moyens de crer des GUI


ghque systme d9exploittion @indowsD w y D vinuxF F FA propose u moins un moyen de rer des fentresF F F ve prolmeD 9est justement que e moyen n9est en gnrl ps portableD 9estEEdire que votre progrmme r uniquement pour indows ne pourr fontionner que sous indows et ps illeursF yn grosso modo deux types de hoix X ! soit on rit son pplition spcialement pour l'OS qu9on veutD mis le progrmme ne ser ps portle Y ! soit on utilise une iliothque qui s'adapte tous les OSD 9estEEdire une ilioE thque multiplteformeF v deuxime solution est en gnrl l meilleure r 9est l plus soupleF g9est d9illeurs elle que nous llons hoisir pour que personne ne se sente ndonnF ristoire d9tre ompletD je vis dns un premier temps vous prsenter des iliothques propres ux prinipux yD pour que vous onnissiez u moins leurs nomsF insuiteD nous verrons quelles sont les priniples iliothques multiplteformeF
Les bibliothques propres aux OS

ghque y propose u moins une iliothque qui permet de rer des fentresF ve dfut de ette mthode est qu9en gnrlD ette iliothque ne fontionne que pour l9y pour lequel elle t reF einsiD si vous utilisez l iliothque de indowsD votre progrmme ne mrher que sous indowsF ! Sous Windows X on dispose du frmework FxiF g9est un ensemle trs omplet de iliothques utilisles en gCCD g5D isul fsiF F F ve lngge de prdiletion pour trviller ve Fxi est g5F sl est noter que Fxi peut ussi tre utilis sous vinux @ve quelques limittionsA gre u projet wonoF in sommeD Fxi est un vri outeu suisse pour dvelopper sous indows et on peut ussi fire fontionner les progrmmes sous vinuxD quelques exeptions prsF ! Sous Mac OS X X l iliothque de prdiletion s9ppelle CocoaF yn l9utilise en gnrl en lngge  yjetive g F g9est une iliothque oriente ojetF ! Sous Linux X tous les environnements de ureu @ppels w pour Windows MaQRU

CHAPITRE 21.

INTRODUCTION QT

reposent sur D l se des interfes grphiques de vinuxF propose une iliothque ppele Xlib misD sous vinuxD on progrmme rrement en liF yn prfre employer une iliothque plus simple d9utilistion et multiplteforme omme quC @sous qnomeA ou t @sous uhiAF gomme vous le voyezD il y en gros une iliothque  de se pour hque yF gertinesD omme gooD ne fontionnent que pour le systme d9exploittion pour lequel elles ont t prvuesF sl est gnrlement onseill d9utiliser une iliothque multiplteforme si vous omptez distriuer votre progrmme un grnd nomre de personnesF
Les bibliothques multiplateforme

nagers A

ves vntges d9utiliser une iliothque multiplteforme sont nomreux F ! out d9ordD elles simpli(ent grndement l rtion d9une fentreF sl fut gnrE lement euoup moins de lignes de ode pour ouvrir une  simple fentreF ! insuiteD elles uniformisent le toutD elles forment un ensemle ohrent dns lequel il est file de s9y retrouverF ves noms des fontions et des lsses sont hoisis de fon logique de mnire vous ider utnt que possileF ! in(nD elles font strtion du systme d9exploittion mis ussi de l version du systmeF gel veut dire que si demin goo esse d9tre utilisle sous w y D votre pplition ontinuer fontionner r l iliothque multiplteforme s9dpter ux hngementsF frefD hoisir une iliothque multiplteformeD e n9est ps seulement pour que le progrmme mrhe prtout mis ussi pour tre sr qu9il mrher tout le temps et pour voir un ertin onfort en progrmmntF oii quelquesEunes des priniples iliothques multiplteforme onntreD u moins de nom X ! GTK+ X une des plus importntes iliothques utilises sous vinuxF ille est porE tleD 9estEEdire utilisle sous vinuxD w y et indowsF quC est utilisle en g mis il en existe une version gCC ppele qumm @on prle de wrapper ou enore de surouheAF quC est l iliothque de prdiletion pour eux qui rivent des pplitions pour qnome sous vinuxD mis elle fontionne ussi sous uhiF g9est l iliothque utilise pr exemple pr pirefoxD pour ne iter que luiF ! Qt X onD je ne vous l prsente ps trop longuement ii r tout e hpitre est l pour elF hez nnmoins que t est trs utilise sous vinux ussiD en prtiulier dns l9environnement de ureu uhiF ! wxWidgets X une iliothque ojet trs omplte elle ussiD omprle en gros tF liene est trs semlle elle de t @elle vous utorise rer des progrmmes propritiresAF xnmoinsD j9i qund mme hoisi de vous montrer t r ette iliothque est plus file pour l formtion des dutntsF hez qu9une fois qu9on l9 prise en minD wxidgets n9est ps euoup plus omplique que tF wxidgets est l iliothque utilise pour rliser l qs de l9shi gode: :floksF
3

3. Mme si vous voulez crer des programmes pour Windows et que vous n'en avez rien faire de Linux et Mac OS, oui oui !

QRV

PRSENTATION DE QT

! FLTK X ontrirement toutes les iliothques  poids lourds prdentesD pvu se veut lgreF g9est une petite iliothque ddie uniquement l rtion d9interE fes grphiques multiplteformeF gomme vous le voyezD j9i d fire un hoix prmi tout elF g9est l qulit de l iliothque t et de s doumenttion qui m9 onvinu de vous l prsenterF

Prsentation de Qt
ous l9vez omprisD t est une bibliothque multiplteforme pour rer des qs @progrmme utilisnt des fentresAF t est rite en gCC et elle estD l seD onue pour tre utilise en gCCF outefoisD il est ujourd9hui possile de l9utiliser ve d9utres lngges omme tvD ythonD etF

Plus fort qu'une bibliothque : un framework


t @voir logo en (gure PIFQA est en fitF F F ien plus qu9une iliothqueF g9est un ensemble de bibliothquesF ve tout est tellement norme qu9on prle d9illeurs plutt de framework X el signi(e que vous vez votre disposition un ensemle d9outils pour dvelopper vos progrmmes plus e0ementF

Figure PIFQ ! vogo de t

u9on ne s9y trompe ps X t est fondmentlement onue pour rer des fentresD 9est en quelque sorte s fontion entrleF wis e serit dommge de l limiter elF t est don onstitue d9un ensemle de iliothquesD ppeles  modules F yn peut y trouver entre utres es fontionnlits X ! Module GUI X 9est toute l prtie rtion de fentresF xous nous onentrerons surtoutD dns e oursD sur le module qsF ! Module OpenGL X t peut ouvrir une fentre ontennt de l Qh gre pr ypenqvF ! Module de dessin X pour tous eux qui voudrient dessiner dns leur fentre @en PhAD le module de dessin est trs omplet 3 ! Module rseau X t fournit une tterie d9outils pour der u rseuD que e soit pour rer un logiiel de ghtD un lient pD un lient fittorentD un leteur de )ux F F F ! Module SVG X t permet de rer des imges et nimtions vetoriellesD l mnire de plshF QRW

CHAPITRE 21.

INTRODUCTION QT

! Module de script X t prend en hrge le tvsript @ou igweriptAD que vous pouvez rutiliser dns vos pplitions pour jouter des fontionnlitsD pr exemple sous forme de pluginsF ! Module XML X pour eux qui onnissent le wvD 9est un moyen trs prtique d9hnger des donnes prtir de (hiers struturs l9ide de lisesD omme le rwvF ! Module SQL X permet d9der ux ses de donnes @wyvD yrleD ostE grevF F FAF ue les hoses soient lires X t n9est ps grosD t est normeD et il ne fut ps ompter sur un seul livre pour vous expliquer tout e qu9il y svoir sur tF te vis vous montrer un lrge ventil de ses possiilits mis nous ne pourrons jmis tout voirF xous nous onentrerons surtout sur l prtie qsF our eux qui veulent ller plus loinD il fudr lire l doumenttion o0ielle @uniquement en nglisD omme toutes les doumenttions pour les progrmmeursAF gette doumenttion est trs ien fiteD elle dtille toutes les fontionnlits de tD mme les plus rentesF  houmenttion de t gode we X PITTRH  hez d9illeurs que j9i hoisi t en grnde prtie pre que s doumenttion est trs ien fite et file utiliserF ous urez don intrt vous en servirF i vous tes perdusD ne vous en fites psD je vous expliqueri dns un prohin hpitre omment on peut  lire une telle doumenttion et nviguer dednsF

Qt est multiplateforme
t est un framework multiplateformeF te le sis je me rpteD mis 9est importnt de l9voir ien omprisF ve shm de l (gure PIFR illustre le fontionnement de tF

Figure PIFR ! estrtion o'erte pr t

QSH

PRSENTATION DE QT

qre ette tehniqueD les fentres que vous odez ont une pprene dpte hque yF ous odez pour t et t trduit les instrutions pour l9yF ves utilisteurs de vos progrmmes n9y verront que du feu et ne suront ps que vous utilisez t @de toute mnireD ils s9en moquent 3AF oii une dmonstrtion de e que je viens de vous direF ves (gures PIFSD PIFTD PIFU et PIFV reprsentent le mme progrmmeD don l mme fentre re ve tD mis sous di'rents yF ous llez voir que t s9dpte hque foisF

Figure PIFS ! rogrmme t sous indows U

Figure PIFT ! rogrmme t sous indows

out e que vous vez fire pour prvenir u mme rsulttD 9est reompiler votre progrmme sous hun de es yF r exempleD vous vez dvelopp votre progrmme sous indowsD trs ienD mis les .exe n9existent ps sous vinuxF sl vous su0t don de reompiler votre progrmme sous vinux et 9est onD vous vez une version vinux 3
On est oblig de recompiler pour chacun des OS ?

yuiD el vous permet de rer des progrmmes inires dpts hque y et qui tournent pleine vitesseF yn ne se prouper toutefois ps de ompiler sous hun QSI

CHAPITRE 21.

INTRODUCTION QT

Figure PIFU ! rogrmme t sous vinux

Figure PIFV ! rogrmme t sous w y

QSP

PRSENTATION DE QT

des y mintenntD on v dj le fire pour votre y et e ser ienF YEA


Pour information, d'autres langages de programmation comme Java et Python ne ncessitent pas de recompilation car le terme  compilation  n'existe pas vraiment dans le cadre de ces langages. Cela rend les programmes un peu plus lents mais capables de s'adapter automatiquement n'importe quel environnement. L'avantage du C++ par rapport ces langages est donc sa rapidit (bien que la dirence se sente de moins en moins, sauf pour les jeux vido qui ont besoin de vitesse et qui sont donc majoritairement cods en C++).

L'histoire de Qt
fonD ne omptez ps sur moi pour vous fire un historique long et ennuyeux sur t mis je pense qu9un tout petit peu de ulture gnrle ne peut ps vous fire de ml et vous permettr de svoir de quoi vous prlezF t est un frmework initilement dvelopp pr l soit rolltehD qui fut pr l suite rhete pr xokiF ve dveloppement de t ommen en IWWI @el dte don de quelques nnesA et il t ds le dut utilis pr uhiD un des prinipux environnements de ureu sous vinuxF t s9rit  t et non  D don ve un  t minusule @si vous fites l9erreurD un fntique de t vous gorger prolement pour vous le rppelerAF t signi(e Cute D e qui signi(e  wignonne D pre que les dveloppeurs trouvient que l lettre tit jolie dns leur diteur de texteF yuiD je sis X ils sont fous es progrmmeursF
4

La licence de Qt
t est distriu sous deux lienesD u hoix X vqv ou propritireF gelle qui nous intresse est l liene vqv r elle nous permet d9utiliser grtuitement t @et mme d9voir s son ode soure si on veut 3AF yn peut ussi ien rliser des progrmmes lires que des progrmmes propritiresF frefD 9est vriment l9idl pour nousF yn peut l9utiliser grtuitement et en fire usge dns des progrmmes lires omme dns des progrmmes propritiresF
5

Qui utilise Qt ?
our tmoigner de son srieuxD une iliothque omme t esoin de rfrenesD 9estEEdire d9entreprises lres qui l9utilisentF he e point de vueD ps de prolme X
4. Prononcez  Quioute  5. C'est--dire des programmes dont le code source est public et dont on autorise la modication par d'autres personnes.

QSQ

CHAPITRE 21.

INTRODUCTION QT

t est utilise pr de nomreuses entreprises que vous onnissez srement X edoeD erhosD foeingD qoogleD kypeD l xeeF F F t est utilise pour rliser de nomreuses qsD omme elle d9edoe hotoshop ileE mentsD de qoogle irth ou enore de kype 3

Installation de Qt
ous tes prts instller t c yn est prti 3

Tlcharger Qt
gommenez pr tlhrger t sur son site weF  lhrger t gode we X IRHSQR  yn vous demnde de hoisir entre l version vqv et l version ommerileF gomme je vous l9i expliqu plus ttD nous llons utiliser l version qui est sous liene vqvF ous devez ensuite hoisir entre X ! Qt SDK X l iliothque t C un ensemle d9outils pour dvelopper ve tD inlunt un shi spil ppel t gretor Y ! Qt Framework X ontient uniquement l iliothque tF te vous propose de prendre le t hu r il ontient un ertin nomre d9outils qui vont grndement nous simpli(er l vieF ghoisissez soit  t pour indows X gCC D  t pour vinuxGII X gCC ou  t pour w X gCC en fontion de votre systme d9exploittionF hns l suite de e hpitreD je vous prsenteri l9instlltion du t hu sous indowsF
Si vous tes sous Linux, et notamment sous Debian ou Ubuntu, je vous recommande d'installer directement le paquet qtcreator avec la commande apt-get install qtcreator. La version sera peut-tre lgrement plus ancienne mais l'installation sera ainsi centralise et plus facile grer.

Installation sous Windows


v9instlltion sous indows se prsente sous l forme d9un ssistnt d9instlltion lssiqueF te vis vous montrer omment el se psse ps psD e n9est ps ien ompliquF v premire fentre est reprsente sur l (gure PIFWF sl n9y rien de prtiulier signlerF gliquez sur Next utnt de fois que nessire QSR

INSTALLATION DE QT

Figure PIFW ! snstlltion de t

en lissnt les options pr dfutF t s9instlle ensuite @(gure PIFIHAF


6

Figure PIFIH ! snstlltion de t en ours

ous tes l (n c yuf 3 yn vous propose d9ouvrir le progrmme t gretor qui t instll en plus de l iliothque tF ge progrmme est un shi spilement optimis pour trviller ve tF te vous invite le lner @(gure PIFIIAF
6. Il y a beaucoup de chiers, cela peut prendre un peu de temps.

QSS

CHAPITRE 21.

INTRODUCTION QT

Figure PIFII ! pin de l9instlltion

Qt Creator
fien qu9il soit possile de dvelopper en gCC ve t en utilisnt notre shi @omme gode: :floksA je vous reommnde fortement d9utiliser l9shi t gretor que nous venons d9instllerF sl est prtiulirement optimis pour dvelopper ve tF in e'etD 9est un progrmme toutEenEun qui omprend entre utres X ! un shi pour dvelopper en gCCD optimis pour ompiler des projets utilisnt t @ps de on(gurtion fstidieuseA Y ! un diteur de fentresD qui permet de dessiner filement le ontenu des interfes l souris Y ! une doumenttion inEdisEpenEsle pour tout svoir sur tF oii quoi ressemle t gretor lorsque vous le lnez pour l premire fois @(gure PPFIAF gomme vous le voyezD 9est un outil trs propre et trs ien fitF evnt que t gretor n9pprisseD il fllit rliser des on(gurtions prfois omplexes pour ompiler des projets utilisnt tF hsormisD tout est trnsprent pour le dveloppeur 3 hns le prohin hpitreD nous douvrirons omment utiliser t gretor pour dveE lopper notre premier projet tF xous y ompilerons notre toute premire fentre 3

En rsum
! sl existe deux types de progrmmes X les progrmmes onsole @eux que nous vons rs jusqu9iiA et les progrmmes qs @qrphil ser snterfeAD qui orrespondent ux fentres que vous onnissezF QST

INSTALLATION DE QT

Figure PIFIP ! t gretor

QSU

CHAPITRE 21.

INTRODUCTION QT

! grer des progrmmes qs est plus omplexe que de rer des progrmmes onsoleF ! our rer des progrmmes qsD on doit utiliser une iliothque spilise omme tF ! t est en fit ien plus qu9une iliothque X 9est un frmeworkD qui ontient un module qs @elui que nous llons utiliserAD un module rseuD un module vD etF ! t est multiplteforme X on peut l9utiliser ussi ien sous indows que vinux et w y F

QSV

Chapitre

22
Dicult :

Compiler votre premire fentre Qt

onne nouvelle, votre patience et votre persvrance vont maintenant payer. Dans ce chapitre, nous raliserons notre premier programme utilisant Qt et nous verrons comment ouvrir notre premire fentre ! Nous allons changer d'IDE et passer de Code: :Blocks Qt Creator, qui permet de raliser des programmes Qt beaucoup plus facilement. Je vais donc vous prsenter dans ce chapitre comment utiliser Qt Creator.

QSW

CHAPITRE 22.

COMPILER VOTRE PREMIRE FENTRE QT

Prsentation de Qt Creator
t gretorD que nous vons instll u hpitre prdent en mme temps que tD est l9shi idl pour progrmmer des projets tF sl v nous prgner des on(gurtions fstidieuses et nous permettre de ommener progrmmer en un rien de tempsF oii l fentre priniple du progrmmeD que nous vons dj vue @(gure PPFIAF

Figure PPFI ! t gretor

Cration d'un projet Qt vide


te vous propose de rer un nouveu projet en llnt dns le menu Fichier > Nouveau fichier ou projetF yn vous propose plusieurs hoix selon le type de projet que vous souhitez rer X pplition grphique pour ordinteurD pplition pour moileD etF gependntD pour nous qui dutonsD il est prfrle de ommener ve un projet videF gel nous fer moins de (hiers douvrir d9un seul oupF ghoisissez don les options Autre projet puis Projet Qt vide @(gure PPFPAF n ssistnt s9ouvre lors pour vous demnder le nom du projet et l9emplement o vous souhitez l9enregistrer @(gure PPFQAF QTH

PRSENTATION DE QT CREATOR

Figure PPFP ! xouveu projet t gretor

Figure PPFQ ! xouveu projet @hoix du nomA

QTI

CHAPITRE 22.

COMPILER VOTRE PREMIRE FENTRE QT

gomme vous le voyezD je l9i ppel  test D mis vous lui donner le nom que vous voulezF v fentre suivnte vous demnde quelques informtions dont vous vez peutEtre moins l9hitude @(gure PPFRAF

Figure PPFR ! xouveu projet @gestionnire de versionA

yn peut ssoier le projet un gestionnire de version @omme xD qitAF g9est un outil trs utileD notmment si on trville plusieurs sur un ode soureF F F wis e n9est ps le sujet de e hpitreF our le momentD liquez simplement sur  uivnt F our ette dernire fentreD t gretor propose de on(gurer l ompiltion @(gure PPFSAF v enoreD lissez e qu9on vous propose pr dfutD el onviendr trs ienF yuf 3 xotre projet vide est r @(gure PPFTAF ve projet est onstitu seulement d9un (hier .proF ge (hierD propre tD sert on(gurer le projet u moment de l ompiltionF t gretor modi(e utomtiquement e (hier en fontion des esoinsD e qui fit que nous n9urons ps euoup le modi(er dns l prtiqueF

Ajout d'un chier main.cpp


sl nous fut u moins un (hier main.cpp pour ommener progrmmer 3 our l9jouE terD retournez dns le menu Fichier > Nouveau fichier ou projet et sletionnez ette fois C++ > Fichier source C++ pour jouter un (hier .cpp @(gure PPFUAF yn vous demnde ensuite le nom du (hier rerD indiquez main.cpp @(gure PPFVAF ve (hier main.cpp vide t jout u projetF ous pouvez fire un douleEli sur son nom pour l9ouvrir @(gure PPFWAF g9est dns e (hier que nous rirons nos premires lignes de ode gCC utilisnt tF QTP

PRSENTATION DE QT CREATOR

Figure PPFS ! xouveu projet @on(gurtion de l ompiltionA

Figure PPFT ! xotre projet vide dns t gretor

QTQ

CHAPITRE 22.

COMPILER VOTRE PREMIRE FENTRE QT

Figure PPFU ! ejout de (hier soure

Figure PPFV ! ejout de (hier soure @hoix du nomA

QTR

PRSENTATION DE QT CREATOR

Figure PPFW ! yuverture du (hier vide

QTS

CHAPITRE 22.

COMPILER VOTRE PREMIRE FENTRE QT

our ompiler le progrmmeD il vous su0r de liquer sur verte dns l olonne l )he de guheD ou ien d9utiliser le rouri lvier Ctrl C R F

Codons notre premire fentre !


ykD 9est prti 3

Le code minimal d'un projet Qt


isissez le ode suivnt dns le (hier main.cpp X
5inlude `epplitionb int min@int rgD hr BrgvA { epplition pp@rgD rgvAY } return ppFexe@AY

gopier e ode gode we X IQQIUR  g9est le code minimal d9une pplition utilisnt t 3 gomme vous pouvez le onstterD e qui est gnilD 9est que 9est vriment trs ourtF h9utres iliothques vous demndent euoup plus de lignes de ode vnt de pouE voir ommener progrmmerD tndis qu9ve tD 9est vriment trs simple et rpideF enlysons e ode ps ps 3
Includes un jour, includes toujours
5inlude `epplitionb

g9est le seul inlude dont vous vez esoin u dprtF ous pouvez oulier iostream et ompgnieD ve t on ne s9en sert plusF ous noterez qu9on ne met ps l9extension  Fh D 9est vouluF pites extement omme moiF get inlude vous permet d9der l lsse QApplicationD qui est l lsse de se de tout progrmme tF
QApplication,

la classe de base

epplition pp@rgD rgvAY

QTT

CODONS NOTRE PREMIRE FENTRE !

v premire ligne du main() re un nouvel ojet de type QApplicationF yn fit el tout u long des derniers hpitresD vous ne devriez ps tre surprisF get ojet est ppel app @mis vous pouvez l9ppeler omme vous voulezAF ve onstruE teur de QApplication exige que vous lui pssiez les rguments du progrmmeD 9estEE dire les prmtres argc et argv que reoit l fontion mainF gel permet de dmrrer le progrmme ve ertines options prisesD mis on ne s9en servir ps iiF
Lancement de l'application
return ppFexe@AY

gette ligne fit P hoses X IF ille ppelle l mthode exec de notre ojet appF gette mthode dmrre notre progrmme et lne don l90hge des fentresF i vous ne le fites psD il ne se psser rienF PF ille renvoie le rsultt de app.exec() pour dire si le progrmme s9est ien droul ou psF ve return provoque l (n de l fontion mainD don du progrmmeF g9est un peu du ondens en fit 3 ge que vous devez vous direD 9est qu9en grosD tout notre progrmme s9exute rellement prtir de e momentElF v mthode exec est gre pr t X tnt qu9elle s9exuteD notre progrmme est ouvertF hs que l mthode exec est termineD notre progrmme s9rrteF

Achage d'un widget


hns l pluprt des iliothques qsD dont t fit prtieD tous les lments d9une fentre sont ppels des widgetsF ves outonsD les ses oherD les imgesF F F tout elD e sont des widgetsF v fentre elleEmme est onsidre omme un widgetF our provoquer l90hge d9une fentreD il su0t de demnder 0her n9importe quel widgetF si pr exempleD nous llons 0her un outonF oii le ode omplet que j9imeris que vous utilisiezF sl fit ppel u ode de se de tout l9heure mis y joute quelques lignes X
5inlude `epplitionb 5inlude `ushfuttonb int min@int rgD hr BrgvA { epplition pp@rgD rgvAY ushfutton outon@4lut les rosD l forme c4AY outonFshow@AY

QTU

CHAPITRE 22.

COMPILER VOTRE PREMIRE FENTRE QT

return ppFexe@AY

gopier e ode gode we X PIUHWV  ves lignes joutes ont t surlignes pour que vous puissiez ien les reprerF yn voit entre utres X
5inlude `ushfuttonb

gette ligne vous permet de rer des ojets de type QPushButtonD 9estEEdire des outons @vous noterez d9illeurs queD dns tD toutes les lsses ommenent pr un  3AF
ushfutton outon@4lut les rosD l forme c4AY

gel re un nouvel ojet de type QPushButton que nous ppelons tout simplement b mis nous urions trs ien pu l9ppeler utrementF ve onstruteur ttend un prmtre X le texte qui ser 0h sur le outonF wlheureusementD le fit de rer un outon ne su0t ps pour qu9il soit 0hF sl fut ppeler s mthode show X
outonD
outonFshow@AY

it voil 3 gette ligne ommnde l90hge d9un outonF gomme un outon ne peut ps  )otter omme el sur votre rnD t l9insre utomtiquement dns une fentreF yn en quelque sorte r une  fentreEouton F fien entenduD dns un vri progrmme plus omplexeD on re d9ord une fentre et on y insre ensuite plusieurs widgetsD mis l nous n9en sommes qu9u ommenementF xotre ode est prtD il ne reste plus qu9 ompiler et exuter le progrmme 3 sl su0t pour el de liquer sur le outon en forme de )he verte guhe de t gretorF ve progrmme se lne lorsF F F gouou petite fentreD fis risette l mr @(gure PPFIHA 3

Figure PPFIH ! xotre premire fentre

ve outon prend l tille du texte qui se trouve l9intrieur et l fentre qui est utomtiquement re prend l tille du outonF gel donne don une toute petite fentre wisF F F vous pouvez l redimensionner @(gure PPFIIAD voire mme l90her en plein rn 3 ien ne vous en emphe et le outon s9dpte utomtiquement l tille de l fentre @e qui peut donner un trs gros outonAF QTV

DIFFUSER LE PROGRAMME

Figure PPFII ! xotre premire fentre grndie

Diuser le programme
our tester le progrmme ve t gretorD un li sur l )he verte su0tF g9est trs simpleF gependntD si vous ruprez l9exutle qui t gnr et que vous l9envoyez un miD eluiEi ne pourr prolement ps lner votre progrmme 3 in e'etD il esoin d9une srie de (hiers hvvF ves progrmmes t ont esoin de es (hiers hvv ve eux pour fontionnerF und vous exutez votre progrmme depuis t gretorD l position des hvv est  onnue D don votre progrmme se lne sns erreurF wis essyez de fire un douleEli sur l9exutle dns l9explorteurD pour voir 3 endezEvous dns le sousEdossier release de votre projet pour y trouver l9exutle @(gure PPFIPAF

Figure PPFIP ! ve progrmme Test.exe

in e'etD sns ses quelques hvv ompgnonsD notre progrmme est perdu @(gure PPFIQAF sl esoin de es (hiers qui ontiennent de quoi le guiderF QTW

CHAPITRE 22.

COMPILER VOTRE PREMIRE FENTRE QT

Figure PPFIQ ! irreur d9exution en l9sene des hvv

our pouvoir lner l9exutle depuis l9explorteur @et ussi pour qu9il mrhe hez vos mis et lientsAD il fut pler les hvv qui mnquent dns le mme dossier que l9exutleF vous de les herherD vous les vez sur votre disque @hez moi je les i trouvs dns le dossier C:\Qt\2010.05\mingw\bin et C:\Qt\2010.05\binAF in toutD vous devriez voir eu esoin de mettre Q hvv dns le dossier X mingwm10D QtCore4 et QtGui4F ous pouvez mintennt lner le progrmme depuis l9explorteur 3 vorsque vous envoyez votre progrmme un mi ou que vous le mettez en ligne pour tlhrgementD pensez don joindre les hvvD ils sont indispenslesF

En rsum
! t gretor est un shi onu spilement pour dvelopper des projets ve tF ! t gretor nous simpli(e le proessus de ompiltionD qui est hituellement un peu dlit ve tF ! ous les lments d9une fentre sont ppels widgetsF ! ves widgets sont reprsents pr des ojets dns le odeF einsiD QPushButton orresE pond pr exemple un outonF ! vorsque vous di'usez un progrmme r ve tD pensez joindre les hvv de t pour qu9il puisse fontionnerF

QUH

Chapitre

23
Dicult :

Personnaliser les widgets

a  fentre-bouton  que nous avons ralise au chapitre prcdent tait un premier pas. Toutefois, nous avons pass plus de temps expliquer les mcanismes de la compilation qu' modier le contenu de la fentre. Par exemple, comment faire pour modier la taille du bouton ? Comment placer le bouton o on veut dans la fentre ? Comment changer la couleur, le curseur de la souris, la police, l'icne. . . Dans ce chapitre, nous allons nous habituer modier les proprits d'un widget : le bouton. Bien sr, il existe plein d'autres widgets (cases cocher, listes droulantes. . .) mais nous nous concentrerons sur le bouton pour nous habituer diter les proprits d'un widget. Une fois que vous saurez le faire pour le bouton, vous saurez le faire pour les autres widgets. Enn et surtout, nous reparlerons dans ce chapitre d'hritage. Nous apprendrons crer un widget personnalis qui  hrite  du bouton. C'est une technique extrmement courante que l'on retrouve dans toutes les bibliothques de cration de GUI !

QUI

CHAPITRE 23.

PERSONNALISER LES WIDGETS

Modier les proprits d'un widget


gomme tous les lments d9une fentreD on dit que le outon est un widgetF eve tD on re un outon l9ide de l lsse QPushButtonF gomme vous le svezD une lsse est onstitue de P lments X ! des attributs X e sont les  vriles internes de l lsse Y ! des mthodes X e sont les  fontions internes de l lsseF v rgle d9enpsultion dit que les utilisteurs de l lsse ne doivent ps pouvoir modi(er les ttriuts X euxEi doivent don tous tre privsF yrD je ne sis ps si vous vez remrqu mis nous sommes justement des utilisateurs des lsses de tF ge qui veut direF F F que nous n9vons ps s ux ttriuts puisque euxEi sont privs 3
H, mais tu avais parl d'un truc un moment, je crois. . . Les accesseurs, est-ce que c'est cela ?

ehF F F t9ime les gens qui ont de l mmoire 3 i'etivement ouiD j9vis dit que le rteur d9une lsse devit rendre ses ttriuts privs misD du oupD proposer des mthodes accesseursD 9estEEdire des mthodes permettnt de lire et de modi(er les ttriuts de mnire surise @get et setD el ne vous rppelle rien cAF

Les accesseurs avec Qt


tustementD les gens qui ont r t sont des rves grs X ils ont od proprement en respetnt es rglesF it il vlit mieux qu9ils fssent ien les hoses s9ils ne voulient ps que leur immense iliothque devienne un vritle zr 3 hu oupD pour hque proprit d9un widgetD on X ! Un attribut X il est privD on ne peut ni le lire ni le modi(er diretementF ixemple X ! Un accesseur pour le lire X et esseur est une mthode onstnte qui porte le mme nom que l9ttriut F te vous rppelle qu9une mthode onstnte est une mthode qui s9interdit de modi(er les ttriuts de l lsseF einsiD vous tes ssurs que l mthode se ontente de lire l9ttriut et qu9elle ne le modi(e psF ixemple X
1

text

! Un accesseur pour le modier X 9est une mthode qui se prsente sous l forme setAttribut()F ille modi(e l vleur de l9ttriutF ixemple X setText() gette tehniqueD mme si elle prt un peu lourde @pre qu9il fut rer P mthodes pour hque ttriutA l9vntge d9tre prfitement sreF qre elD t peut vri(er que l vleur que vous essyez de donner est vlideF gel permet d9viterD pr
1. Personnellement j'aurais plutt mis un get devant pour ne pas confondre avec l'attribut, mais bon.

text()

QUP

MODIFIER LES PROPRITS D'UN WIDGET

exempleD que vous ne donniez une rre de progression l vleur  ISH7 D lors que l vleur d9une rre de progression doit tre omprise entre H et IHH7 @(gure PQFIAF
Figure PQFI ! frre de progression

oyons sns plus trder quelques proprits des outons que nous pouvons nous muser modi(er l9ide des esseursF

Quelques exemples de proprits des boutons


sl existe pour hque widgetD y ompris le outonD un grnd nomre de proprits que l9on peut diterF xous n9llons ps toutes les voir iiD ni mme plus trd d9illeursD je vous pprendri lire l doumenttion pour toutes les douvrirF gependntD je tiens vous montrer les plus intressntes d9entre elles pour que vous puissiez ommener vous fire l min et surtoutD pour que vous preniez l9hitude d9utiliser les esseurs de tF
text

: le texte

gette proprit est prolement l plus importnte X elle permet de modi(er le texte (gurnt sur le outonF in gnrlD on d(nit le texte du outon u moment de s rtion r le onstruteur epte que l9on donne un intitul ds e momentElF outefoisD pour une rison ou une utreD vous pourriez tre mens modi(er u ours de l9exution du progrmme le texte du outonF g9est l qu9il devient prtique d9voir s l9ttriut text du outon via ses esseursF our hque ttriutD l doumenttion de t nous dit quoi il sert et quels sont ses esseursF   houmenttion de t sur les outons gode we X TQHSRR   yn vous indique de quel type est l9ttriutF siD text est de type QStringD omme tous les ttriuts qui stokent du texte ve tF in e'etD t n9utilise ps l lsse string stndrd du gCC mis s propre version de l gestion des hnes de rtresF in grosD QString est un string mliorF uisD on vous explique en quelques mots quoi sert et ttriutF in(nD on vous indique les esseurs qui permettent de lire et modi(er l9ttriutF hns le s prsentD il s9git de X ! QString text () const X 9est l9esseur qui permet de lire l'attributF sl renvoie un QStringD e qui est logique puisque l9ttriut est de type QStringF ous noterez l prsene du motEl const qui indique que 9est une mthode onstnte ne modi(nt uun ttriutF QUQ

CHAPITRE 23.

PERSONNALISER LES WIDGETS

void setText ( const QString & text )

X 9est l9esseur qui permet de modier l'attributF sl prend un prmtre X le texte que vous voulez mettre sur le outonF
la longue, vous ne devriez pas avoir besoin de la documentation pour savoir quels sont les accesseurs d'un attribut. Cela suit toujours le mme schma : attribut() permet de lire l'attribut et setAttribut() permet de modier l'attribut.

issyons don de modi(er le texte du outon prs s rtion X


5inlude `epplitionb 5inlude `ushfuttonb int min@int rgD hr BrgvA { epplition pp@rgD rgvAY ushfutton outon@4lut les rosD l forme c4AY outonFsetext@4imp mon outon 34AY outonFshow@AY } return ppFexe@AY

Vous aurez not que la mthode setText attend un QString et qu'on lui envoie une bte chane de caractres entre guillemets. En fait, cela fonctionne comme la classe string : les chanes de caractres entre guillemets sont automatiquement converties en QString. Heureusement d'ailleurs, sinon ce serait lourd de devoir crer un objet de type QString juste pour cela !

ve rsultt est prsent l (gure PQFPF

Figure PQFP ! n outon dont le texte t modi(

ve rsultt n9est peutEtre ps trs impressionnnt mis el montre ien e qui se psse X IF yn re le outon etD l9ide du onstruteurD on lui ssoie le texte  lut les rosD l forme c Y QUR

MODIFIER LES PROPRITS D'UN WIDGET

PF yn modi(e le texte (gurnt sur le outon pour 0her  imp mon outon 3 F eu (nlD 9est  imp mon outon 3 qui s90heF ourquoi c re que le nouveu texte  rs l9nienF g9est extement omme si on fisit X
int x a IY x a PY out `` xY

vorsqu9on 0he xD il vut PF g9est preil pour le outonF eu (nlD 9est le tout dernier texte qui est 0hF fien entenduD e qu9on vient de fire est ompltement inutile X utnt donner le on texte diretement u outon lors de l9ppel du onstruteurF outefoisD setText() se rvler utile plus trd lorsque vous voudrez modi(er le ontenu du outon u ours de l9exutionF r exempleD lorsque l9utilisteur ur donn son nomD le outon pourr hnger de texte pour dire  fonjour wF hupont 3 F
toolTip

: l'infobulle

sl est ournt d90her une petite ide sous l forme d9une infoulle qui pprt lorsqu9on pointe sur un lment ve l sourisF v9infoulle peut 0her un ourt texte d9ideF yn l d(nit l9ide de l proprit to olTipF our modi(er l9infoulleD l mthode ppeler est donF F F setToolTip 3 ous voyezD 9est file qund on ompris omment t est orgnis 3
5inlude `epplitionb 5inlude `ushfuttonb int min@int rgD hr BrgvA { epplition pp@rgD rgvAY ushfutton outon@4imp mon outon 34AY outonFsetoolip@4exte d9ide4AY outonFshow@AY } return ppFexe@AY

font

: la police

eve l proprit fontD les hoses se ompliquentF in e'etD jusqu9iiD on seulement eu envoyer une hne de rtres en prmtre et elleEi tit en fit onvertie en ojet de type QStringF QUS

CHAPITRE 23.

PERSONNALISER LES WIDGETS

Figure PQFQ ! ne infoulle

v proprit font est un peu plus omplexe r elle ontient trois informtions X ! le nom de l polie de rtres utilise @imes xew omnD erilD gomi ns wF F FA Y ! l tille du texte en pixels @IPD ITD IVF F FA Y ! le style du texte @grsD itliqueF F FAF v signture de l mthode setFont est X gel veut dire que setFont ttend un ojet de type QFont 3 te rppelleD pour eux qui urient ouli l signi(tion des symolesD que X ! const X signi(e que l9ojet pss en prmtre ne ser ps modi( pr l fontion Y ! & X signi(e que l fontion rupre une rfrene vers l9ojetD e qui lui vite d9voir le opierF fonD omment fitEon pour lui donner un ojet de type QFont c ih ien 9est simple X ilF F F su0t de rer un ojet de type QFont 3 v doumenttion nous indique tout e que nous vons esoin de svoir sur QFontD en prtiulier les informtions qu9il fut fournir son onstruteurF te n9ttends ps enore de vous que vous soyez ples de lire l doumenttion de mnire utonomeD je vis don vous mher le trvil F  houmenttion de QFont gode we X RSSVUI  our fire simpleD le onstruteur de QFont ttend qutre prmtresF oii son protoE type X
2

void setFont ( const QFont & )

QFont(constQString&family,intpointSize=-1,intweight=-1,boolitalic=false )

En fait, avec Qt, il y a rarement un seul constructeur par classe. Les dveloppeurs de Qt protent des fonctionnalits du C++ et ont donc tendance beaucoup surcharger les constructeurs. Certaines classes possdent mme plusieurs dizaines de constructeurs dirents ! Pour QFont, celui que je vous montre ici est nanmoins le principal et le plus utilis.

eul le premier rgument est oligtoire X il s9git du nom de l polie utiliserF ves utresD omme vous pouvez le voirD possdent des vleurs pr dfutF xous ne sommes
2. Mais protez-en parce que cela ne durera pas ternellement !

QUT

MODIFIER LES PROPRITS D'UN WIDGET

don ps oligs de les indiquerF hns l9ordreD les prmtres signi(ent X ! family X le nom de l polie de rtres utiliserF ! pointSize X l tille des rtres en pixelsF ! weight X le niveu d9pisseur du trit @grsAF gette vleur peut tre omprise entre H et WW @du plus (n u plus grsAF ous pouvez ussi utiliser l onstnte QFont::Bold qui orrespond une pisseur de USF ! italic X un oolenD pour indiquer si le texte doit tre 0h en itlique ou nonF yn v fire quelques testsF out d9ordD il fut rer un ojet de type QFont X
pont molie@4gourier4AY

t9i ppel et ojet maPoliceF wintenntD je dois envoyer l9ojet maPolice de type QFont l mthode setFont de mon outon @suivezD suivez 3A X
outonFsetpont@molieAY

in rsumD j9i don d rire P lignes pour hnger l polie X


pont molie@4gourier4AY outonFsetpont@molieAY

g9est un peu fstidieuxF sl existe une solution plus mligne si on ne ompte ps se resservir de l polie plus trd X elle onsiste d(nir l9ojet de type QFont u moment de l9ppel l mthode setFontF gel nous vite d9voir donner un nom idon l9ojetD omme on l9 fit ii @maPoliceAD 9est plus ourtD el v plus viteD ref 9est mieux en gnrl pour les s les plus simples omme iiF
outonFsetpont@pont@4gourier4AAY

oilD en imriqunt insiD el mrhe trs ienF v mthode setFont veut un ojet de type QFont c u9 el ne tienneD on lui en re un l vole 3 oii le rsultt l (gure PQFRF

Figure PQFR ! n outon rit ve l polie gourier

wintenntD on peut exploiter un peu plus le onstruteur de QFont en utilisnt une utre polie plus fntisiste et en ugmentnt l tille des rtres @(gure PQFSA X
outonFsetpont@pont@4gomi ns w4D PHAAY

it voil le mme ve du grs et de l9itlique @(gure PQFTA 3


outonFsetpont@pont@4gomi ns w4D PHD pontXXfoldD trueAAY

QUU

CHAPITRE 23.

PERSONNALISER LES WIDGETS

Figure PQFS ! n outon en gomi ns w en grnd

Figure PQFT ! n outon en gomi ns w en grndD grsD itlique


cursor

: le curseur de la souris

eve l proprit cursorD vous pouvez dterminer quel urseur de l souris doit s90E her lorsqu9on pointe sur le outonF ve plus simple est de hoisir l9une des onstntes de urseurs prd(nies dns l liste qui s9o're vousF  houmenttion des urseurs gode we X RRPWWU  ge qui peut donner pr exempleD si on veut qu9une min s90he @(gure PQFUA X
outonFsetgursor@tXXointingrndgursorAY

Figure PQFU ! gurseur de l souris modi( sur le outon


icon

: l'icne du bouton

eprs tout e qu9on vient de voirD rjouter une ine u outon v vous prtre trs simple X l mthode setIcon ttend juste un ojet de type QIconF n QIcon peut se onstruire trs filement en donnnt le nom du (hier imge hrgerF renons pr exemple un smileyF sl s9git d9une imge u formt xq que sit lire tF
outonFsetson@son@4smileFpng4AAY

QUV

QT ET L'HRITAGE

Attention : sous Windows, pour que cela fonctionne, votre icne smil e.png doit se trouver dans le mme dossier que l'excutable (ou dans un sous-dossier si vous crivez dossier/smile.png). Sous Linux, il faut que votre icne soit dans votre rpertoire HOME. Si vous voulez utiliser le chemin de votre application, comme cela se fait par dfaut sous Windows, crivez : QIcon(QCoreApplication::applicationDirPath() + "/smile.png"); Cela aura pour eet d'acher l'icne condition que celle-ci se trouve dans le mme rpertoire que l'excutable.

i vous vez fit e qu9il fllitD l9ine devrit lors pprtre omme sur l (gure PQFVF

Figure PQFV ! n outon ve une ine

Qt et l'hritage
yn urit pu ontinuer fire joujou longtemps ve les proprits de notre outon mis il fut svoir s9rrter u out d9un moment et reprendre les hoses srieusesF uelles hoses srieuses c i je vous dis  hritge D el ne vous rppelle rien c t9espre que el ne vous donne ps des outons en tout s @oh oh ohA pre queD si vous n9vez ps ompris le prinipe de l9hritgeD vous ne pourrez ps ller plus loinF

De l'hritage en folie
v9hritge est prolement ve notion l plus intressnte de l progrmmtion orienE te ojetF ve fit de pouvoir rer une lsse de seD rutilise pr des sousElsses (llesD qui ont ellesEmmes leurs propres sousElsses (llesD el donne une iliothque omme t une puissne in(nie F in fitF F F qusiment toutes les lsses de t font ppel l9hritgeF our vous fire une ideD l doumenttion vous donne l hirrhie omplte des lssesF ves lsses les plus guhe de ette liste pues sont les lsses de se et toute lsse dle vers l droite est une sousElsseF  rirrhie des lsses gode we X UTQTHT  ous pouvez pr exemple voir u dut X ! QAbstractExtensionFactory
3

3. Voire plus, mme.

QUW

CHAPITRE 23.

PERSONNALISER LES WIDGETS

QAbstractExtensionFactory et QAbstractExtensionManager sont des lsses dites  de se F illes n9ont ps de lsses prentesF in revnheD QExtensionFactory et QExtensionManager sont des lssesE(llesD qui hritent respetivement de QAbstractE xtensionFactory et QAbstractExtensionManagerF ympthiqueD n9estEe ps c hesendez plus s sur l pge de l hirrhieD l reherhe de l lsse QObjectF egrdez un peu toutes ses lsses (llesF hesendezF inoreF inoreF inoreF g9est on vous n9vez ps trop pris peur c ous vez d voir que ertines lsses tient rrment des sousEsousEsousEsousEsousElssesF

QExtensionFactory QAbstractExtensionManager ! QExtensionManager

Wouaw, mais comment je vais m'y retrouver l-dedans moi ? Ce n'est pas possible, je ne vais jamais m'en sortir !

g9est e qu9on tendne se dire l premire foisF in fitD vous llez petit petit omprendre qu9u ontrireD tous es hritges sont l pour vous simpli(er l vieF i e n9tit ps ussi ien rhiteturD lors l vous ne vous en seriez jmis sortis 3 YEA
QObject

: une classe de base incontournable

QObject est l lsse de se de tous les ojets sous tF yjet ne orrespond rien de prtiulier mis elle propose quelques fontionnlits  de se qui peuvent tre utiles toutes les utres lssesF gel peut surprendre d9voir une lsse de se qui ne sit rien fire de prtiulier misD en fitD 9est e qui donne euoup de puissne l iliothqueF r exempleD il su0t de d(nir une fois dns QObject une mthode objectName() qui ontient le nom de l9ojet et insiD toutes les utres lsses de t en hritent et possderont don ette mthodeF h9utre prtD le fit d9voir une lsse de se omme QObject est indispensle pour rliser le mnisme des signaux et des slots qu9on verr u prohin hpitreF ge mnisme permet pr exemple de fire en sorte queD si on lique sur un outonD lors une utre fentre s9ouvre @on dit qu9il envoie un signl un utre ojetAF frefD tout el doit vous semler enore un peu strit et je le omprends prfitementF te pense qu9un petit shm simpli( des hritges de t s9impose @(gure PQFWAF gel devrit vous permettre de mieux visuliser l hirrhie des lssesF oyons lirs X je n9i ps tout misF t9i simplement prsent quelques exemples misD s9il fllit fire le shm ompletD el prendrit une ple normeD vous vous en doutez 3 yn voit sur e shm que QObject est l lsse mre priniple dont hritent toutes les utres lssesF gomme je l9i ditD elle propose quelques fontionnlits qui se rvlent utiles pour toutes les lssesD mis nous ne les verrons ps iiF

QVH

QT ET L'HRITAGE

Figure PQFW ! rritge sous t

QVI

CHAPITRE 23.

PERSONNALISER LES WIDGETS

gertines lsses omme QSound @gestion du sonA hritent diretement de QObjectF outefoisD omme je l9i ditD on s9intresse plus prtiulirement l rtion de qsD 9estEEdire de fentresF yr dans une fentre, tout est considr comme un widget @mme l fentre est un widgetAF g9est pour el qu9il existe une lsse de se QWidget pour tous les widgetsF ille ontient normment de proprits ommunes tous les widgetsD omme X ! l lrgeur Y ! l huteur Y ! l position en sisse @xA Y ! l position en ordonne @yA Y ! l polie de rtres utilise Y ! le urseur de l souris ! l9infoulle @toolTipA ! etF ous ommenez perevoir un peu l9intrt de l9hritge c qre ette tehniqueD il leur su0t de d(nir une fois toutes les proprits de se des widgets @lrgeurD huteurF F FAF ous les widgets hritent de QWidgetD don ils possdent toutes es proE pritsF ous svez don pr exemple que vous pouvez retrouver l mthode setCurs or dns l lsse QProgressBarF
4 5

Les classes abstraites


ous vez pu remrquer sur mon shm que j9i rit l lsse QAbstractButton en rougeF F F ourquoi c sl existe en fit un grnd nomre de lsses strites sous tD dont le nom ontient toujours le mot  estrt F xous vons dj prl des lsses strites dns un hpitre prdentF etit rppel pour eux qui urient ouliF ves lsses dites  strites sont des lsses qu9on ne peut ps instnierF g9estEEdireF F F qu9on n9 ps le droit de rer d9ojets prtir d9ellesF einsiD on ne peut ps fire X
estrtfutton outon@AY GG snterdit r lsse strite

Mais alors. . . quoi cela sert-il de faire une classe si on ne peut pas crer d'objets partir d'elle ?

ne lsse strite sert de lsse de se pour d9utres sousElssesF siD QAbstractB utton d(nit un ertin nomre de proprits ommunes tous les types de outons @outons lssiquesD ses oherD ses rdioF F FAF r exempleD prmi les proprits ommunes on trouve X
4. Eh oui, la mthode setFont est dnie dans QWidget et comme QPushButton en hrite, il possde lui aussi cette mthode. 5. Pareil, rebelote, setCursor est en fait dni dans QWidget et non dans QPushButton car il est aussi susceptible de servir sur tous les autres widgets.

QVP

UN WIDGET PEUT EN CONTENIR UN AUTRE

! text X le texte 0h Y ! icon X l9ine 0he t du texte du outon Y ! shortcut X le rouri lvier pour tiver le outon Y ! down X indique si le outon est enfon ou non Y ! etF frefD enore une foisD tout el n9est d(ni qu9une fois dns QAbstractButton et on le retrouve ensuite utomtiquement dns QPushButtonD QCheckBoxD etF
Dans ce cas, pourquoi QObject et QWidget ne sont-elles pas des classes abstraites elles aussi ? Aprs tout, elles ne reprsentent rien de particulier et servent simplement de classes de base !

yuiD vous vez tout fit risonD leur rle est d9tre des lsses de seF wisF F F pour un ertin nomre de risons prtiques @qu9on ne dtiller ps iiAD il est possile de les instnier qund mmeD don de rer pr exemple un ojet de type QWidgetF i on 0he un QWidgetD qu9estEe qui pprt c ne fentre 3 in fitD un widget qui ne se trouve ps l9intrieur d9un utre widget est onsidr omme une fentreF ge qui explique pourquoiD en l9sene d9utre informtionD t dide de rer une fentreF

Un widget peut en contenir un autre


xous ttquons mintennt une notion importnteD mis heureusement ssez simpleD qui est elle des widgets conteneursF

Contenant et contenu
sl fut svoir qu9un widget peut en ontenir un utreF r exempleD une fentre @un QWidgetA peut ontenir trois outons @QPushButtonAD une se oher @QCheckBoxAD une rre de progression @QProgressBarAD etF ge n9est ps l de l9hritgeD juste une histoire de ontennt et de ontenuF renons un exempleD l (gure PQFIHF ur ette ptureD l fentre ontient trois widgets X ! un outon yu Y ! un outon ennuler Y ! un onteneur ve des ongletsF ve onteneur ve des onglets estD omme son nom l9indiqueD un onteneurF sl ontient son tour des widgets X ! deux outons Y ! une se oher @checkbox A Y ! une rre de progressionF ves widgets sont don imriqus les uns dns les utres suivnt ette hirrhie X QVQ

CHAPITRE 23.

PERSONNALISER LES WIDGETS

Figure PQFIH ! idgets onteneurs

! idget @l fentreA ! ushfutton ! ushfutton ! idget @le onteneur ongletsA ! ushfutton ! ushfutton ! ghekfox ! rogressfr
Attention : ne confondez pas ceci avec l'hritage ! Dans cette partie, je suis en train de vous montrer qu'un widget peut en contenir d'autres. Le gros schma qu'on a vu un peu plus haut n'a rien voir avec la notion de widget conteneur. Ici, on dcouvre qu'un widget peut en contenir d'autres, indpendamment du fait que ce soit une classe mre ou une classe lle.

Crer une fentre contenant un bouton


yn ne v ps ommener pr fire une fentre ussi omplique que elle qu9on vient de voirF our le momentD on v s9entrner fire quelque hose de simple X rer une fentre qui ontient un outonF
Mais. . . n'est-ce pas ce qu'on a fait tout le temps jusqu'ici ?

xonD e qu9on fit jusqu9iiD 9tit simplement 0her un outonF eutomtiquementD t r une fentre utour r on ne peut ps voir de outon qui  )otte seul sur QVR

UN WIDGET PEUT EN CONTENIR UN AUTRE

l9rnF v9vntge de rer une fentre puis de mettre un outon dednsD 9est que X ! on pourr mettre ultrieurement d9utres widgets l9intrieur de l fentre Y ! on pourr pler le outon o on veut dns l fentreD ve les dimensions qu9on veut @jusqu9iiD le outon vit toujours l mme tille que l fentreAF oil omment il fut fire X
5inlude `epplitionb 5inlude `ushfuttonb int min@int rgD hr BrgvA { epplition pp@rgD rgvAY GG grtion d9un widget qui servir de fentre idget fenetreY fenetreFsetpixedize@QHHD ISHAY GG grtion du outonD ynt pour prent l 4fentre4 ushfutton outon@4imp mon outon 34D 8fenetreAY GG ersonnlistion du outon outonFsetpont@pont@4gomi ns w4D IRAAY outonFsetgursor@tXXointingrndgursorAY outonFsetson@son@4smileFpng4AAY GG effihge de l fentre fenetreFshow@AY } return ppFexe@AY

gopier e ode gode we X SVUVSQ  F F F et le rsultt en (gure PQFIIF

Figure PQFII ! pentre ve outon

u9estEe qu9on fit c QVS

CHAPITRE 23.

PERSONNALISER LES WIDGETS

IF yn r une fentre l9ide d9un ojet de type QWidgetF PF yn dimensionn notre widget @don notre fentreA ve l mthode setFixedS izeF v tille de l fentre ser (xe X on ne pourr ps l redimensionnerF QF yn r un outon mis ve ette fois une nouveut u niveu du onstruE teur X on indiqu un pointeur vers le widget prent @en l9ourene l fentreAF RF yn personnlis un peu le outonD pour l formeF SF yn dlenh l90hge de l fentre @et don du outon qu9elle ontenitAF ous les widgets possdent un onstruteur surhrg qui permet d9indiquer quel est le prent du widget que l9on reF sl su0t de donner un pointeur pour que t she  qui ontient qui F ve prmtre &fenetre du onstruteur permet don d9indiquer que l fentre est le prent de notre outon X
ushfutton outon@4imp mon outon 34D 8fenetreAY

i vous voulez pler le outon illeurs dns l fentreD utilisez l mthode move X
outonFmove@THD SHAY

Figure PQFIP ! pentre ve outon entr

noter ussi X l mthode setGeometryD qui prend R prmtres X


outonFsetqeometry@sisseD ordonneeD lrgeurD huteurAY

v mthode setGeometry permet donD en plus de dpler le widgetD de lui donner des dimensions ien priseF

Tout widget peut en contenir d'autres


F F F mme les outons 3 uel que soit le widgetD son onstruteur epte en dernier prmtre un pointeur vers un utre widgetD pointeur qui indique quel est le prentF yn peut fire le test si vous voulez en plnt un outonF F F dns notre outon 3 QVT

UN WIDGET PEUT EN CONTENIR UN AUTRE

5inlude `epplitionb 5inlude `ushfuttonb int min@int rgD hr BrgvA { epplition pp@rgD rgvAY idget fenetreY fenetreFsetpixedize@QHHD ISHAY ushfutton outon@4imp mon outon 34D 8fenetreAY outonFsetpont@pont@4gomi ns w4D IRAAY outonFsetgursor@tXXointingrndgursorAY outonFsetson@son@4smileFpng4AAY outonFsetqeometry@THD SHD IVHD UHAY GG grtion d9un utre outon ynt pour prent le premier outon ushfutton utrefouton@4eutre outon4D 8outonAY utrefoutonFmove@QHD ISAY fenetreFshow@AY } return ppFexe@AY

sultt X notre outon est pl l9intrieur de l9utre outon @(gure PQFIQA 3

Figure PQFIQ ! n outon dns un outon

get exemple montre qu9il est don possile de pler un widget dns n9importe quel utre widgetD mme un outonF fien entenduD omme le montre m pture d9rnD e n9est ps trs mlin de fire el mis el prouve que t est trs )exileF

Des includes  oublis 


hns le ode soure prdentD nous vons utilis les lsses QWidgetD QFont et QIcon pour rer des ojetsF xormlementD nous devrions fire un include des (hiers d9enE tte de es lssesD en plus de QPushButton et QApplicationD pour que le ompilteur QVU

CHAPITRE 23.

PERSONNALISER LES WIDGETS

les onnisse X
5inlude 5inlude 5inlude 5inlude 5inlude `epplitionb `ushfuttonb `idgetb `pontb `sonb

Ah ben oui ! Si on n'a pas inclus le header de la classe QWidget, comment est-ce qu'on a pu crer tout l'heure un objet  fenetre  de type QWidget sans que le compilateur ne hurle la mort ?

g9tit un oup de hneF in fitD on vit inlus QPushButton et omme QPushButton hrite de QWidgetD il vit luiEmme inlus QWidget dns son hederF unt QFont et QIconD ils tient inlus eux ussi r indiretement utiliss pr QPushButtonF frefD prfoisD omme dns e sD on de l hne et el mrheF xormlementD si on fisit trs ien les hosesD on devrit fire un include pr lsse utiliseF g9est un peu lourd et il m9rrive d9en oulierF gomme el mrheD en gnrl je ne me pose ps trop de questionsF outefoisD si vous voulez tre srs d9inlure une onne fois pour toutes toutes les lsses du module  t qs D il vous su0t de fire X
5inlude `tquib

ve heder QtGui inlut son tour toutes les lsses du module qsD don QWidgetD QPushButtonD QFontD etF ettention toutefois rD du oupD l ompiltion ser un peu rlentieF

Hriter un widget
fonD rsumons 3 tusqu9iiD dns e hpitreD nous vons X ! ppris lire et modi(er les proprits d9un widgetD en voynt quelques exemples de proprits des outons Y ! douvert de quelle fon tient rhitetures les lsses de tD ve les multiples hritges Y ! douvert l notion de widget onteneur @un widget peut en ontenir d9utresA et rD pour nous entrnerD une fentre dns lquelle nous vons insr un outonF xous llons ii ller plus loin dns l personnlistion des widgets en  inventnt un nouveu type de widgetF in fitD nous llons rer une nouvelle lsse qui hrite de QWidget et reprsente notre fentreF grer une lsse pour grer l fentre vous prtr peutEtre un peu lourd u premier ordD mis 9est insi qu9on prode hque fois que l9on re des qs en yyF gel nous donner une plus grnde souplesse pr l suiteF QVV

HRITER UN WIDGET

v9hritge que l9on v fire ser don elui prsent sur l (gure PQFIRF

Figure PQFIR ! MaFenetre hrite de QWidget

ellonsEy 3 ui dit nouvelle lsse dit deux nouveux (hiers X ! MaFenetre.h X ontiendr l d(nition de l lsse Y ! MaFenetre.cpp X ontiendr l9implmenttion des mthodesF

dition des chiers


MaFenetre.h

oii le ode du (hier MaFenetre.hD nous llons le ommenter tout de suite prs X
5ifndef hipwepixii 5define hipwepixii 5inlude `epplitionb 5inlude `idgetb 5inlude `ushfuttonb lss wpenetre X puli idget GG yn hrite de idget @swyexA { puliX wpenetre@AY

QVW

CHAPITRE 23.

PERSONNALISER LES WIDGETS

}Y

privteX ushfutton BmoutonY

5endif

uelques petites explitions X


5ifndef hipwepixii 5define hipwepixii GG gontenu 5endif

ges lignes permettent d9viter que le heder ne soit inlus plusieurs foisD e qui pourrit provoquer des erreursF
5inlude `epplitionb 5inlude `idgetb 5inlude `ushfuttonb

gomme nous llons hriter de QWidgetD il est nessire d9inlure l d(nition de ette lsseF r illeursD nous llons utiliser un QPushButtonD don on inlut ussi le heder ssoiF unt QApplicationD on ne l9utilise ps ii mis on en ur esoin u prohin hpitreD je prpre un peu le terrinF
lss wpenetre X puli idget GG yn hrite de idget @swyexA {

g9est le dut de l d(nition de l lsseF i vous vous souvenez de l9hritgeD e que j9i fit l ne devrit ps trop vous hoquerF ve :publicQWidget signi(e que notre lsse hrite de QWidgetF xous ruprons don utomtiquement toutes les proprits de QWidgetF
puliX wpenetre@AY privteX ushfutton BmoutonY

ve ontenu de l lsse est trs simpleF xous rivons le prototype du onstruteur X 9est un prototype minimlD mis el nous su0rF ve onstruteur est puli rD s9il tit privD on ne pourrit jmis rer d9ojet prtir de ette lsse QWH

HRITER UN WIDGET

xous rons un ttriut m_bouton de type QPushButtonF xotez que eluiEi est un pointeurD il fudr don le  onstruire de mnire dynmique ve l9ide du motEl newF ous les ttriuts devnt tre privsD nous vons fit prder ette ligne d9un private: qui interdir ux utilisteurs de l lsse de modi(er diretement le outonF
MaFenetre.cpp

ve (hier .cpp ontient l9implmenttion des mthodes de l lsseF gomme notre lsse ne ontient qu9une mthode @le onstruteurAD le (hier .cpp ne ser don ps long rire X
5inlude 4wpenetreFh4 wpenetreXXwpenetre@A X idget@A { setpixedize@QHHD ISHAY GG gonstrution du outon mouton a new ushfutton@4imp mon outon 34D thisAY moutonEbsetpont@pont@4gomi ns w4D IRAAY moutonEbsetgursor@tXXointingrndgursorAY moutonEbsetson@son@4smileFpng4AAY moutonEbmove@THD SHAY

uelques explitions X
5inlude 4wpenetreFh4

g9est oligtoire pour inlure les d(nitions de l lsseF out el ne devrit ps tre nouveu pour vousD nous vons fit el de nomreuses fois dj dns l prtie prdente du oursF
wpenetreXXwpenetre@A X idget@A {

v9enEtte du onstruteurF sl ne fut ps oulier de le fire prder d9un MaFenetre:: pour que le ompilteur she quelle lsse eluiEi se rpporteF ve :QWidget() sert ppeler le onstruteur de QWidget en premier lieuF rfoisD on en pro(ter pour envoyer u onstruteur de QWidget quelques prmtres mis lD on v se ontenter du onstruteur pr dfutF
setpixedize@QHHD ISHAY

ien d9extrordinire X on d(nit l tille de l fentre de mnire (xeD pour interdire son redimensionnementF ous noterez qu9on n9 ps eu esoin d9rire fenetre.setFi QWI

CHAPITRE 23.

PERSONNALISER LES WIDGETS

xedSize(300,150);F

ourquoi c re qu9on est dans la classeF yn ne fit qu9ppeler une des mthodes de l lsse @setFixedSizeAD mthode qui pprtient QWidget et qui pprtient don ussi l lsse puisqu9on hrite de QWidgetF t9voueD j9voueD e n9est ps vident de ien se reprer u dutF ourtntD vous pouvez me roireD tout ei est logique et vous prtr plus lir fore de prtiquerF s de pnique don si vous vous dites  oh mon dieu je n9uris jmis pu deviner el F pitesEmoi on(ne 3
mouton a new ushfutton@4imp mon outon 34D thisAY

g9est l ligne l plus dlite de e onstruteurF siD nous onstruisons le outonF in e'etD dns le hederD nous nous sommes ontents de rer le pointeur mis il ne pointit vers rien jusqu9ii 3 ve new permet d9ppeler le onstruteur de l lsse QPus hButton et d9'eter une dresse u pointeurF eutre dtil un tout petit peu dlit X le motEl thisF te vous en vis prl dns l prtie prdente du oursD en vous disnt  fitesEmoi on(neD mme si el vous prt inutile mintenntD el vous ser indispensle plus trd F fonne nouvelle X 9est mintennt que vous douvrez un s o le motEl this nous est indispensle 3 in e'etD le seond prmtre du onstruteur doit tre un pointeur vers le widget prentF und nous fisions tout dns le mainD 9tit simple X il su0sit de donner le pointeur vers l9ojet fenetreF wis lD nous sommes dans la fentre 3 in e'etD nous rivons l lsse MaFenetreF g9est don  moi D l fentreD qui sers de widget prentF our donner le pointeur vers moiD il su0t d9rire le motEl thisF
Et toujours. . . main.cpp

fien entenduD que serit un progrmme sns son main c xe l9oulions ps eluiEl 3 v onne nouvelle 9est queD omme ien souvent dns les gros progrmmesD notre ma in v tre tout petitF idiulement petitF wirosopiqueF wiroique mmeF
5inlude `epplitionb 5inlude 4wpenetreFh4 int min@int rgD hr BrgvA { epplition pp@rgD rgvAY wpenetre fenetreY fenetreFshow@AY } return ppFexe@AY

yn n9 esoin d9inlure que deux heders r on n9utilise que deux lsses X QApplica tion et MaFenetreF QWP

HRITER UN WIDGET

ve ontenu du main est trs simple X on re un ojet de type MaFenetre et on l90he pr un ppel l mthode show()F g9est toutF vors de l rtion de l9ojet fenetreD le onstruteur de l lsse MaFenetre est ppelF hns son onstruteurD l fentre d(nit toute seule ses dimensions et les widgets qu9elle ontient @en l9oureneD juste un outonAF

La destruction automatique des widgets enfants


Minute papillon ! On a cr dynamiquement un objet de type QPushButton dans le constructeur de la classe MaFenetre. . . mais on n'a pas dtruit cet objet avec un delete !

in e'etD tout ojet r dynmiquement ve un new implique forment un delete quelque prtF ous vez ien retenu l leonF NormalementD on devrit rire le desE truteur de MaFenetreD qui ontiendrit ei X
wpenetreXX~wpenetre@A { delete moutonY }

g9est omme el qu9on doit fire en temps normlF outefoisD t supprimer utomE tiquement le outon lors de l destrution de l fentre @ l (n du mainAF in e'etD qund on supprime un widget prent @ii notre fentreAD t supprime utomtiquement tous les widgets qui se trouvent l9intrieur @tous les widgets enfntsAF g9est un des vntges d9voir dit que le QPushButton vit pour  prent l fentreF hs qu9on supprime l fentreD hopD t supprime tout e qu9elle ontient et donD fit le delete nessire du outonF t nous simpli(e l vie en nous vitnt d9voir rire tous les delete des widgets enfntsF x9ouliez psD nnmoinsD que tout new implique normlement un deleteF siD on pro(te du fit que t le fit pour nousF

Compilation
ve rsulttD si tout v ienD devrit tre le mme que tout l9heure @(gure PQFISA
Quoi ? Tout ce bazar pour la mme chose au nal ? ? ?

wis non mis non 3 in fitD on vient de rer des fondements euoup plus solides pour notre fentreF yn dj un peu plus doup notre ode @et voir un ode modulireD 9est ien 3A et on pourr pr l suite plus filement rjouter de nouveux widgets et surtoutF F F grer les vnements des widgets 3 QWQ

CHAPITRE 23.

PERSONNALISER LES WIDGETS

Figure PQFIS ! pentre ve outon entr

wis tout elD vous le douvrirezF F F u prohin hpitre 3


Petit exercice : essayez de modier (ou de surcharger) le constructeur de la classe MaFenetre pour qu'on puisse lui envoyer en paramtre la largeur et la hauteur de la fentre crer. Ainsi, vous pourrez alors dnir les dimensions de la fentre lors de sa cration dans le main.

En rsum
! t fournit des esseurs pour lire et modi(er les proprits des widgetsF einsiD text() renvoie l vleur de l9ttriut text et setText() permet de l modi(erF ! v doumenttion nous donne toutes les informtions dont nous vons esoin pour svoir omment modi(er les proprits de hque widgetF ! ves lsses de t utilisent intensivement l9hritgeF outes les lssesD quelques exeptions prsD hritent en rlit d9une superElsse ppele QObjectF ! yn peut pler un widget l9intrieur d9un utre widget X on prle lors de widgets onteneursF ! our tre le plus souple possileD il est reommnd de rer s propre lsse reprE sentnt une fentreF gette lsse hriter d9une lsse de t omme QWidget pour ruprer toutes les fontionnlits de se tF

QWR

Chapitre

24
Dicult :

Les signaux et les slots

ous commenons matriser petit petit la cration d'une fentre. Au chapitre prcdent, nous avons pos de solides bases pour le dveloppement ultrieur de notre application. Nous avons ralis une classe personnalise, hritant de QWidget. Nous allons maintenant dcouvrir le mcanisme des signaux et des slots, un principe propre Qt qui est clairement un de ses points forts. Il s'agit d'une technique sduisante pour grer les vnements au sein d'une fentre. Par exemple, si on clique sur un bouton, on voudrait qu'une fonction soit appele pour ragir au clic. C'est prcisment ce que nous apprendrons faire dans ce chapitre, qui va enn rendre notre application dynamique.

QWS

CHAPITRE 24.

LES SIGNAUX ET LES SLOTS

Le principe des signaux et slots


ve prinipe est plutt simple omprendre X une pplition de type qs rgit prtir d9vnementsF g9est e qui rend votre fentre dynmiqueF hns tD on prle de signux et de slotsD mis qu9estEe que 9est onrtement c g9est un onept invent pr tF oiiD en guise d9introdutionD une petite d(nition X ! Un signal X 9est un messge envoy pr un widget lorsqu9un vnement se produitF ixemple X on liqu sur un outonF ! Un slot X 9est l fontion qui est ppele lorsqu9un vnement s9est produitF yn dit que le signl ppelle le slotF gonrtementD un slot est une mthode d9une lsseF ixemple X le slot quit() de l lsse QApplication provoque l9rrt du progrmmeF ves signux et les slots sont onsidrs pr t omme des lments d9une lsse prt entireD en plus des ttriuts et des mthodesF oii un shm qui montre e qu9un ojet pouvit ontenir vnt tD insi que e qu9il peut ontenir mintennt qu9on utilise t @(gure PRFIAF

Figure PRFI ! n ojet ve des signux et des slots

evnt tD un ojet tit onstitu d9ttriuts et de mthodesF g9est toutF t rjoute en plus l possiilit d9utiliser e qu9il ppelle des signux et des slots (n de grer les vnementsF n signl est un messge envoy pr l9ojet @pr exemple  on liqu sur le outon AF n slot est uneF F F mthodeF in fitD 9est une mthode lssique omme toutes les utresD l di'rene prs qu9elle le droit d9tre onnete un signlF eve tD on dit que l9on onnete des signux et des slots entre euxF upposons que QWT

CONNEXION D'UN SIGNAL UN SLOT SIMPLE

vous yez deux ojetsD hun ynt ses propres ttriutsD mthodesD signux et slots @(gure PRFPAF

Figure PRFP ! hes signux et des slots

ur le shm PRFPD on onnet le signl I de l9ojet I ve le slot P de l9ojet PF


Il est possible de connecter un signal plusieurs slots. Ainsi, un clic sur un bouton pourrait appeler non pas une mais plusieurs mthodes. Comble du ranement, il est aussi possible de connecter un signal un autre signal. Le signal d'un bouton peut donc provoquer la cration du signal d'un autre widget, qui peut son tour appeler des slots (voire appeler d'autres signaux pour provoquer une raction en chane !). C'est un peu particulier et on ne verra pas cela dans ce chapitre.

Connexion d'un signal un slot simple


oyons un s trs onretF te vis prendre deux ojetsD l9un de type QPushButton et l9utre de type QApplicationF hns le shm PRFQD les inditions que vous voyez sont de vrais signaux et slots que vous llez pouvoir utiliserF

Figure PRFQ ! ignux et slots en prtique


1. Pour simplier, je n'ai pas reprsent les attributs et les mthodes sur mon schma.

QWU

CHAPITRE 24.

LES SIGNAUX ET LES SLOTS

egrdez ttentivement e shmF xous vons d9un t notre outon ppel m_bou ton @de type QPushButtonA et de l9utreD notre pplition @de type QApplicationD utilise dns le mainAF xous voudrions pr exemple onneter le signl  outon liqu u slot  quitter l9pplition F einsiD un li sur le outon provoquerit l9rrt de l9pplitionF our elD nous devons utiliser une mthode sttique de QObject X connect()F

Le principe de la mthode connect()


est une mthode sttiqueF ous vous souvenez e que el veut dire c ne mthode sttique est une mthode d9une lsse que l9on peut ppeler sns rer d9ojetF g9est en fit extement omme une fontion lssiqueF our ppeler une mthode sttiqueD il fut fire prder son intitul du nom de l lsse dns lquelle elle est dlreF gomme connect() pprtient l lsse QObjectD il fut don rire X
connect()
yjetXXonnet@AY

v mthode connect prend R rguments X ! un pointeur vers l9ojet qui met le signl Y ! le nom du signl que l9on souhite  interepter Y ! un pointeur vers l9ojet qui ontient le slot repteur Y ! le nom du slot qui doit s9exuter lorsque le signl se produitF sl existe ussi une mthode disconnect() permettnt de sser l onnexion entre deux ojets mis on n9en prler ps ii r on en rrement esoinF

Utilisation de la mthode connect() pour quitter


tre.cppAF

evenons u odeD et plus prisment u onstruteur de MaFenetre @(hier MaFene ejoutez ette ligne X
5inlude 4wpenetreFh4 wpenetreXXwpenetre@A X idget@A { setpixedize@QHHD ISHAY mouton a new ushfutton@4uitter4D thisAY moutonEbsetpont@pont@4gomi ns w4D IRAAY moutonEbmove@IIHD SHAY GG gonnexion du li du outon l fermeture de l9pplition yjetXXonnet@moutonD sqxev@liked@AAD qeppD vy@quit@AAAY }

QWV

CONNEXION D'UN SIGNAL UN SLOT SIMPLE

Cela signie que dans ce cas, et dans ce cas uniquement, on peut enlever le prxe QObject:: devant le connect() pour appeler la mthode statique. J'ai choisi de conserver ce prxe dans le cours pour rappeler qu'il s'agit d'une mthode statique mais sachez donc qu'il n'a rien d'obligatoire si la mthode est appele depuis une classe lle de QObject.

connect() est une mthode de la classe QObject. Comme notre classe MaFe netre hrite de QObject indirectement, elle possde elle aussi cette mthode.

tudions ttentivement ette ligne et plus prtiulirement les prmtres envoys connect() X ! m_bouton X 9est un pointeur vers le outon qui v mettre le signlF pileF ! SIGNAL(clicked()) X lD 9est ssez perturnt omme fon d9envoyer un prE mtreF in fitD sqxev@A est une mro du prproesseurF t trnsformer el en un ode  eptle pour l ompiltionF ve ut de ette tehnique est de vous fire rire un ode ourt et omprhensileF xe herhez ps omprendre omment t fit pour trnsformer le odeD e n9est ps notre prolmeF ! qApp X 9est un pointeur vers l9ojet de type QApplication que nous vons r dns le mainF h9o sort e pointeur c in fitD t re utomtiquement un pointeur ppel qApp vers l9ojet de type QApplication que nous vons rF ge pointeur est d(ni dns le heder <QApplication> que nous vons inlus dns MaFenetre.hF ! SLOT(quit()) X 9est le slot qui doit tre ppel lorsqu9on liqu sur le outonF v enoreD il fut utiliser l mro SLOT() pour que t trduise e ode  izrre en quelque hose de ompilleF ve slot quit() de notre ojet de type QApplication est un slot prdniF sl en existe d9utresD omme aboutQt() qui 0he une fentre  propos de t F rfoisD pour ne ps dire souventD les slots prd(nis pr t ne nous su0ront psF xous pprendrons dns l suite de e hpitre rer les ntresF estons notre ode 3 v fentre qui s9ouvre est prsente l (gure PRFRF

Figure PRFR ! v fentre ve le outon  uitter

ien de ien extrordinire premire vueF uf queF F F si vous liquez sur le ouE ton  uitter D le progrmme s9rrte 3 rourrD on vient de russir onneter notre premier signl un slot 3 QWW

CHAPITRE 24.

LES SIGNAUX ET LES SLOTS

Des paramtres dans les signaux et slots


v mthode sttique connect() est ssez originleD vous l9vez vuF sl s9git justement d9une des prtiulrits de t que l9on ne retrouve ps dns les utres iliothquesF ges utres iliothquesD omme wxidgets pr exempleD utilisent l ple de nomreuses mros et se servent du mnisme un peu omplexe et dlit des pointeurs de fontion @pour indiquer l9dresse de l fontion ppeler en mmoireAF sl y d9utres vntges utiliser l mthode connect() ve tF yn v ii douvrir que les signux et les slots peuvent s9hnger des prmtres 3

Dessin de la fentre
hns un premier tempsD nous llons pler de nouveux widgets dns notre fentreF ous pouvez enlever le outonD on ne v plus s9en servir iiF l pleD je souhite vous fire utiliser deux nouveux widgets X ! QSlider X un urseur qui permet de d(nir une vleur Y ! QLCDNumber X un widget qui 0he un nomreF yn v ller un peu plus viteD je vous donne diretement le ode pour rer elF out d9ordD le heder X
5ifndef hipwepixii 5define hipwepixii 5inlude 5inlude 5inlude 5inlude 5inlude `epplitionb `idgetb `ushfuttonb `vghxumerb `liderb

lss wpenetre X puli idget { puliX wpenetre@AY privteX vghxumer BmldY lider BmsliderY

}Y

5endif

gopier e ode gode we X IPSISV  t9i don enlev les outonsD omme vous pouvez le voirD et rjout un QLCDNumber et un QSliderF urtoutD n9ouliez ps d9inlure le heder de es lsses pour pouvoir les RHH

DES PARAMTRES DANS LES SIGNAUX ET SLOTS

utiliserF t9i grd ii l9inlude du QPushButtonD el ne fit ps de ml de le lisser misD si vous ne omptez ps le rutiliserD vous pouvez l9enlever sns rinteF it le (hier .cpp X
5inlude 4wpenetreFh4 wpenetreXXwpenetre@A X idget@A { setpixedize@PHHD IHHAY mld a new vghxumer@thisAY mldEbsetegmenttyle@vghxumerXXpltAY mldEbmove@SHD PHAY mslider a new lider@tXXrorizontlD thisAY msliderEbsetqeometry@IHD THD ISHD PHAY

gopier e ode gode we X TTVRRI  ves dtils ne sont ps trs importntsF t9i modi( le type d90heur vgh pour qu9il soit plus lisile @ve setSegmentStyleAF unt u sliderD j9i rjout un prmtre pour qu9il pprisse horizontlement @sinon il est vertilAF oil qui est fitF eve e odeD une petite fentre devrit s90her @(gure PRFSAF

Figure PRFS ! n 0heur vgh

Connexion avec des paramtres


wintenntF F F onnexiooooon 3 g9est l que les hoses deviennent intressntesF yn veut que l90heur vgh hnge de vleur en fontion de l position du urseur du sliderF yn dispose du signl et du slot suivnts X ! ve signl valueChanged(int) du QSlider X il est mis ds que l9on hnge l vleur du urseur du slider en le dplntF v prtiulrit de e signl est qu9il envoie un prmtre de type int @l nouvelle vleur du sliderAF ! ve slot display(int) du QLCDNumber X il 0he l vleur qui lui est psse en prmtreF RHI

CHAPITRE 24.

LES SIGNAUX ET LES SLOTS

v onnexion se fit ve le ode suivnt X


yjetXXonnet@msliderD sqxev@vlueghnged@intAAD mldD vy@disply@intAAA Y

fizrre n9estEe ps c sl su0t d9indiquer le type du prmtre envoyD ii un intD sns donner de nom e prmtreF t fit utomtiquement l onnexion entre le signl et le slot et  trnsmet le prmtre u slotF ve trnsfert de prmtre se fit omme sur l (gure PRFTF

Figure PRFT ! gonnexion de int int

siD il n9y qu9un prmtre trnsmettreD 9est don simpleF hez toutefois qu9il pourrit trs ien y voir plusieurs prmtresF
Le type des paramtres doit absolument correspondre ! Vous ne pouvez pas connecter un signal qui envoie (int, double) un slot qui reoit (int, int). C'est un des avantages du mcanisme des signaux et des slots : il respecte le type des paramtres. Veillez donc ce que les signatures soient identiques entre votre signal et votre slot. En revanche, un signal peut envoyer plus de paramtres un slot que celui-ci ne peut en recevoir. Dans ce cas, les paramtres supplmentaires seront ignors.

sultt X qund on hnge l vleur du sliderD le vgh 0he l vleur orrespondnte @(gure PRFUA 3

Figure PRFU ! n 0heur vgh gnre des vnements


Mais comment je sais, moi, quels sont les signaux et les slots que proposent chacune des classes ? Et aussi, comment je sais qu'un signal envoie un int en paramtre ?

v rponse devrit vous prtre simpleD les mis X l doD l doD l do 3 i vous regrdez l doumenttion de l lsse QLCDNumberD vous pouvez voir u dut RHP

DES PARAMTRES DANS LES SIGNAUX ET SLOTS

l liste de ses proprits @ttriutsA et ses mthodesF n peu plus sD vous vez l liste des slots @ uli lots A et des signux @ ignls A qu9elle possde 3   houmenttion de QLCDNumb
er gode 

we X QQHUT

Les signaux et les slots sont hrits comme les attributs et mthodes. Et c'est gnial, bien qu'un peu droutant au dbut. Vous noterez donc qu'en plus des slots propres QLCDNumber, celui-ci propose de nombreux autres slots qui ont t dnis dans sa classe parente QWidget, et mme des slots issus de QObject ! Vous pouvez par exemple lire :  19 public slots inherited from QWidget . N'hsitez pas consulter les slots (ou signaux) qui sont hrits des classes parentes. Parfois, on va vous demander d'utiliser un signal ou un slot que vous ne verrez pas dans la page de documentation de la classe : vriez donc si celui-ci n'est pas dni dans une classe parente !

Exercice
our vous entrnerD je vous propose de rliser une petite vrinte du ode soure prdentF eu lieu d90her le nomre ve un vghxumerD 0hezEle sous l forme d9une jolie rre de progression @(gure PRFVAF

Figure PRFV ! lider et progressr

te ne vous donne que Q inditions qui devrient vous su0re X ! v rre de progression est gre pr un QProgressBarF ! sl fut donner des dimensions l rre de progression pour qu9elle pprisse orE retementD l9ide de l mthode setGeometry() que l9on dj vue uprvntF ! ve slot repteur du QProgressBar est setValue(int)F sl s9git d9un de ses slots mis l doumenttion vous indique qu9il y en d9utresF r exempleD reset() remet zro l rre de progressionF ourquoi ne ps jouter un outon qui remettrit zro l rre de progression c g9est toutF fon ourge 3 RHQ

CHAPITRE 24.

LES SIGNAUX ET LES SLOTS

Crer ses propres signaux et slots


oii mintennt une prtie trs intressnteD ien que plus dliteF xous llons rer nos propres signux et slotsF in e'etD si en gnrl les signux et slots pr dfut su0sentD il n9est ps rre que l9on se dise  utD le signl @ou le slotA dont j9i esoin n9existe ps F g9est dns un s omme eluiEl qu9il devient indispensle de rer son widget personnlisF
Pour pouvoir crer son propre signal ou slot dans une classe, il faut que celle-ci drive directement ou indirectement de QObject. C'est le cas de notre classe MaFenetre : elle hrite de QWidget, qui hrite de QObject. On a donc le droit de crer des signaux et des slots dans MaFenetre.

xous llons ommener pr rer notre propre slotD puis nous verrons omment rer notre propre signlF

Crer son propre slot


te vous rppelle tout d9ord qu9un slot n9est rien d9utre qu9une mthode que l9on peut onneter un signlF xous llons don rer une mthodeD mis en suivnt quelques rgles un peu prtiuliresF F F
Le but du jeu

our nous entrnerD nous llons inventer un s o le slot dont nous vons esoin n9existe psF te vous propose de onserver le lider @je l9ime ien eluiElA et de ne grder que el sur l fentreF xous llons fire en sorte que le lider ontrle l lrgeur de l fentreF otre fentre doit ressemler l (gure PRFWF

Figure PRFW ! pentre ve slider

xous voulons que le signl valueChanged(int) du QSlider puisse tre onnet un slot de notre fentre @de type MaFenetreAF ge nouveu slot ur pour rle de modi(er l lrgeur de l fentreF gomme il n9existe ps de slot changerLargeur dns l lsse QWidgetD nous llons devoir le rerF our rer e slotD il v flloir modi(er un peu notre lsse MaFenetreF gommenons pr le hederF RHR

CRER SES PROPRES SIGNAUX ET SLOTS

Le header (MaFenetre.h)

hs que l9on doit rer un signl ou un slot personnlisD il est nessire de d(nir une mro dns le heder de l lsseF gette mro porte le nom de Q_OBJECT @tout en mjusulesA et doit tre ple tout u dut de l dlrtion de l lsse X
lss wpenetre X puli idget { yftig puliX wpenetre@AY privteX lider BmsliderY

}Y

our le momentD notre lsse ne d(nit qu9un ttriut @le QSliderD privA et une mthode @le onstruteurD puliAF v mro Q_OBJECT  prpre en quelque sorte le ompilteur epter un nouveu motEl X  slot F xous llons mintennt pouvoir rer une setion  slots D omme ei X
lss wpenetre X puli idget { yftig puliX wpenetre@AY puli slotsX void hngervrgeur@int lrgeurAY privteX lider BmsliderY

}Y

ous noterez l nouvelle setion  puli slots X je rends toujours mes slots pulisF yn peut ussi les mettre privs mis ils seront qund mme essiles de l9extrieur r t doit pouvoir ppeler un slot depuis n9importe quel utre widgetF prt elD le prototype de notre slotEmthode est tout fit lssiqueF sl ne nous reste plus qu9 l9implmenter dns le .cppF RHS

CHAPITRE 24.

LES SIGNAUX ET LES SLOTS

L'implmentation (MaFenetre.cpp)

v9implmenttion est d9une simpliit redoutleF egrdez X


void wpenetreXXhngervrgeur@int lrgeurA { setpixedize@lrgeurD IHHAY }

ve slot prend en prmtre un entier X l nouvelle lrgeur de l fentreF sl se ontente d9ppeler l mthode setFixedSize de l fentre et de lui envoyer l nouvelle lrgeur qu9il reueF
Connexion

fienD voil qui est fitF in(n presque X il fut enore onneter notre QSlider u slot de notre fentreF y vEtEon fire el c hns le onstruteur de l fentre @toujours dns MaFenetre.cppA X
wpenetreXXwpenetre@A X idget@A { setpixedize@PHHD IHHAY mslider a new lider@tXXrorizontlD thisAY msliderEbsetnge@PHHD THHAY msliderEbsetqeometry@IHD THD ISHD PHAY yjetXXonnet@msliderD sqxev@vlueghnged@intAAD thisD
vy@hngervrgeur@intAAAY }

t9i volontirement modi( les di'rentes vleurs que peut prendre notre slider pour le limiter entre PHH et THH ve l mthode setRange()F einsiD on est sr que l fentre ne pourr ni tre plus petite que PHH pixels de lrgeurD ni dpsser THH pixels de lrgeurF v onnexion se fit entre le signl valueChanged(int) de notre QSlider et le slot changerLargeur(int) de notre lsse MaFenetreF ous voyez l enore un exemple o this est indispensle X il fut pouvoir indiquer un pointeur vers l9ojet tuel @l fentreA et seul this peut fire el 3 hmtiquementD on rlis l onnexion prsente l (gure PRFIHF ous pouvez en(n dmirer le rsultt @(gure PRFIIAF emusezEvous redimensionner l fentre omme on vous semle ve le sliderF gomme nous vons (x les limites du slider entre PHH et THHD l lrgeur de l fentre rester omprise entre PHH et THH pixelsF RHT

CRER SES PROPRES SIGNAUX ET SLOTS

Figure PRFIH ! gonnexion entre le slider et l fentre

Figure PRFII ! ve slider lrgit l fentre


Exercice : redimensionner la fentre en hauteur

oii un petit exerieD mis qui v vous forer trviller F te vous propose de rer un seond QSliderD vertil ette foisD qui ontrler l huteur de l fentreF ensez ien d(nir des limites ppropries pour les vleurs de e nouveu sliderF ous devriez otenir un rsultt qui ressemle l (gure PRFIPF i vous voulez  onserver l lrgeur pendnt que vous modi(ez l huteurD et inverE sementD vous urez esoin d9utiliser les mthodes esseur width() @lrgeur tuelleA et height() @huteur tuelleAF ous omprendrez trs ertinement l9intrt de es informtions lorsque vous oderezF eu oulot 3
2

Crer son propre signal


sl est plus rre d9voir rer son signl que son slot mis el peut rriverF te vous propose de rliser le progrmme suivnt X si le slider horizontl rrive s vE leur mximle @THH dns notre sAD lors on met un signl agrandissementMaxF xotre fentre doit pouvoir mettre l9informtion indiqunt qu9elle est grndie u mximumF eprsD nous onneterons e signl un slot pour vri(er que notre progrmme rgit orretementF
2. Bande de fainants, vous me regardez faire depuis tout l'heure ! ;-)

RHU

CHAPITRE 24.

LES SIGNAUX ET LES SLOTS

Figure PRFIP ! n slider vertil


Le header (MaFenetre.h)

gommenons pr hnger le heder X


lss wpenetre X puli idget { yftig puliX wpenetre@AY puli slotsX void hngervrgeur@int lrgeurAY signlsX void grndissementwx@AY privteX lider BmsliderY

}Y

yn jout une setion signalsF ves signux se prsentent en prtique sous forme de mthodes @omme les slotsA l di'rene prs qu9on ne les implmente ps dns le .cppF in e'etD 9est t qui le fit pour nousF i vous tentez d9implmenter un signlD vous urez une erreur du genre  Multiple definition of... F n signl peut psser un ou plusieurs prmtresF hns notre sD il n9en envoie uunF n signl doit toujours renvoyer voidF RHV

CRER SES PROPRES SIGNAUX ET SLOTS

L'implmentation (MaFenetre.cpp)

wintennt que notre signl est d(niD il fut que notre lsse puisse l9mettre un momentF und estEe qu9on sit que l fentre t grndie u mximum c hns le slot changerLargeur 3 sl su0t de vri(er dns e slot si l lrgeur orrespond u mximum @THHA et d9mettre lors le signl  ouhouD j9i t grndie u mximum 3 F etournons dns MaFenetre.cpp et implmentons e test qui met le signl depuis changerLargeur X
void wpenetreXXhngervrgeur@int lrgeurA { setpixedize@lrgeurD height@AAY if @lrgeur aa THHA { emit grndissementwx@AY }

xotre mthode s9oupe toujours de redimensionner l fentre mis vri(e en plus si l lrgeur tteint le mximum @THHAF i 9est le sD elle met le signl agrandissemen tMax()F our mettre un signlD on utilise le motEl emitD l enore un terme invent pr t qui n9existe ps en gCCF v9vntge est que 9est trs lisileF
Ici, notre signal n'envoie pas de paramtre. Toutefois, sachez que si vous voulez envoyer un paramtre, c'est trs simple. Il sut d'appeler votre signal comme ceci : emit monSignal(parametre1, parametre2, ...);
Connexion

sl ne nous reste plus qu9 onneter notre nouveu signl un slotF ous pouvez onneE ter e signl u slot que vous voulezF te propose de le onneter l9pplition @ l9ide du pointeur glol qAppA pour provoquer l9rrt du progrmmeF gel n9 ps trop de sensD je suis d9ordD mis 9est juste pour s9entrner et vri(er que el fontionneF ous urez l9osion de fire des onnexions plus logiques plus trdD je ne m9en fis ps pour elF hns le onstruteur de MaFenetreD je rjoute don X
yjetXXonnet@thisD sqxev@grndissementwx@AAD qeppD vy@quit@AAAY

ous pouvez tester le rsultt X normlementD le progrmme s9rrte qund l fentre est grndie u mximumF ve shm des signux qu9on vient d9mettre et de onneter est prsent en (gure PRFIQF RHW

CHAPITRE 24.

LES SIGNAUX ET LES SLOTS

Figure PRFIQ ! hnge de signux entre ojets

hns l9ordreD voii e qui s9est pss X IF ve signl valueChanged du slider ppel le slot changerLargeur de l fentreF PF ve slot fit e qu9il vit fire @hnger l lrgeur de l fentreA et vri( que l fentre tit rrive s tille mximleF vorsque el t le sD le signl personnlis agrandissementMax() t misF QF ve signl agrandissementMax() de l fentre tit onnet u slot quit() de l9pplitionD e qui provoqu l fermeture du progrmmeF it voil omment le dplement du slider peutD pr rtion en hneD provoquer l fermeture du progrmme 3 fien entenduD e shm peut tre mng et omplexi( selon les esoins de votre pplitionF wintennt que vous svez rer vos propres signux et slotsD vous vez toute l souE plesse nessire pour fire e que vous voulez 3

En rsum
! t propose un mnisme d9vnements de type signux et slots pour onneter des widgets entre euxF vorsqu9un widget met un signlD eluiEi est rupr pr un utre widget dns son slotF ! yn peut pr exemple onneter le signl  outon liqu u slot  ouverture d9une fentre F ! ves signux et les slots peuvent tre onsidrs omme un nouveu type d9lment u sein des lssesD en plus des ttriuts et mthodesF ! v onnexion entre les lments se fit l9ide de l mthode sttique connect()F ! sl est possile de rer ses propres signux et slotsF

RIH

Chapitre

25
Dicult :

Les botes de dialogue usuelles

prs un chapitre sur les signaux et les slots riche en nouveaux concepts, on relche ici un peu la pression. Nous allons dcouvrir les botes de dialogue usuelles, aussi appeles common dialogs par nos amis anglophones. Qu'est-ce qu'une bote de dialogue usuelle ? C'est une fentre qui sert remplir une fonction bien prcise. Par exemple, on connat la bote de dialogue  message  qui ache un message et ne vous laisse d'autre choix que de cliquer sur le bouton OK. Ou encore la bote de dialogue  ouvrir un chier ,  enregistrer un chier ,  slectionner une couleur , etc. On ne s'amuse pas recrer  la main  ces fentres chaque fois. On prote de fonctions systme pour ouvrir des botes de dialogue pr-construites. De plus, Qt s'adapte l'OS pour acher une bote de dialogue qui corresponde aux formes habituelles de votre OS.

RII

CHAPITRE 25.

LES BOTES DE DIALOGUE USUELLES

Acher un message
ve premier type de ote de dilogue que nous llons voir est le plus ournt X l ote de dilogue  0her un messge F xous llons rer sur notre fentre de type MaFenetre un outon qui ppeller un slot personnlisF ge slot ouvrir l ote de dilogueF in lirD un li sur le outon doit pouvoir ouvrir l ote de dilogueF ves otes de dilogue  0her un messge sont ontrles pr l lsse QMessageBoxF ous pouvez ommener pr fire l9include orrespondnt dns MaFenetre.h pour ne ps l9oulier X #include<QMessageBox>F

Quelques rappels et prparatifs


our que l9on soit sr de trviller ensemle sur le mme odeD je vous donne le ode soure des (hiers MaFenetre.h et MaFenetre.cpp sur lesquels je vis trvillerF sls ont t simpli(s u mximum histoire d9viter le super)uF
GG wpenetreFh 5ifndef hipwepixii 5define hipwepixii 5inlude 5inlude 5inlude 5inlude `epplitionb `idgetb `ushfuttonb `wessgefoxb

lss wpenetre X puli idget { yftig puliX wpenetre@AY puli slotsX void ouvrirhilogue@AY privteX ushfutton BmoutonhilogueY

}Y

5endif

gopier e ode gode we X UQIQUS  RIP

AFFICHER UN MESSAGE

GG wpenetreFpp 5inlude 4wpenetreFh4 wpenetreXXwpenetre@A X idget@A { setpixedize@PQHD IPHAY moutonhilogue a new ushfutton@4yuvrir l ote de dilogue4D thisAY moutonhilogueEbmove@RHD SHAY yjetXXonnet@moutonhilogueD sqxev@liked@AAD thisD vy@ouvrirhi logue@AAAY } void wpenetreXXouvrirhilogue@A { GG ous insrerez ii le ode d9ouverture des otes de dilogue }

gopier e ode gode we X PWIPPQ  g9est trs simpleF xous vons r dns l ote de dilogue un outon qui ppelle le slot personnlis ouvrirDialogue()F g9est dns e slot que nous nous hrgerons d9ouvrir une ote de dilogueF eu s o ertins se poserient l questionD notre main.cpp n9 ps hng X
GG minFpp 5inlude `epplitionb 5inlude 4wpenetreFh4 int min@int rgD hr BrgvA { epplition pp@rgD rgvAY wpenetre fenetreY fenetreFshow@AY } return ppFexe@AY

Ouvrir une bote de dialogue avec une mthode statique


fienD ple l9tion mintennt 3 v lsse QMessageBox permet de rer des ojets de type QMessageBox @omme toute RIQ

CHAPITRE 25.

LES BOTES DE DIALOGUE USUELLES

lsse qui se respeteA mis on utilise mjoritirement ses mthodes sttiquesD pour des risons de simpliitF xous ommenerons don pr douvrir les mthodes sttiquesD qui se omportent @je le rppelleA omme de simples fontionsF illes ne nessiteront ps de rer d9ojetF
QMessageBox::information

v mthode sttique information() permet d9ouvrir une ote de dilogue onstitue d9une ine  informtion F on prototype est le suivnt X
tndrdfutton informtion @ idget B prentD onst tring 8 titleD onst tring 8 textD tndrdfuttons uttons a ykD tndrdfutton defultfutton a xofutton AY

euls les trois premiers prmtres sont oligtoiresD les utres yntD omme vous le voyezD des vleurs pr dfutF ges trois premiers prmtres sont X ! parent X un pointeur vers l fentre prente @qui doit tre de type QWidget ou hriter de QWidgetAF ous pouvez envoyer NULL en prmtre si vous ne voulez ps que votre ote de dilogue it une fentre prenteD mis e ser plutt rreF ! title X le titre de l ote de dilogue @0h en hut de l fentreAF ! text X le texte 0h u sein de l ote de dilogueF estons don un ode trs simpleF oii le ode du slot ouvrirDialogue() X
void wpenetreXXouvrirhilogue@A { wessgefoxXXinformtion@thisD 4itre de l fentre4D 4fonjour et ienvenue tous les ros 34AY }

v9ppel de l mthode sttique se fit don omme elui d9une fontion lssiqueD l di'rene prs qu9il fut mettre en pr(xe le nom de l lsse dns lquelle elle est d(nie @d9o le QMessageBox:: vntAF ve rsultt est une ote de dilogue omme vous vez l9hitude d9en voirD onstitue d9un outon yu @(gure PSFIAF
Vous noterez que, lorsque la bote de dialogue est ouverte, on ne peut plus accder sa fentre parente en arrire-plan. On dit que la bote de dialogue est une fentre modale : c'est une fentre qui  bloque  temporairement son parent en attente d'une rponse de l'utilisateur. l'inverse, on dit qu'une fentre est non modale quand on peut toujours accder la fentre derrire. C'est le cas en gnral des botes de dialogue  Rechercher un texte  dans les diteurs de texte.

gomle du r0nementD il est mme possile de mettre en forme son messge l9ide de lises @ArwvD pour eux qui onnissentF RIR

AFFICHER UN MESSAGE

Figure PSFI ! fote de dilogue informtion

ixemple de ote de dilogue  enrihie ve du ode rwv @(gure PSFPA X


wessgefoxXXinformtion@thisD 4itre de l fentre4D 4fonjour et ienvenue `strongbtous les ros 3`Gstrongb4AY

Figure PSFP ! fote de dilogue informtion ve rwv


QMessageBox::warning

i l ote de dilogue  informtion sert informer l9utilisteur pr un messgeD l ote de dilogue warning le met en grde ontre quelque hoseF ille est gnrlement ompgn d9un  ding rtristiqueF ille s9utilise de l mme mnire que QMessageBox::information misD ette foisD l9ine hnge @(gure PSFQA X
wessgefoxXXwrning@thisD 4itre de l fentre4D 4ettentionD vous tes peutE tre un ro 34AY

QMessageBox::critical

und 9est trop trd et qu9une erreur s9est produiteD il ne vous reste plus qu9 utiliser l mthode sttique critical() @(gure PSFRA X RIS

CHAPITRE 25.

LES BOTES DE DIALOGUE USUELLES

Figure PSFQ ! fote de dilogue ttention


wessgefoxXXritil@thisD 4itre de l fentre4D 4ous n9tes ps un roD sortez d9ii ou j9ppelle l polie 34AY

Figure PSFR ! fote de dilogue erreur ritique


QMessageBox::question

i vous vez une question poser l9utilisteurD 9est l ote de dilogue qu9il vous fut @(gure PSFSA 3
wessgefoxXXquestion@thisD 4itre de l fentre4D 4hites voirD je me posis l question omme elD tesEvous vriment un ro c4AY

Figure PSFS ! fote de dilogue question


C'est bien joli mais. . . comment peut-on rpondre la question avec un simple bouton OK ?

r dfutD 9est toujours un outon yu qui s90heF wis dns ertins sD omme lorsqu9on pose une questionD il fudr 0her d9utres outons pour que l ote de dilogue it du sensF RIT

AFFICHER UN MESSAGE

Personnaliser les boutons de la bote de dialogue


our personnliser les outons de l ote de dilogueD il fut utiliser le qutrime prmtre de l mthode sttiqueF ge prmtre epte une ominison de vleurs prd(niesD spres pr un y @l rre vertile |AF yn ppelle el des agsF
Pour ceux qui se poseraient la question, le cinquime et dernier paramtre de la fonction permet d'indiquer quel est le bouton par dfaut. On change rarement cette valeur car Qt choisit gnralement comme bouton par dfaut celui qui convient le mieux.

v liste des )gs disponiles est donne pr l doumenttionF gomme vous pouvez le voirD vous vez du hoixF i on veut pler les outons  yui et  xon D il nous su0t de ominer les vleurs QMessageBox::Yes et QMessageBox::NoF  viste des )gs gode we X VHWVUU 
wessgefoxXXquestion@thisD 4itre de l fentre4D 4hites voirD je me posis l question omme elD tesEvous vriment un ro c4D wessgefoxXXes | wessgefoxXXxoAY

ves outons pprissent lors @(gure PSFTAF

Figure PSFT ! fote de dilogue question ve les outons


Horreur ! Maldiction ! Enfer et damnation ! L'anglais me poursuit, les boutons sont crits en anglais. Catastrophe, qu'est-ce que je vais faire, au secouuuuuurs ! ! !

in e'etD les outons sont rits en nglisF wis e n9est ps grve du toutD les ppliE tions t peuvent tre filement trduitesF yn ne v ps entrer dns les dtils du fontionnement de l trdutionF te vis vous donner un ode pler dns le (hier main.cpp et vous llez l9utiliser gentiment sns poser de questionsF YEA
GG minFpp 5inlude `epplitionb

RIU

CHAPITRE 25.

LES BOTES DE DIALOGUE USUELLES

5inlude `rnsltorb 5inlude `voleb 5inlude `virrysnfob 5inlude 4wpenetreFh4 int min@int rgD hr BrgvA { epplition pp@rgD rgvAY tring lole a voleXXsystem@AFnme@AFsetion@99D HD HAY rnsltor trnsltorY trnsltorFlod@tring@4qt4A C loleD virrysnfoXXlotion@
virrysnfoXXrnsltionsthAAY

ppFinstllrnsltor@8trnsltorAY wpenetre fenetreY fenetreFshow@AY } return ppFexe@AY

gopier e ode gode we X IHQHUS  ves lignes joutes ont t surlignesF sl y plusieurs includes et quelques lignes de ode supplmentires dns le mainF xormlementD votre pplition devrit mintennt 0her des outons en frnis @(gure PSFUAF

Figure PSFU ! fote de dilogue question en frnis

it voil le trvil 3
C'est cool, mais comment je fais pour savoir sur quel bouton l'utilisateur a cliqu ?

gette question est pertinenteD il fut que j9y rpondeF XEA RIV

AFFICHER UN MESSAGE

Rcuprer la valeur de retour de la bote de dialogue


ves mthodes sttiques que nous venons de voir renvoient un entier @intAF yn peut tester filement l signi(tion de e nomre l9ide des vleurs prd(nies pr tF
void wpenetreXXouvrirhilogue@A { int reponse a wessgefoxXXquestion@thisD 4snterrogtoire4D 4hites voirD je me posis l question omme elD tesEvous vriment un ro c4D wessgefox XXes | wessgefoxXXxoAY if @reponse aa wessgefoxXXesA { wessgefoxXXinformtion@thisD 4snterrogtoire4D 4elors ienvenue hez les ros 34AY } else if @reponse aa wessgefoxXXxoA { wessgefoxXXritil@thisD 4snterrogtoire4D 4riheur 3 wenteur 3 oleur 3 sngrt 3 vhe 3 rtre 3nors d9ii ou j9ppelle l polie 34AY } }

oii un shm de e qui peut se psser @(gure PSFVAF

Figure PSFV ! ritement du retour de l ote de dilogue

g9est m foi lirD non c


Petite prcision quand mme : le type de retour exact de la mthode n'est pas int mais QMessageBox::StandardButton. Il s'agit de ce qu'on appelle une numration. C'est une faon plus lisible d'crire un nombre dans un code.

RIW

CHAPITRE 25.

LES BOTES DE DIALOGUE USUELLES

Saisir une information


ves otes de dilogue prdentes tient un peu limites rD prt prsenter di'rents outonsD on ne pouvit ps trop intergir ve l9utilisteurF i vous souhitez que votre utilisteur sisisse une informtionD ou enore fsse un hoix prmi une listeD les otes de dilogue de sisie sont idlesF illes sont gres pr l lsse QInputDialogD que je vous onseille d9inlure ds mintennt dns MaFenetre. hF ves otes de dilogue  sisir une informtion peuvent tre de qutre types X IF sisir un texte X QInputDialog::getText() Y PF sisir un entier X QInputDialog::getInteger() Y QF sisir un nomre diml X QInputDialog::getDouble() Y RF hoisir un lment prmi une liste X QInputDialog::getItem()F xous nous onentrerons ii sur l sisie de texte mis vous vous rendrez ompte que l sisie des utres lments est reltivement proheF v mthode sttique QInputDialog::getText() ouvre une ote de dilogue qui perE met l9utilisteur de sisir un texteF on prototype est X
tring snputhilogXXgetext @ idget B prentD onst tring 8 titleD onst tring 8 lelD vineiditXXihowode mode a vineiditXXxormlD onst tring 8 text a tring@AD ool B ok a HD tXXindowplgs f a H AY

ous pouvez tout d9ord onstter que l mthode renvoie un QStringD 9estEEdire une hne de rtres de tF ves prmtres signi(entD dns l9ordre X ! parent X pointeur vers l fentre prenteF eut tre mis NULL pour ne ps indiquer de fentre prenteF ! title X titre de l fentreD 0h en hutF ! label X texte 0h dns l fentreF ! mode X mode d9dition du texteF ermet de dire si on veut que les lettres s90hent qund on tpeD ou si elles doivent tre remples pr des strisques @pour les mots de psseA ou si uune lettre ne doit s90herF outes les options sont dns l douE menttionF r dfutD les lettres s90hent normlement @QLineEdit::NormalAF ! text X texte pr dfut dns l zone de sisieF ! ok X pointeur vers un oolen pour que t puisse vous dire si l9utilisteur liqu sur yu ou sur ennulerF ! f X quelques )gs @optionsA permettnt d9indiquer si l fentre est modle @loqunteA ou psF ves vleurs possiles sont dtilles pr l doumenttionF reureusementD omme vous pouvez le onstter en lisnt le prototypeD ertins prE mtres possdent des vleurs pr dfutD e qui les rend fulttifsF eprenons notre ode de tout l9heure et ette foisD u lieu d90her une QMessageBoxD nous llons 0her une QInputDialog lorsqu9on lique sur le outon de l fentreF RPH

SAISIR UNE INFORMATION

void wpenetreXXouvrirhilogue@A { tring pseudo a snputhilogXXgetext@thisD 4seudo4D 4uel est votre pseudo c4AY }

in une ligneD je re un QString et je lui 'ete diretement l vleur renvoye pr l mthode getText()F t9uris ussi ien pu fire l mme hose en deux lignesF v ote de dilogue devrit ressemler l (gure PSFWF

Figure PSFW ! isie de texte

yn peut ller plus loin et vri(er si le outon yu t tionnF i 9est le sD on peut lors 0her le pseudo de l9utilisteur dns une QMessageBoxF
void wpenetreXXouvrirhilogue@A { ool ok a flseY tring pseudo a snputhilogXXgetext@thisD 4seudo4D 4uel est votre pseudo c4D vineiditXXxormlD tring@AD 8okAY if @ok 88 3pseudoFisimpty@AA { wessgefoxXXinformtion@thisD 4seudo4D 4fonjour 4 C pseudo C 4D v c4AY } else { wessgefoxXXritil@thisD 4seudo4D 4ous n9vez ps voulu donner votre nomFFF snifF4AY } }

siD on re un oolen qui reoit l9informtion  eEtEon liqu sur le outon yu c F our pouvoir l9utiliser dns l mthode getTextD il fut donner tous les prmtres qui sont vntD mme eux qu9on ne souhite pourtnt ps hnger 3 g9est un des dfuts des prmtres pr dfut en gCC X si le prmtre que vous voulez renseigner est tout l (n @ droiteAD il fudr lors solument renseigner tous les prmtres qui sont vnt 3 t9i don envoy des vleurs pr dfut ux prmtres qui tient vntD svoir mode et textF RPI

CHAPITRE 25.

LES BOTES DE DIALOGUE USUELLES

gomme j9i donn l mthode un pointeur vers mon oolenD elleEi v le remplir pour indiquer si oui ou non il y eu un li sur le outonF te peux ensuite fire un testD d9o l prsene de mon ifF te vri(e P hoses X ! si on liqu sur le outon yu Y ! et si le texte n9est ps vide F i un pseudo t sisi et que l9utilisteur liqu sur yuD lors une ote de dilogue lui souhite l ienvenueF inonD une erreur est 0heF ve shm PSFIH prsente e qui peut se produireF
1

Figure PSFIH ! hm des possiilits de rtion du progrmme getText


Exercice X essyez d90her le pseudo de l9utilisteur quelque prt sur l fentre mreD

pr exemple sur le outonF

Slectionner une police


v ote de dilogue  letionner une polie est une des otes de dilogue stndrd les plus onnuesF xul doute que vous l9vez dj renontre dns l9un de vos progrmmes fvoris @(gure PSFIIAF v ote de dilogue de sletion de polie est gre pr l lsse QFontDialogF gelleE i propose en gros une seule mthode sttique surhrge @il y plusieurs fons de l9utiliserAF renons le prototype le plus ompliquD juste pour l forme X
pont getpont @ ool B okD onst pont 8 initilD idget B prentD onst tring 8 ption A
1. La mthode isEmpty de QString sert cela.

RPP

SLECTIONNER UNE POLICE

Figure PSFII ! pentre de sletion de polie

ves prmtres sont normlement ssez files omprendreF yn retrouve le pointeur vers un oolen okD qui permet de svoir si l9utilisteur liqu sur yu ou nnulF yn peut spi(er une polie pr dfut @initialAD il fudr envoyer un ojet de type QFontF oil justement que l lsse QFont rpprt 3 r illeursD l hne caption orrespond u messge qui ser 0h en hut de l fentreF in(nD et surtoutD l mthode renvoie un ojet de type QFont orrespondnt l polie qui t hoisieF estons 3 ristoire d9ller un peu plus loinD je propose que l polie que nous urons sletionne soit immditement pplique u texte de notre outonD pr l9intermdiire de l mthode setFont() que nous vons ppris utiliser il y quelques hpitresF
void wpenetreXXouvrirhilogue@A { ool ok a flseY pont polie a ponthilogXXgetpont@8okD moutonhilogueEbfont@AD thisD 4ghoisissez une polie4AY if @okA { moutonhilogueEbsetpont@polieAY }

v mthode getFont prend omme polie pr dfut elle qui est utilise pr notre outon m_boutonDialogue @rppelezEvousD font() est une mthode esseur qui renE RPQ

CHAPITRE 25.

LES BOTES DE DIALOGUE USUELLES

voie un QFontAF yn teste si l9utilisteur ien vlid l fentre etD si 9est le sD on pplique u outon l polie qui vient d9tre hoisieF g9est l9vntge de trviller ve les lsses de t X elles sont ohrentesF v mthode getFont renvoie un QFont et e QFontD nous pouvons l9envoyer notre tour notre outon pour qu9il hnge d9ppreneF ve rsultt c ve voii en (gure PSFIPF

Figure PSFIP ! ghoix de polie

ettention X le outon ne se redimensionne ps tout seulF ous pouvez de se le rendre plus lrge si vous voulezD ou ien le redimensionner prs le hoix de l polieF RPR

SLECTIONNER UNE COULEUR

Slectionner une couleur


hns l mme veine que l sletion de polieD nous onnissons prolement tous l ote de dilogue  letion de ouleur @(gure PSFIQAF

Figure PSFIQ ! pentre de sletion de ouleur

tilisez l lsse QColorDialog et s mthode sttique getColor()F


golor golorhilogXXgetgolor @ onst golor 8 initil a tXXwhiteD idget B prent a H AY

ille renvoie un ojet de type QColorF ous pouvez priser une ouleur pr dfutD en envoynt un ojet de type QColor ou en utilisnt une des onstntes prd(niesD fournies dns l doumenttionF in l9sene de prmtreD 9est l ouleur lnhe qui est sletionneD omme nous l9indique le prototypeF i on veut tester le rsultt en ppliqunt l nouvelle ouleur u outonD 9est un petit peu ompliquF in e'etD il n9existe ps de mthode setColor pour les widgets mis une mthode setPalette qui sert indiquer une plette de ouleursF sl fudr vous renseigner dns e s sur l lsse QPaletteF ve ode que je vous propose iEdessous ouvre une ote de dilogue de sletion de ouleurD puis re une plette o l ouleur du texte orrespond l ouleur qu9on vient de sletionnerD et en(n pplique ette plette u outon X
void wpenetreXXouvrirhilogue@A { golor ouleur a golorhilogXXgetgolor@tXXwhiteD thisAY lette pletteY

RPS

CHAPITRE 25.

LES BOTES DE DIALOGUE USUELLES

pletteFsetgolor@letteXXfuttonextD ouleurAY moutonhilogueEbsetlette@pletteAY

te ne vous demnde ps ii de omprendre omment fontionne QPaletteD qui est d9illeurs une lsse que je ne dtilleri ps plus dns le oursF vous de vous renseiE gner son sujet si elle vous intresseF ve rsultt de l9pplition est prsent en (gure PSFIRF

Figure PSFIR ! letion d9une ouleur

RPT

SLECTION D'UN FICHIER OU D'UN DOSSIER

Slection d'un chier ou d'un dossier


ellezD plus que l sletion de (hiers et de dossiers et on ur fit le tour d9 peu prs toutes les otes de dilogue usuelles qui existent 3 v sletion de (hiers et de dossiers est gre pr l lsse QFileDialog qui propose elle ussi des mthodes sttiques files utiliserF gette setion ser divise en Q prties X ! sletion d9un dossier existnt Y ! ouverture d9un (hier Y ! enregistrement d9un (hierF

Slection d'un dossier (QFileDialog::getExistingDirectory)


sl su0t d9ppeler l mthode sttique ussi simplement que el X
tring dossier a pilehilogXXgetixistinghiretory@thisAY

ille renvoie un QString ontennt le hemin omplet vers le dossier demndF v fentre qui s9ouvre devrit ressemler l (gure PSFISF

Figure PSFIS ! letionner un dossier

Ouverture d'un chier (QFileDialog::getOpenFileName)


v lre ote de dilogue  yuverture d9un (hier est gre pr getOpenFileNa me()F ns prmtre prtiulierD l ote de dilogue permet d9ouvrir n9importe quel (hierF ous pouvez nnmoins rer un (ltre @en dernier prmtreA pour 0her pr exemple uniquement les imgesF RPU

CHAPITRE 25.

LES BOTES DE DIALOGUE USUELLES

ge ode demnde d9ouvrir un (hier imgeF ve hemin vers le (hier est stok dns un QStringD que l9on 0he ensuite via une QMessageBox X
void wpenetreXXouvrirhilogue@A { tring fihier a pilehilogXXgetypenpilexme@thisD 4yuvrir un fihier4D tring@AD 4smges @BFpng BFgif BFjpg BFjpegA4AY wessgefoxXXinformtion@thisD 4pihier4D 4ous vez sletionn Xn4 C fihierAY }

ve troisime prmtre de getOpenFileName est le nom du rpertoire pr dfut dns lequel l9utilisteur est plF t9i liss l vleur pr dfut @QString()D e qui quivut rire ""AD don l ote de dilogue 0he pr dfut le rpertoire dns lequel est situ le progrmmeF qre u qutrime prmtreD j9i hoisi de (ltrer les (hiersF eules les imges de type xqD qspD tq et tiq s90heront @(gure PSFITAF

Figure PSFIT ! yuvrir un (hier

v fentre n(ie de toutes les options que propose votre yD dont l90hge des imges sous forme de minituresF vorsque vous liquez sur  yuvrir D le hemin est enregistr dns un QString qui s90he ensuite dns une ote de dilogue @(gure PSFIUAF RPV

SLECTION D'UN FICHIER OU D'UN DOSSIER

Figure PSFIU ! ve (hier sletionn s90he


Le principe de cette bote de dialogue est de vous donner le chemin complet vers le chier, mais pas d'ouvrir ce chier. C'est vous, ensuite, de faire les oprations ncessaires pour ouvrir le chier et l'acher dans votre programme.

Enregistrement d'un chier (QFileDialog::getSaveFileName)


g9est le mme prinipe que l mthode prdenteD l di'rene prs queD pour l9enE registrementD l personne peut ette fois spi(er un nom de (hier qui n9existe psF ve outon  yuvrir est rempl pr  inregistrer @(gure PSFIVAF
tring fihier a pilehilogXXgetvepilexme@thisD 4inregistrer un fihier4D tring@AD 4smges @BFpng BFgif BFjpg BFjpegA4AY

En rsum
! t permet de rer filement des otes de dilogue usuelles X informtionD questionD erreurD polieD ouleurD etF ! v pluprt de es otes de dilogue s9ouvrent l9ide d9une mthode sttiqueF ! veur usge est simpleD tnt qu9on prend ien le soin de lire l doumenttion pour omprendre omment ppeler les fontionsF

RPW

CHAPITRE 25.

LES BOTES DE DIALOGUE USUELLES

Figure PSFIV ! inregistrer un (hier

RQH

Chapitre

26
Dicult :

Apprendre lire la documentation de Qt

oil le chapitre le plus important de toute la partie sur Qt : celui qui va vous apprendre lire la documentation de Qt. Pourquoi est-ce que c'est si important de savoir lire la documentation ? Parce que la documentation, c'est la bible du programmeur. Elle explique toutes les possibilits d'un langage ou d'une bibliothque. La documentation de Qt contient la liste des fonctionnalits de Qt. Toute la liste.

RQI

CHAPITRE 26.

APPRENDRE LIRE LA DOCUMENTATION DE QT

v doumenttion est e qu9on peut trouver de plus omplet misF F F son ontenu est rdig trs di'remment de e livreF hjD il fudr vous y fire X l doumenttion n9est disponile qu9en nglis F sl fudr don fire l9e'ort de lire de l9nglisD mme si vous y tes llergiquesF in progrmmE tionD on peut rrement s9en sortir si on ne lit ps un minimum d9nglis tehniqueF h9utre prtD l doumenttion est onstruite de mnire ssez droutnte qund on duteF sl fut tre ple de  lire l doumenttion et d9y nviguerF g9est prisE ment e que e hpitre v vous pprendre fireF XEA
1

O trouver la documentation ?
yn vous dit que t propose une supere doumenttion trs omplte qui vous explique tout son fontionnementF yui mis o peutEon trouver ette doumenttion u juste c sl y en fit deux moyens d9der l doumenttion X ! si vous vez s snternet X vous pouvez ller sur le site de xoki @l9entreprise qui dite tA Y ! si vous n9vez ps d9s snternet X vous pouvez utiliser le progrmme t essistnt qui ontient toute l doumenttionF ous pouvez ussi ppuyer sur l touhe F1 dns t gretor pour otenir plus d9informtions propos du motEl sur lequel se trouve le urseurF

Avec accs Internet : sur le site de Nokia


ersonnellementD si j9i s snternetD j9i tendne prfrer utiliser ette mthode pour lire l doumenttionF sl su0t d9ller sur le site we de xokiD setion doumenE ttionF v9dresse est simple retenir X http://doc.qt.nokia.com  houmenttion de t gode we X UVHHUQ 
Je vous conseille trs fortement d'ajouter ce site dans vos favoris et de faire en sorte qu'il soit bien visible ! Si vous ne faites pas un raccourci visible vers la documentation, vous serez moins tents d'y aller. . . or le but c'est justement que vous adoptiez ce rexe !

n des prinipux vntges ller herher l doumenttion sur snternetD 9est que l9on est ssur d9voir l doumenttion l plus jourF in e'etD s9il y des nouveuts ou des erreursD on est ertin en llnt sur le xet d9en voir l dernire versionF vorsque vous rrivez sur l doumenttionD l pge de l (gure PTFI s90heF g9est l liste des produits lis tF xous nous intressons u premier dre en hut guheD intitul  t D qui reense les di'rentes versions de tD depuis t PFQF
1. C'est valable pour Qt et pour la quasi-totalit des autres documentations, notez bien.

RQP

O TROUVER LA DOCUMENTATION ?

Figure PTFI ! eueil de l doumenttion

letionnez l version de t qui orrespond elle que vous vez instlle @normleE ment l toute dernireAF v pge de l (gure PTFP devrit mintennt s90herF g9est l9ueil de l doumenE ttion pour votre version de tF
Si vous le voulez, vous pouvez mettre directement cette page en favoris car, tant que vous n'installez pas une nouvelle version de Qt sur votre PC, il est inutile d'aller lire les documentations des autres versions.

xous llons dtiller les di'rentes setions de ette pgeF wis vntF F F voyons voir omment der l doumenttion qund on n9 ps snternet 3

Sans accs Internet : avec Qt Assistant


i vous n9vez ps snternetD ps de pnique 3 t instll toute l doumenttion sur votre disque durF ous pouvez y der gre u progrmme  essistnt D que vous retrouverez pr exemple dns le menu hmrrerF t essistnt se prsente sous l forme d9un miniEnvigteur qui ontient l doumenE ttion de t @(gure PTFQAF RQQ

CHAPITRE 26.

APPRENDRE LIRE LA DOCUMENTATION DE QT

Figure PTFP ! eueil de l dernire version

Figure PTFQ ! t essistnt

RQR

LES DIFFRENTES SECTIONS DE LA DOCUMENTATION

Vous disposez uniquement de la documentation de Qt correspondant la version que vous avez installe (c'est logique, dans un sens). Si vous voulez lire la documentation d'anciennes versions de Qt (ou de futures versions en cours de dveloppement) il faut obligatoirement aller sur Internet.

ve logiiel t essistnt vous permet d9ouvrir plusieurs onglets en liqunt sur le outon  C F ous pouvez ussi e'etuer une reherhe gre u menu guhe de l9rn et rjouter des pges en fvorisF

Les direntes sections de la documentation


vorsque vous rrivez l9ueil de l doumenttion en ligneD l pge prsente l (gure PTFP s90heD omme nous l9vons vuF g9est le sommire de l doumenttionF sl vous su0t de nviguer trvers le menu de guheF geluiEi est doup en Q setions X ! es vookup Y ! t opis Y ! ixmplesF ves deux qui vont nous intresser le plus sont es vookup et t opisF ous pouvez ussi regrder l setion  ixmples si vous le dsirezD elle propose des exemples dtills de progrmmes rliss ve tF oyons ensemle es P premires setionsF F F

API Lookup
gette setion drit dns le dtil toutes les fontionnlits de tF ge n9est ps l plus lisile pour un dutnt mis 9est pourtnt l qu9est le ur de l doumenttion X ! Class index X l liste de toutes les lsses proposes pr tF sl y en euoup 3 g9est une des setions que vous onsulterez le plus souventF ! Function index X 9est l liste de toutes les fontions de tF gertines de es fonE tions sont glolesD d9utres sont des fontions memres @9estEEdire des mthodes de lsse 3AF g9est une onne fon pour vous d9der l desription d9une fontionF ! Modules X trs intressnteD ette setion rpertorie les lsses de t en fontion des modulesF t tnt doup en plusieurs modules @t goreD t qsF F FAD el vous donne une vision de l9rhiteture glole de tF te vous invite jeter un oup d9il en premier ette setionD 9est elle qui vous donner le meilleur reulF ! Namespaces X l liste des espes de noms employs pr t pour rnger les noms de lsses et de fontionsF xous n9en urons ps vriment esoinF ! Global Declarations X toutes les dlrtions gloles de tF ge sont des lments qui sont essiles prtout dns tous les progrmmes tF xous n9vons ps vriment esoin d9tudier el dns le dtilF ! QML elements X une liste des lments du lngge wv de tD s sur wvF RQS

CHAPITRE 26.

APPRENDRE LIRE LA DOCUMENTATION DE QT

xous n9utiliserons ps wv dns e oursD mis shez que wv permet de rer des fentres d9une fon ssez soupleD se sur le lngge wv @qui ressemle u rwvAF gei tntD l9lment que vous utiliserez vriment le plus souvent est le champ de rechercheD en hut du menuF vorsque vous urez une question sur le fontionnement d9une lsse ou d9une mthodeD il vous su0r de sisir son nom dns le hmp de reherhe pour tre redirig immditement vers l pge qui prsente son fontionnementF

Qt Topics
ge sont des pges de guide qui servent non seulement d9introdution tD mis ussi de onseils pour eux qui veulent utiliser t le mieux possile @notmment l setion Best practices AF fien srD tout est en nglisF v leture de ette setion peut tre trs intressnte et enrihissnte pour vousF ous n9vez ps esoin de l lire dns l9immdit r e ours v vous donner une onne inE trodution glole tF F F mis si plus trd vous souhitez pprofondirD vous trouverez dns ette setion des rtiles trs utiles 3

Comprendre la documentation d'une classe


oil l setion l plus importnte et l plus intressnte de e hpitre X nous lE lons tudier l doumenttion d9une lsse de t u hsrdF ghque lsse possde s propre pgeD plus ou moins longue suivnt l omplexit de l lsseF ous pouvez don retrouver tout e que vous vez esoin de svoir sur une lsse en onsultnt ette seule pgeF fonD j9i dit qu9on llit prendre une lsse de t u hsrdF elorsD voyons voirF F F sur qui el vEtEil tomerF F F h 3 te sis X QLineEditF   houmenttion de QLineEdi
t gode 

we X RQPRSS

Lorsque vous connaissez le nom de la classe et que vous voulez lire sa documentation, utilisez le champ de recherche en haut du menu. Vous pouvez aussi passer par le lien All Classes depuis le sommaire.

ous devriez voir une longue pge s90her sous vos yeux his @(gure PTFRAF ghque doumenttion de lsse suit extement l mme strutureF ous retrouverez don les mmes setionsD les mmes titresD etF enlysons quoi orrespond hune de es setions 3 RQT

COMPRENDRE LA DOCUMENTATION D'UNE CLASSE

Figure PTFR ! houmenttion de QLineEdit

RQU

CHAPITRE 26.

APPRENDRE LIRE LA DOCUMENTATION DE QT

Introduction
eu tout dutD vous pouvez lire une trs ourte introdution qui explique en quelques mots quoi sert l lsseF siD nous vons X  he vineidit widget is oneEline text editorF D e qui signi(eD si vous vez ien rvis votre nglisD que e widget est un diteur de texte sur une ligne @(gure PTFSAF
Figure PTFS ! n QLineEdit

ve lien  woreF F F vous mne vers une desription plus dtille de l lsseF in gnrlD il s9git d9un miniEtutoriel pour pprendre l9utiliserF te vous reommnde de toujours lire ette introdution qund vous trvillez ve une lsse que vous ne onnissiez ps jusqu9lorsF gel vous fer ggner euoup de temps r vous surez  pr o ommener et  quelles sont les priniples mthodes de l lsse F insuiteD on vous donne le heder inlure pour pouvoir utiliser l lsse dns votre odeF in l9ourrene il s9git de X
5inlude `vineiditb

uis vous vez une informtion trs importnte t de lquelle on psse souvent X l lsse dont hrite votre lsseF siD on voit que QWidget est le prent de QLineEditF hon QLineEdit rupre toutes les proprits de QWidgetF gel son importne omme nous llons le voirF F F oil pour l9intro 3 wintenntD voyons voir les setions qui suiventF F F

Public Types
ves lsses d(nissent prfois des types de donnes personnlissD sous l forme de e qu9on ppelle des numrtionsF siD QLineEdit d(nit l9numrtion EchoMode qui propose plusieurs vleurs X NormalD NoEchoD PasswordD etF
Une numration ne s'utilise pas  telle quelle . C'est juste une liste de valeurs, que vous pouvez renvoyer une mthode spcique qui en a besoin. Dans le cas de QLineEdit, c'est la mthode setEchoMode(EchoMode) qui en a besoin, car elle n'accepte que des donnes de type EchoMode. Pour envoyer la valeur Password, il faudra crire : setEchoMode(QLineEdit::Password).

RQV

COMPRENDRE LA DOCUMENTATION D'UNE CLASSE

Properties
ous vez l toutes les proprits d9une lsse que vous pouvez lire et modi(erF
Euh, ce ne sont pas des attributs par hasard ?

iF wis l doumenttion ne vous 0he que les ttriuts pour lesquels t d(nit des esseursF sl y de nomreux ttriuts  internes hque lsseD que l doumenE ttion ne vous montre ps r ils ne vous onernent psF outes les proprits sont don des ttriuts intressnts de l lsse que vous pouvez lire et modi(erF gomme je vous l9vis dit dns un hpitre prdentD t suit ette onvention pour le nom des esseurs X ! propriete() X 9est l mthode esseur qui vous permet de lire l proprit Y ! setPropriete() X 9est l mthode esseur qui vous permet de modi(er l proE pritF renons pr exemple l proprit textF g9est l proprit qui stoke le texte rentr pr l9utilisteur dns le hmp de texte QLineEditF gomme indiqu dns l doumenttionD text est de type QStringF ous devez don ruprer l vleur dns un QStringF our ruprer le texte entr pr l9utilisteur dns une vrile contenuD on fer don X
vineidit monghmp@4gontenu du hmp4AY tring ontenu a monghmpFtext@AY

our modi(er le texte prsent dns le hmpD on rir X


vineidit monghmpY monghmpFsetext@4intrez votre nom ii4AY

ous remrquerez que dns l doumenttionD l proprit text est un lienF gliquez dessusF gel vous mner plus s sur l mme pge vers une desription de l proE pritF yn vous y donne ussi le prototype des esseurs X ! QString text () const ! void setText ( const QString & ) in(nD prfois vous verrez omme ii une mention See also @voir ussiA qui vous invite ller voir d9utres proprits ou mthodes de l lsse ynt un rpport ve elle que vous tes en trin de onsulterF siD on vous dit que les mthodes insert() et clear() pourrient vous intresserF in e'etD pr exemple clear() vide le ontenu du hmp de texteD 9est don une mthode intressnte en rpport ve l proprit qu9on tit en trin de onsulterF RQW

CHAPITRE 26.

APPRENDRE LIRE LA DOCUMENTATION DE QT

Trs important : dans la liste des proprits en haut de la page, notez les mentions 56 properties inherited from QWidget et 1 property inherited from QObject. Comme QLineEdit hrite de QWidget, qui lui-mme hrite de QObject, il possde du coup toutes les proprits et toutes les mthodes de ses classes parentes ! En clair, les proprits que vous voyez l ne reprsentent qu'un tout petit bout des possibilits oertes par QLineEdit. Si vous cliquez sur le lien QWidget, vous tes conduits la liste des proprits de QWidget. Vous disposez aussi de toutes ces proprits dans un QLineEdit ! Vous pouvez donc utiliser la proprit width (largeur), qui est dnie dans QWidget, pour modier la largeur de votre QLineEdit. Toute la puissance de l'hritage est l ! Tous les widgets possdent donc ces proprits  de base , ils n'ont plus qu' dnir des proprits qui leur sont spciques. J'insiste bien dessus car au dbut, je me disais souvent :  Mais pourquoi y a-t-il aussi peu de choses dans cette classe ? . En fait, il ne faut pas s'y er et toujours regarder les classes parentes dont hrite la classe qui vous intresse. Tout ce que possdent les classes parentes, vous y avez accs aussi.

Public Functions
g9est ien souvent l setion l plus importnteF ous y trouverez toutes les mthodes puliques de l lsseF yn trouve dns le lot X ! le @ou lesA onstruteur@sA de l lsseD trs intressnts pour svoir omment rer un ojet prtir de ette lsse Y ! les esseurs de l lsse @omme text() et setText() qu9on vient de voirAD ss sur les ttriuts Y ! et en(n d9utres mthodes puliques qui ne sont ni des onstruteurs ni des esseurs et qui e'etuent diverses oprtions sur l9ojet @pr exemple home()D qui rmne le urseur u dut du hmp de texteAF gliquez sur le nom d9une mthode pour en svoir plus sur son rle et son fontionneE mentF
2

Lire et comprendre le prototype

hque foisD il fut que vous lisiez ttentivement le prototype de l mthodeD 9est trs importnt 3 ve prototype lui seul vous donne une grosse quntit d9informtions sur l mthodeF renons l9exemple du onstruteurF yn voit qu9on deux prototypes X ! QLineEdit ( QWidget * parent = 0 )
2. Parce que les mthodes prives ne vous concernent pas.

RRH

COMPRENDRE LA DOCUMENTATION D'UNE CLASSE

! QLineEdit ( const QString & contents, QWidget * parent = 0 ) ous noterez que ertins prmtres sont fulttifsF i vous liquez sur un de es onstruteursD pr exemple le seondD on vous explique l signi(tion de hun de es prmtresF yn pprend que parent est un pointeur vers le widget qui  ontiendr notre QLine Edit @pr exemple une fentreA et que contents est le texte qui doit tre rit dns le QLineEdit pr dfutF gel veut dire queD si on prend en ompte le fit que le prmtre parent est fulttifD on peut rer un ojet de type QLineEdit de qutre fons di'rentes X
vineidit vineidit vineidit vineidit monghmp@AY GG eppel du premier onstruteur monghmp@fenetreAY GG eppel du premier onstruteur monghmp@4intrez un texte4AY GG eppel du seond onstruteur monghmp@4intrez un texte4D fenetreAY GG eppel du seond onstruteur

g9est fou tout e qu9un prototype peut ronter hein c


Quand la mthode attend un paramtre d'un type que vous ne connaissez pas. . .

Je viens de voir la mthode setAlignement mais elle demande un paramtre de type Qt::Alignment. Comment je lui donne cela moi, je ne connais pas les Qt::Alignment !

s de pniqueF sl vous rriver trs souvent de tomer sur une mthode qui ttend un prmtre d9un type qui vous est inonnuF r exempleD vous n9vez jmis entendu prler de Qt::AlignmentF u9estEe que 9est que e type c v solution pour svoir omment envoyer un prmtre de type Qt::Alignment onsiste liquer dns l doumenttion sur le lien Qt::Alignment @eh ouiD e n9est ps un lien pr hsrd 3AF ge lien vous mne vers une pge qui vous explique e qu9est le type Qt::AlignmentF  ho de Qt::Alignment gode we X WWIHQR  sl peut y voir deux types di'rents X ! Les numrations X Qt::Alignment en est uneF ves numrtions sont trs simples utiliserD 9est une srie de vleursF sl su0t d9rire l vleur que l9on veutD omme le donne l doumenttion de Qt::AlignmentD pr exemple Qt::AlignCenterF v mthode pourr don tre ppele omme ei X ! Les classes X prfoisD l mthode ttend un ojet issu d9une lsse prise pour trvillerF v 9est un peu plus ompliqu X il v flloir rer un ojet de ette lsse et l9envoyer l mthodeF RRI
monghmpFsetelignment@tXXeligngenterAY

CHAPITRE 26.

APPRENDRE LIRE LA DOCUMENTATION DE QT

our tudier le seond sD prenons pr exemple setValidatorD qui ttend un pointeur vers un QValidatorF v mthode setValidator vous dit qu9elle permet de vri(er si l9utilisteur sisi un texte vlideF gel peut tre utile si vous voulez vri(er que l9utilisteur ien entr un nomre entier et non  fonjour v c qund vous lui demndez son geF F F i vous liquez sur le lien QValidatorD vous tes onduit l pge qui explique omment utiliser l lsse QValidatorF visez le texte d9introdution pour omprendre e que ette lsse est ense fire puis regrdez les onstruteurs (n de svoir omment rer un ojet de type QValidatorF rfoisD omme lD 9est mme un peu plus dlitF QValidator est une lsse strite @9est e que vous dit l9introdution de s doumenttionAD e qui signi(e qu9on ne peut ps rer d9ojet de type QValidator et qu9il fut utiliser une de ses lsses (llesF eu tout dutD l pge de l doumenttion de QValidator vous dit Inherited by QDoub leValidator, QIntValidator, and QRegExpValidatorF gel signi(e que es lsses hritent de QValidator et que vous pouvez les utiliser ussiF in e'etD une lsse (lle est omptile ve l lsse mreD omme nous l9vons dj vu u hpitre sur l9hritgeF xousD nous voulons utoriser l personne sisir uniquement un nomre entierD nous llons don utiliser QIntValidatorF sl fut rer un ojet de type QIntValidatorF egrdez ses onstruteurs et hoisissez elui qui vous onvientF eu (nl @ouf 3AD pour utiliser setValidatorD on peut proder insi X
lidtor Bvlidtor a new sntlidtor@HD ISHD thisAY monghmpFsetlidtor@vlidtorAY

F F F pour s9ssurer que l personne ne sisir qu9un nomre ompris entre H et ISH ns F v morle de l9histoireD 9est qu9il ne fut ps voir peur d9ller lire l doumenttion d9une lsse dont esoin l lsse sur lquelle vous trvillezF rfoisD il fut mme ller jusqu9 onsulter les lsses (llesF gel peut fire un peu peur u dutD mis 9est une gymnstique de l9esprit qurirF x9hsitez don ps suter de lien en lien dns l doumenttion pour rriver en(n envoyer ette 67d5657 de mthode un ojet du type qu9elle ttend 3
3

Public Slots
ves slots sont des mthodes omme les utresD l di'rene prs qu9on peut ussi les onneter un signl omme on l9 vu dns le hpitre sur les signux et les slotsF xotez que rien ne vous interdit d9ppeler un slot diretementD omme si 9tit une mthode omme une utreF r exempleD le slot undo() nnule l dernire oprtion de l9utilisteurF ous pouvez l9ppeler omme une te mthode X
monghmpFundo@AY
3. Cela laisse de la marge !

RRP

COMPRENDRE LA DOCUMENTATION D'UNE CLASSE

F F F misD du fit que undo() est un slotD vous pouvez ussi le onneter un utre widgetF r exempleD on peut imginer un menu Edition > Annuler dont le signl  liqu ser onnet u slot undo du hmp de texteF
Tous les slots oerts par QLineEdit ne gurent pas dans cette liste. Je me permets de vous rappeler une fois de plus qu'il faut penser regarder les mentions comme 19 public slots inherited from QWidget, qui vous invitent aller voir les slots de QWidget auxquels vous avez aussi accs. C'est ainsi que vous dcouvrirez que vous disposez du slot hide() qui permet de masquer votre QLineEdit.

Signals
g9est l liste des signux que peut envoyer un QLineEditF n signl est un vnement qui s9est produit et que l9on peut onneter un slot @le slot pouvnt pprtenir et ojet ou un utreAF r exempleD le signl textChanged() est mis hque fois que l9utilisteur modi(e le texte l9intrieur du QLineEditF i vous le voulezD vous pouvez onneter e signl un slot pour qu9une tion soit e'etue hque fois que le texte est modi(F ettention enore une fois ien regrder les signux hrits de QWidget et QObjectD r ils pprtiennent ussi l lsse QLineEditF te sis que je suis lourd fore de rpter elD inutile de me le direD je le fis exprs pour que el rentreF YEA

Protected Functions
ge sont des mthodes protgesF illes ne sont ni puliD ni privteD mis protetedF gomme on l9 vu u hpitre sur l9hritgeD e sont des mthodes prives @uxquelles vous ne pouvez ps der diretement en tnt qu9utilisteur de l lsseA mis qui seront hrites et don rutilisles si vous rez une lsse se sur QLineEditF sl est trs frquent d9hriter des lsses de tD on l9 d9illeurs dj fit ve QWidget pour rer une fentre personnliseF i vous hritez de QLineEditD shez don que vous disposerez ussi de es mthodesF

Additional Inherited Members


i des lments hrits n9ont ps t lists jusqu9iiD on les retrouver dns ette setion l (nF r exempleD l lsse QLineEdit ne d(nit ps de mthode sttique D mis elle en possde quelquesEunes hrites de QWidget et QObjectF sl n9y rien de ien intressnt ve QLineEdit mis shez pr exemple que l lsse QString possde de nomreuses mthodes sttiquesD omme number() qui onvertit le
4

4. Je vous rappelle qu'une mthode statique est une mthode que l'on peut appeler sans avoir eu crer d'objet. C'est un peu comme une fonction.

RRQ

CHAPITRE 26.

APPRENDRE LIRE LA DOCUMENTATION DE QT

nomre donn en une hne de rtres de type QStringF


tring mghine a tringXXnumer@IPAY

ne mthode sttique s9ppelle omme ei X NomDeLaClasse::nomDeLaMethode()F yn dj vu tout el dns les hpitres prdentsD je ne fis ii que des rppelsF

Detailed description
g9est une desription dtille du fontionnement de l lsseF yn y de notmment en liqunt sur le lien  woreF F F prs l trs ourte introdution du dutF g9est une setion trs intressnte que je vous invite lire l premire fois que vous douvrez une lsseD r elle vous permet de omprendre ve du reul omment l lsse est ense fontionnerF

En rsum
! v doumenttion de t est indispensleF ous devez grder son dresse dns vos fvoris et l onsulter rgulirementF ! gontrirement e oursD l doumenttion est exhustive X elle indique toutes les possiilits o'ertes pr t dns les moindres dtilsF ! v doumenttion peut reuter u premier ord @termes tehniquesD nglisD etFA mis une fois qu9on ppris l lireD on s9peroit qu9elle est moins omplexe qu9il y prtF ! x9ouliez ps que l pluprt des lsses de t hritent d9une utre lsseF gonsultez ussi les proprits des lsses mres pour onntre toutes les possiilits de l lsse que vous utilisezF ! x9hsitez ps nviguer de lien en lien pour douvrir de nouvelles lsses et leur mode de fontionnementF ouventD une lsse esoin d9une utre lsse pour fonE tionnerF ! t9insiste X pprenez lire l doumenttionF ous psserez t de l9essentiel si vous n9vez ps le r)exe de l9ouvrir rgulirementF

RRR

Chapitre

27
Dicult :

Positionner ses widgets avec les layouts

omme vous le savez, une fentre peut contenir toutes sortes de widgets : des boutons, des champs de texte, des cases cocher. . . Placer ces widgets sur la fentre est une science part entire. Je veux dire par l qu'il faut vraiment y aller avec mthode, si on ne veut pas que la fentre ressemble rapidement un champ de bataille. Comment bien placer les widgets sur la fentre ? Comment grer les redimensionnements de la fentre ? Comment s'adapter automatiquement toutes les rsolutions d'cran ? C'est ce que nous allons dcouvrir dans ce chapitre.

RRS

CHAPITRE 27.

POSITIONNER SES WIDGETS AVEC LES LAYOUTS

yn distingue deux tehniques di'rentes pour positionner des widgets X ! Le positionnement absolu X 9est elui que nous vons vu jusqu9iiD ve l9ppel l mthode setGeometry @ou moveAF F F ge positionnement est trs pris r on ple les widgets u pixel prsD mis el omporte un ertin nomre de dfuts omme nous llons le voirF ! Le positionnement relatif X 9est le plus souple et 9est elui que je vous reomE mnde d9utiliser utnt que possileF xous llons l9tudier dns e hpitreF

Le positionnement absolu et ses dfauts


xous llons ommener pr voir le ode t de se que nous llons utiliser dns e hpitreD puis nous ferons quelques rppels sur le positionnement soluD que vous vez dj utilis sns svoir extement e que 9titF

Le code Qt de base
hns les hpitres prdentsD nous vions r un projet t onstitu de trois (hiers X ! main.cpp X ontenit le main qui se hrgeit juste d9ouvrir l fentre priniple Y ! MaFenetre.h X ontenit l9enEtte de notre lsse MaFenetre qui hritit de QWidget Y ! MaFenetre.cpp X ontenit l9implmenttion des mthodes de MaFenetreD notmE ment du onstruteurF g9est l9rhiteture que nous utiliserons dns l pluprt de nos projets tF outefoisD pour e hpitreD nous n9vons ps esoin d9une rhiteture ussi omplexe et nous llons fire omme dns les tous premiers hpitres t X nous llons seulement utiliser un mainF sl y ur un seul (hier X main.cppF oii le ode de votre projetD sur lequel nous llons ommener X
5inlude `epplitionb 5inlude `ushfuttonb int min@int rgD hr BrgvA { epplition pp@rgD rgvAY idget fenetreY ushfutton outon@4fonjour4D 8fenetreAY outonFmove@UHD THAY fenetreFshow@AY } return ppFexe@AY

RRT

LE POSITIONNEMENT ABSOLU ET SES DFAUTS

g9est trs simple X nous rons une fentreD et nous 0hons un outon que nous plons ux oordonnes @UHD THA sur l fentre @(gure PUFIAF

Figure PUFI ! xotre fentre simple

Les dfauts du positionnement absolu


hns le ode prdentD nous vons positionn notre outon de mnire solue l9ide de l9instrution bouton.move(70, 60); ve outon t pl trs prisment UH pixels sur l droite et TH pixels plus sF ve prolmeF F F 9est que e n9est ps souple du toutF smginez que l9utilisteur s9muse redimensionner l fentre @(gure PUFPAF

Figure PUFP ! n outon oup en deux

ve outon ne ouge psF hu oupD si on rduit l tille de l fentreD il ser oup en deux et pourr mme disprtre si on l rduit tropF
Dans ce cas, pourquoi ne pas empcher l'utilisateur de redimensionner la fentre ? On avait fait cela grce setFixedSize dans les chapitres prcdents. . .

yuiD vous pouvez fire elF g9est d9illeurs e que font le plus souvent les dveloppeurs de logiiels qui positionnent leurs widgets en soluF gependntD l9utilisteur pprie ussi de pouvoir redimensionner s fentreF ge n9est qu9une demiEsolutionF h9illeursD il y un utre prolme que setFixedSize ne peut ps rgler X le s des rsolutions d9rn plus petites que l vtreF smginez que vous pliez un outon IPHH pixels sur l droite pre que vous vez une grnde rsolution @ITHH x IPHHAF i l9utilisteur trville ve une rsolution plus file que vous @IHPR x UTVAD il ne pourr jmis voir le outon pre qu9il ne pourr jmis grndir utnt s fentre 3 RRU

CHAPITRE 27.

POSITIONNER SES WIDGETS AVEC LES LAYOUTS

Alors quoi ? Le positionnement absolu c'est mal ? O veux-tu en venir ? Et surtout, comment peut-on faire autrement ?

xonD le positionnement solu e n9est ps  ml F sl sert prfois qund on vriment esoin de positionner u pixel prsF ous pouvez l9utiliser dns ertins de vos projets misD utnt que possileD prfrez l9utre mthode X le positionnement reltifF ve positionnement reltifD el onsiste expliquer omment les widgets sont gens les uns pr rpport ux utresD plutt que d9utiliser une position en pixelsF r exempleD on peut dire  ve outon I est enEdessous du outon PD qui est guhe du outon Q F ve positionnement reltif est gr dns t pr e qu9on ppelle les layouts F ge sont des onteneurs de widgetsF g9est justement l9ojet prinipl de e hpitreF

L'architecture des classes de layout


our positionner intelligemment nos widgetsD nous llons utiliser des lsses de t gE rnt les lyoutsF sl existe pr exemple des lsses grnt le positionnement horizontl et vertil des widgets @e que nous llons tudier en premierA ou enore le positionnement sous forme de grilleF our que vous y voyiez plus lirD je vous propose de regrder le shm PUFQ de mon ruF

Figure PUFQ ! vyouts ve t

ge sont les lsses grnt les lyouts de tF outes les lsses hritent de l lsse de se QLayoutF RRV

LES LAYOUTS HORIZONTAUX ET VERTICAUX

yn ompte don en gros les lsses X ! QBoxLayout Y ! QHBoxLayout Y ! QVBoxLayout Y ! QGridLayout Y ! QFormLayout Y ! QStackedLayoutF xous llons tudier hune de es lsses dns e hpitreD l9exeption de QStac kedLayout @gestion des widgets sur plusieurs pgesA qui est un peu trop omplexe pour qu9on puisse trviller dessus iiF yn utiliser plutt des widgets qui le rutilisentD omme QWizard qui permet de rer des ssistntsF
Euh. . . Mais pourquoi tu as crit QLayout en italique, et pourquoi tu as gris la classe ?

est une lsse striteF ouvenezEvous du hpitre sur le polymorphismeD nous y vions vu qu9il est possile de rer des lsses ve des mthodes virtuelles pures @pge QQHAF ges lsses sont dites strites pre qu9on ne peut ps instnier d9ojet de e typeF v9utilistion de lsses strites pr t pour les lyouts est un exemple typiqueF ous les lyouts ont des proprits ommunes et des mthodes qui e'etuent l mme tion mis de mnire di'renteF e(n de reprsenter toutes les tions possiles dns une seule interfeD les dveloppeurs ont hoisi d9utiliser une lsse striteF oil don un exemple onret pour illustrer e point de thorie un peu di0ileF
QLayout

Les layouts horizontaux et verticaux


ettquons sns plus trder l9tude de nos premiers lyouts @les plus simplesAD vous llez mieux omprendre quoi tout el sertF xous llons trviller sur deux lsses X ! QHBoxLayout Y ! QVBoxLayoutF QHBoxLayout et QVBoxLayout hritent de QBoxLayoutF ge sont des lsses trs simiE lires F xous n9llons ps utiliser QBoxLayoutD mis uniquement ses lsses (lles QHBo xLayout et QVBoxLayout @el revient u mmeAF
1

Le layout horizontal
v9utilistion d9un lyout se fit en Q temps X
1. La documentation Qt parle de convenience classes, des classes qui sont l pour vous aider aller plus vite mais qui sont en fait quasiment identiques QBoxLayout.

RRW

CHAPITRE 27.

POSITIONNER SES WIDGETS AVEC LES LAYOUTS

IF yn re les widgets Y PF yn re le lyout et on ple les widgets dedns Y QF yn dit l fentre d9utiliser le lyout qu9on rF
1/ Crer les widgets

our les esoins de e hpitreD nous llons rer plusieurs outons de type QPushBut ton X
ushfutton BoutonI a new ushfutton@4fonjour4AY ushfutton BoutonP a new ushfutton@4les4AY ushfutton BoutonQ a new ushfutton@4ros4AY

ous remrquerez que j9utilise des pointeursF in e'etD j9uris trs ien pu fire sns pointeurs omme ei X
ushfutton outonI@4fonjour4AY ushfutton outonP@4les4AY ushfutton outonQ@4ros4AY

F F F ette mthode l9ir plus simple mis vous verrez pr l suite que 9est plus prtique de trviller diretement ve des pointeursF v di'rene entre es deux odesD 9est que bouton1 est un pointeur dns le premier odeD tndis que 9est un ojet dns le seond odeF yn v don utiliser l premire mthode ve les pointeursF fonD on trois outonsD 9est ienF wis les plus perspies d9entre vous uront remrqu qu9on n9 ps indiqu quelle tit l fentre prenteD omme on l9urit fit vnt X
ushfutton BoutonI a new ushfutton@4fonjour4D 8fenetreAY

yn n9 ps fit omme el et 9est justement fit exprsF xous n9llons ps pler les outons dns l fentre diretementD mis dns un onteneur X le lyoutF
2/ Crer le layout et placer les widgets dedans

grons justement e lyoutD un lyout horizontl X


rfoxvyout Blyout a new rfoxvyoutY

ve onstruteur de ette lsse est simpleD on n9 ps esoin d9indiquer de prmtreF wintennt que notre lyout est rD rjoutons nos widgets l9intrieur X
lyoutEbddidget@outonIAY lyoutEbddidget@outonPAY lyoutEbddidget@outonQAY

RSH

LES LAYOUTS HORIZONTAUX ET VERTICAUX

v mthode addWidget du lyout ttend que vous lui donniez en prmtre un poinE teur vers le widget jouter u onteneurF oil pourquoi je vous i fit utiliser des pointeurs F
2

3/ Indiquer la fentre d'utiliser le layout

wintenntD dernire hose X il fut pler le lyout dns l fentreF sl fut dire l fentre X  u vs utiliser e lyoutD qui ontient mes widgets F
fenetreFsetvyout@lyoutAY

v mthode setLayout de l fentre ttend un pointeur vers le lyout utiliserF it voilD notre fentre ontient mintennt notre lyoutD qui ontient les widgetsF ve lyout se hrger d9orgniser tout seul les widgets horizontlementF

Rsum du code
oii le ode omplet de notre (hier main.cpp X
5inlude `epplitionb 5inlude `ushfuttonb 5inlude `rfoxvyoutb int min@int rgD hr BrgvA { epplition pp@rgD rgvAY idget fenetreY ushfutton BoutonI a new ushfutton@4fonjour4AY ushfutton BoutonP a new ushfutton@4les4AY ushfutton BoutonQ a new ushfutton@4ros4AY rfoxvyout Blyout a new rfoxvyoutY lyoutEbddidget@outonIAY lyoutEbddidget@outonPAY lyoutEbddidget@outonQAY fenetreFsetvyout@lyoutAY fenetreFshow@AY } return ppFexe@AY
2. Sinon il aurait fallu crire layout->addWidget(&bouton1); chaque fois.

RSI

CHAPITRE 27.

POSITIONNER SES WIDGETS AVEC LES LAYOUTS

gopier e ode gode we X SHVWTQ  t9i surlign les priniples nouveutsF in prtiulierD omme d9hitude lorsque vous utilisez une nouvelle lsse tD pensez l9inlure u dut de votre ode X #include< QHBoxLayout>F

Rsultat
oil quoi ressemle l fentre mintennt que l9on utilise un lyout horizontl @(gure PUFRAF

Figure PUFR ! vyout horizontl

ves outons sont utomtiquement disposs de mnire horizontle 3 v9intrt prinipl du lyoutD 9est son omportement fe ux redimensionnements de l fentreF issyons de l9lrgir @(gure PUFSAF

Figure PUFS ! vyout horizontl grndi

ves outons ontinuent de prendre l9espe en lrgeurF yn peut ussi l9grndir en huteur @(gure PUFTAF

Figure PUFT ! vyout horizontl grndi

yn remrque que les widgets restent entrs vertilementF ous pouvez ussi essyer de rduire l tille de l fentreF yn vous interdir de l rduire si les outons ne RSP

LES LAYOUTS HORIZONTAUX ET VERTICAUX

peuvent plus tre 0hsD e qui vous grntit que les outons ne risquent plus de disprtre omme vnt 3

Schma des conteneurs


in rsumD l fentre ontient le lyout qui ontient les widgetsF ve lyout se hrge d9orgniser les widgetsF hmtiquementD el se psse don omme l (gure PUFUF

Figure PUFU ! hm des lyouts

yn vient de voir le lyout QHBoxLayout qui orgnise les widgets horizontlementF sl y en un utre qui les orgnise vertilement @9est qusiment l mme hoseA X QV BoxLayoutF

Le layout vertical
our utiliser un lyout vertilD il su0t de rempler QHBoxLayout pr QVBoxLayout dns le ode prdentF yui ouiD 9est ussi simple que el 3
5inlude `epplitionb 5inlude `ushfuttonb 5inlude `foxvyoutb int min@int rgD hr BrgvA { epplition pp@rgD rgvAY idget fenetreY ushfutton BoutonI a new ushfutton@4fonjour4AY ushfutton BoutonP a new ushfutton@4les4AY ushfutton BoutonQ a new ushfutton@4ros4AY foxvyout Blyout a new foxvyoutY lyoutEbddidget@outonIAY lyoutEbddidget@outonPAY lyoutEbddidget@outonQAY fenetreFsetvyout@lyoutAY

RSQ

CHAPITRE 27.

POSITIONNER SES WIDGETS AVEC LES LAYOUTS

fenetreFshow@AY } return ppFexe@AY

x9ouliez ps d9inlure QVBoxLayoutF gompilez et exutez e odeD et dmirez le rsultt @(gure PUFVAF

Figure PUFV ! vyout vertil

emusezEvous redimensionner l fentreF ous voyez l enore que le lyout dpte les widgets qu9il ontient toutes les dimensionsF sl emphe en prtiulier l fentre de devenir trop petiteD e qui urit nuit l90hge des outonsF

La suppression automatique des widgets


Eh ! Je viens de me rendre compte que tu fais des new dans tes codes, mais il n'y a pas de delete ! Si tu alloues des objets sans les supprimer, ils ne vont pas rester en mmoire ?

iD mis omme je vous l9vis dit plus ttD t est intelligent in fitD les widgets sont pls dns un lyoutD qui est luiEmme pl dns l fentreF vorsque l fentre est supprime @ii l (n du progrmmeAD tous les widgets ontenus dns son lyout sont supprims pr tF g9est don t qui se hrge de fire les delete pour nousF fienD vous devriez ommener omprendre omment fontionnent les lyoutsF gomme on l9 vu u dut du hpitreD il y de nomreux lyoutsD qui ont hun leurs spi(its 3 sntressonsEnous mintennt u puissnt @mis omplexeA QGridLayoutF

Le layout de grille
ves lyouts horizontux et vertiux sont gentils mis il ne permettent ps de rer des dispositions trs omplexes sur votre fentreF g9est l qu9entre en jeu QGridLayoutD qui est en fit un peu un ssemlge de QHBoxL ayout et QVBoxLayoutF sl s9git d9une disposition en grilleD omme un tleu ve des lignes et des olonnesF RSR

LE LAYOUT DE GRILLE

Schma de la grille
sl fut imginer que votre fentre peut tre doupe sous l forme d9une grille ve une in(nit de sesD omme l (gure PUFWF

Figure PUFW ! v grille

i on veut pler un widget en hut guheD il fudr le pler l se de oordonnes @HD HAF i on veut en pler un utre enEdessousD il fudr utiliser les oordonnes @ID HA et insi de suiteF

Utilisation basique de la grille


issyons d9utiliser un QGridLayout simplement pour ommener @oui pre qu9on peut ussi l9utiliser de mnire ompliqueAF xous llons pler un outon en hut guheD un s droite et un en dessousF v seule di'rene rside en fit dns l9ppel l mthode addWidgetF gelleEi epte deux prmtres supplmentires X les oordonnes o pler le widget sur l grilleF
5inlude `epplitionb 5inlude `ushfuttonb 5inlude `qridvyoutb int min@int rgD hr BrgvA { epplition pp@rgD rgvAY idget fenetreY ushfutton BoutonI a new ushfutton@4fonjour4AY ushfutton BoutonP a new ushfutton@4les4AY ushfutton BoutonQ a new ushfutton@4ros4AY qridvyout Blyout a new qridvyoutY

RSS

CHAPITRE 27.

POSITIONNER SES WIDGETS AVEC LES LAYOUTS

lyoutEbddidget@outonID HD HAY lyoutEbddidget@outonPD HD IAY lyoutEbddidget@outonQD ID HAY fenetreFsetvyout@lyoutAY fenetreFshow@AY } return ppFexe@AY

Figure PUFIH ! foutons disposs selon une grille

i vous omprez ve le shm de l grille que j9i fit plus hutD vous voyez que les outons ont ien t disposs selon les onnes oordonnesF
D'ailleurs en parlant du schma plus haut, il y a un truc que je ne comprends pas, c'est tous ces points de suspension  . . .  l. Cela veut dire que la taille de la grille est innie ? Dans ce cas, comment je fais pour placer un bouton en bas droite ?

t  sit quel est le widget mettre en s droite en fontion des oordonnes des utres widgetsF ve widget qui les oordonnes les plus leves ser pl en s droiteF etit testD rjoutons un outon ux oordonnes @ID IA X
5inlude `epplitionb 5inlude `ushfuttonb 5inlude `qridvyoutb int min@int rgD hr BrgvA { epplition pp@rgD rgvAY idget fenetreY ushfutton BoutonI a new ushfutton@4fonjour4AY ushfutton BoutonP a new ushfutton@4les4AY ushfutton BoutonQ a new ushfutton@4ros4AY ushfutton BoutonR a new ushfutton@43334AY

RST

LE LAYOUT DE GRILLE

qridvyout Blyout a new qridvyoutY lyoutEbddidget@outonID HD HAY lyoutEbddidget@outonPD HD IAY lyoutEbddidget@outonQD ID HAY lyoutEbddidget@outonRD ID IAY fenetreFsetvyout@lyoutAY fenetreFshow@AY } return ppFexe@AY

Figure PUFII ! fouton en s droite

i on veutD on peut ussi dler le outon enore plus en s droite dns une nouvelle ligne et une nouvelle olonne X
lyoutEbddidget@outonRD PD PAY

Figure PUFIP ! fouton en s droite

g9est ompris c

Un widget qui occupe plusieurs cases


v9vntge de l disposition en grilleD 9est qu9on peut fire en sorte qu9un widget oupe plusieurs ses l foisF yn prle de spanning F our e fireD il fut ppeler une version surhrge de addWidget qui epte deux prmtres supplmentires X le rowSpan et le columnSpanF
3

3. Ceux qui font du HTML doivent avoir entendu parler des attributs rowspan et colspan sur les tableaux.

RSU

CHAPITRE 27.

POSITIONNER SES WIDGETS AVEC LES LAYOUTS

! rowSpan X nomre de lignes qu9oupe le widget @pr dfut IA Y ! columnSpan X nomre de olonnes qu9oupe le widget @pr dfut IAF smginons un widget pl en hut guheD ux oordonnes @HD HAF i on lui donne un rowSpan de PD il ouper lors l9espe indiqu l (gure PUFIQF

Figure PUFIQ ! rowSpan

i on lui donne un columnSpan de QD il ouper l9espe indiqu sur l (gure PUFIRF

Figure PUFIR ! columnSpan


L'espace pris par le widget au nal dpend de la nature du widget (les boutons s'agrandissent en largeur mais pas en hauteur par exemple) et du nombre de widgets sur la grille. En pratiquant, vous allez rapidement comprendre comment cela fonctionne.

issyons de fire en sorte que le outon  ros prenne deux olonnes de lrgeur X
lyoutEbddidget@outonQD ID HD ID PAY

ves deux derniers prmtres orrespondent respetivement u rowSpan et u column RSV

LE LAYOUT DE FORMULAIRE

SpanF ve rowSpan est ii de ID 9est l vleur pr dfut on ne hnge don rienD mis le columnSpan est de PF ve outon v don  ouper P olonnes @(gure PUFISAF

Figure PUFIS ! Spanning du outon


Essayez en revanche de monter le columnSpan 3 : vous ne verrez aucun changement. En eet, il aurait fallu qu'il y ait un troisime widget sur la premire ligne pour que le columnSpan puisse fonctionner.

pites des tests ve le spanning pour vous ssurer que vous vez ien ompris omment el fontionneF

Le layout de formulaire
ve lyout de formulire QFormLayout est un lyout spilement onu pour les fentres hergent des formuliresF n formulire est en gnrl une suite de liells @ otre prnom X A ssois des hmps de formulire @(gure PUFITAF
4

Figure PUFIT ! n formulire

xormlementD pour rire du texte dns l fentreD on utilise le widget QLabel @liellA dont on prler plus en dtil u prohin hpitreF v9vntge du lyout que nous llons utiliserD 9est qu9il simpli(e notre trvil en rnt utomtiquement des QLabel pour nousF
Vous noterez d'ailleurs que la disposition correspond celle d'un QGridLayo ut 2 colonnes et plusieurs lignes. En eet, le QFormLayout n'est en fait rien d'autre qu'une version spciale du QGridLayout pour les formulaires, avec quelques particularits : il s'adapte aux habitudes des OS pour, dans certains cas, aligner les libells gauche, dans d'autres droite, etc.
4. Une zone de texte par exemple.

RSW

CHAPITRE 27.

POSITIONNER SES WIDGETS AVEC LES LAYOUTS

v9utilistion d9un QFormLayout est trs simpleF v di'reneD 9est qu9u lieu d9utiliser une mthode addWidgetD nous llons utiliser une mthode addRow qui prend deux prmtres X ! le texte du liell Y ! un pointeur vers le hmp du formulireF our fire simpleD nous llons rer trois hmps de formulire de type  one de texte une ligne @QLineEditAD puis nous llons les pler dns un QFormLayout u moyen de l mthode addRow X
5inlude `epplitionb 5inlude `vineiditb 5inlude `pormvyoutb int min@int rgD hr BrgvA { epplition pp@rgD rgvAY idget fenetreY vineidit Bnom a new vineiditY vineidit Bprenom a new vineiditY vineidit Bge a new vineiditY pormvyout Blyout a new pormvyoutY lyoutEbddow@4otre nom4D nomAY lyoutEbddow@4otre prnom4D prenomAY lyoutEbddow@4otre ge4D geAY fenetreFsetvyout@lyoutAY fenetreFshow@AY } return ppFexe@AY

sultt en (gure PUFIUF

Figure PUFIU ! vyout de formulire

ympD non c RTH

COMBINER LES LAYOUTS

yn peut ussi d(nir des rouris lvier pour der rpidement ux hmps du formulireF our e fireD plez un symole  8 devnt l lettre du liell que vous voulez trnsformer en rouriF ixplition en imge @euhD en odeA X
lyoutEbddow@4otre 8nom4D nomAY lyoutEbddow@4otre 8prnom4D prenomAY lyoutEbddow@4otre 8ge4D geAY

v lettre  p est dsormis un rouri vers le hmp du prnomD  n vers le hmp nom et  g vers le hmp geF v9utilistion du rouri dpend de votre systme d9exploittionF ous indowsD il fut ppuyer sur l touhe Alt puis l touhe rouriF vorsque vous ppuyez sur D les lettres rouris pprissent soulignes @(gure PUFIVAF Alt

Figure PUFIV ! ouris dns un form lyout

pites Alt C N pour der diretement u hmp du nom 3


Souvenez-vous de ce symbole &, il est trs souvent utilis en GUI Design (design de fentre) pour indiquer quelle lettre sert de raccourci. On le rutilisera notamment pour avoir des raccourcis dans les menus de la fentre. Ah, et si vous voulez par contre vraiment acher un symbole & dans un libell, tapez-en deux :  && . Exemple :  Bonnie && Clyde .

Combiner les layouts


evnt de terminer e hpitreD il me semle importnt que nous jetions un oup d9il ux lyouts ominsD une fontionnlit qui v vous fire omprendre toute l puisE sne des lyoutsF gommenons omme il se doit pr une question que vous devriez vous poser X
Les layouts c'est bien joli mais n'est-ce pas un peu limit ? Si je veux faire une fentre un peu complexe, ce n'est pas grands coups de QVBoxLayout ou mme de QGridLayout que je vais m'en sortir !

RTI

CHAPITRE 27.

POSITIONNER SES WIDGETS AVEC LES LAYOUTS

g9est vri que mettre ses widgets les uns enEdessous des utres peut semler limitF wme l grille fit un peu  rigide D je reonnisF wis rssurezEvousD tout t pensF v mgie pprt lorsque nous ommenons ominer les lyoutsD 9estEEdire pler un lyout dns un utre lyoutF

Un cas concret
renons pr exemple notre joli formulireF upposons que l9on veuille jouter un outon  uitter F i vous voulez pler e outon en s du formulireD omment fire c sl fut d9ord rer un lyout vertil @QVBoxLayoutA et pler l9intrieur notre lyout de formulire puis notre outon  uitter F gel donne le shm de l (gure PUFIWF

Figure PUFIW ! hm des lyouts omins

yn voit que notre QVBoxLayout ontient deux hosesD dns l9ordre X IF n QFormLayout @qui ontient luiEmme d9utres widgetsA Y PF n QPushButtonF n lyout peut don ontenir ussi ien des lyouts que des widgetsF

Utilisation de addLayout
our insrer un lyout dns un utreD on utilise addLayout u lieu de addWidget @9est logique me direzEvousAF oii un on petit ode pour se fire l min X
5inlude 5inlude 5inlude 5inlude 5inlude `epplitionb `vineiditb `ushfuttonb `foxvyoutb `pormvyoutb

RTP

COMBINER LES LAYOUTS

int min@int rgD hr BrgvA { epplition pp@rgD rgvAY idget fenetreY GG grtion du lyout de formulire et de ses widgets vineidit Bnom a new vineiditY vineidit Bprenom a new vineiditY vineidit Bge a new vineiditY pormvyout Bformvyout a formvyoutEbddow@4otre formvyoutEbddow@4otre formvyoutEbddow@4otre new pormvyoutY 8nom4D nomAY 8prnom4D prenomAY 8ge4D geAY

GG grtion du lyout prinipl de l fentre @vertilA foxvyout Blyoutrinipl a new foxvyoutY lyoutriniplEbddvyout@formvyoutAY GG ejout du lyout de formulire ushfutton Boutonuitter a new ushfutton@4uitter4AY idgetXXonnet@outonuitterD sqxev@liked@AAD 8ppD vy@quit@AAAY lyoutriniplEbddidget@outonuitterAY GG ejout du outon fenetreFsetvyout@lyoutriniplAY fenetreFshow@AY } return ppFexe@AY

gopier e ode gode we X IIPQIH  t9i surlign les jouts u lyout vertil prinipl X ! l9jout du sousElyout de formulire @addLayoutA Y ! l9jout du outon @addWidgetAF ous remrquerez que je fis les hoses un peu dns l9ordre inverse X d9ord je re les widgets et lyouts  enfnts @le QFormLayoutA Y ensuite je re le lyout prinipl @le QVBoxLayoutA et j9y insre le lyout enfnt que j9i rF eu (nlD l fentre qui pprt ressemle l (gure PUFPHF yn ne le voit psD mis l fentre ontient d9ord un QVBoxLayoutD qui ontient luiEmme un lyout de formulire et un outon @(gure PUFPIAF RTQ

CHAPITRE 27.

POSITIONNER SES WIDGETS AVEC LES LAYOUTS

Figure PUFPH ! vyouts omins

Figure PUFPI ! vyouts omins @shmA

En rsum
! our pler des widgets sur une fentreD deux options s9o'rent nous X les positionner u pixel prs @en soluA ou les positionner de fon souple dns des lyouts @en reltifAF ! ve positionnement en lyouts est onseill X les widgets oupent utomtiquement l9espe disponile suivnt l tille de l fentreF ! sl existe plusieurs types de lyouts selon l9orgnistion que l9on souhite otenir des widgets X QVBoxLayout @vertilAD QHBoxLayout @horizontlAD QGridLayout @en grilleAD QFormLayout @en formulireAF ! sl est possile d9imriquer des lyouts entre eux X un lyout peut don en ontenir un utreF gel nous permet de rliser des positionnements trs prisF

RTR

Chapitre

28
Dicult :

Les principaux widgets

oil un moment que nous avons commenc nous intresser Qt, je vous parle en long en large et en travers de widgets, mais jusqu'ici nous n'avions toujours pas pris le temps de faire un tour d'horizon rapide de ce qui existait. Il est maintenant temps de faire une  pause  et de regarder ce qui existe en matire de widgets. Nous tudierons cependant seulement les principaux widgets ici. Pourquoi ne les verrons-nous pas tous ? Parce qu'il en existe un grand nombre et que certains sont rarement utiliss. D'autres sont parfois tellement complexes qu'ils ncessiteraient un chapitre entier pour les tudier. Nanmoins, avec ce que vous allez voir, vous aurez largement de quoi faire pour crer la quasi-totalit des fentres que vous voulez !

RTS

CHAPITRE 28.

LES PRINCIPAUX WIDGETS

Les fentres
eve tD tout lment de l fentre est ppel un widgetF v fentre elleEmme est onsidre omme un widgetF hns le odeD les widgets sont des lsses qui hritent toujours de QWidget @direteE ment ou indiretementAF g9est don une lsse de se trs importnte et vous urez prolement trs souvent esoin de lire l do de ette lsseF

Quelques rappels sur l'ouverture d'une fentre


gel fit plusieurs hpitres que l9on re une fentre dns nos progrmmes l9ide d9un ojet de type QWidgetF gel signi(eEtEil que QWidget a pentre c xonF in fitD un widget qui n9est ontenu dns uun utre widget est onsidr omme une fentreF hon qund on rit juste e ode trs simple X
5inlude `epplitionb 5inlude `idgetb int min@int rgD hr BrgvA { epplition pp@rgD rgvAY idget fenetreY fenetreFshow@AY } return ppFexe@AY

F F F el 0he une fentre vide @(gure PVFIAF

Figure PVFI ! pentre vide

g9est omme el que t fontionneF g9est un peu droutnt u dutD mis prs on pprie u ontrire que el it t pens insiF RTT

LES FENTRES

Donc si je comprends bien, il n'y a pas de classe QFenetre ou quelque chose du genre ?

out fitD il n9y ps de lsse du genre QFenetre r n9importe quel widget peut servir de fentreF our tD 9est le widget qui n9 ps de prent qui ser onsidr omme tnt l fentreF e titreD un QPushButton ou un QLineEdit peuvent tre onsidrs omme des fentres s9ils n9ont ps de widget prentF outefoisD il y deux lsses de widgets que j9imeris mettre en vleur X ! QMainWindow X 9est un widget spil qui permet de rer l fentre priniple de l9pplitionF ne fentre priniple peut ontenir des menusD une rre d9outilsD une rre d9ttD etF ! QDialog X 9est une lsse de se utilise pr toutes les lsses de otes de dilogue qu9on vues il y quelques hpitresF yn peut ussi s9en servir diretement pour ouvrir des otes de dilogue personnlisesF v fentre priniple QMainWindow mrite un hpitre entier elle toute seule F xous pourrons lors trnquillement psser en revue l gestion des menusD de l rre d9outils et de l rre d9ttF v fentre QDialog peut tre utilise pour ouvrir une ote de dilogue gnrique personnliserF ne ote de dilogue est une fentreD gnrlement de petite tilleD dns lquelle il y peu d9informtionsF v lsse QDialog hrite de QWidget omme tout widget qui se respete et elle y est mme trs similireF ille y joute peu de hosesD prmi lesquelles l gestion des fentres modles F xous llons ii tudier e que l9on peut fire d9intressnt ve l lsse de se QWi dget qui permet dj de rliser l pluprt des fentres que l9on veutF xous verrons ensuite e qu9on peut fire ve les fentres de type QDialogF unt QMainWindowD e ser pour un utre hpitreD omme je vous l9i ditF
1 2

Une fentre avec QWidget


our ommenerD je vous invite ouvrir l doumenttion de QWidget en mme temps que vous lisez e hpitreF  houmenttion de idget gode we X RQWWQV  ous remrquerez que QWidget est l lsse mre d9un grrrrnd nomre d9utres lssesF ves QWidget disposent de euoup de proprits et de mthodesF hon tous les widgets disposent de es proprits et mthodesF yn peut douper les proprits en deux tgories X ! elles qui vlent pour tous les types de widgets et pour les fentres Y
1. Et elle en aura un. 2. Une fentre par-dessus toutes les autres, qui doit tre remplie avant de pouvoir accder aux autres fentres de l'application.

RTU

CHAPITRE 28.

LES PRINCIPAUX WIDGETS

! elles qui n9ont de sens que pour les fentresF tetons un oup d9il elles qui me semlent les plus intressntesF our voir l liste omplteD il fudr reourir l doumenttionD je ne ompte ps tout rpter ii 3
Les proprits utilisables pour tous les types de widgets, y compris les fentres

te vous fis une liste rpide pour extrire quelques proprits qui pourrient vous intresserF our svoir omment vous servir de toutes es propritsD lisez le prototype que vous donne l doumenttionF
N'oubliez pas qu'on peut modier une proprit en appelant une mthode dont le nom est construit sur celui de la proprit, prx par set. Par exemple, si la proprit est cursor, la mthode sera setCursor().

lssiques @omme le slierA sont prd(nis dns une numrtionF v doumentE tion vous propose un lien vers ette numrtionF ! enabled X indique si le widget est tivD si on peut le modi(erF n widget dstiv est gnrlement grisF i vous ppliquez setEnabled(false) toute l fentreD 9est toute l fentre qui devient inutilisleF ! height X huteur du widgetF ! size X dimensions du widgetF ous devrez indiquer l lrgeur et l huteurF ! visible X ontrle l visiilit du widgetF ! width X lrgeurF x9ouliez ps X pour modi(er une de es propritsD pr(xez l mthode pr un setF ixemple X
mpenetreFsetidth@PHHAY

cursor X urseur de l souris 0her lors du survol du widgetF v mthode setCursor ttend que vous lui envoyiez un ojet de type QCursorF gertins urseurs

ges proprits sont don vlles pour tous les widgetsD y ompris les fentresF i vous ppliquez un setWidth sur un outonD el modi(er l lrgeur du outonF i vous ppliquez el sur une fentreD 9est l lrgeur de l fentre qui ser modi(eF
Les proprits utilisables uniquement sur les fentres

ges proprits sont files reonntreD elles ommenent toutes pr windowF illes n9ont de sens que si elles sont ppliques ux fentresF ! windowFlags X une srie d9options ontrlnt le omportement de l fentreF sl fut onsulter l9numrtion Qt::WindowType pour onntre les di'rents types dispoE nilesF ous pouvez ussi onsulter l9exemple indow plgs du progrmme  t ixmples nd hemos F RTV

LES FENTRES

r exemple pour 0her une fentre de type  yutil ve une petite roix et ps de possiilit d9grndissement ou de rdution @(gure PVFPA X g9est pr l ussi qu9on psse pour que l fentre reste prEdessus toutes les utres fentres du systme @ve le )g Qt::WindowStaysOnTopHintAF ! windowIcon X l9ine de l fentreF sl fut envoyer un ojet de type QIconD qui luiE mme epte un nom de (hier hrgerF gel donne le ode suivnt pour hrger le (hier icone.png situ dns le mme dossier que l9pplition @(gure PVFQA X !
fenetreFsetindowson@son@4ioneFpng4AAY fenetreFsetindowplgs@tXXoolAY

windowTitle

fenetreFsetindowitle@4ve rogrmme du ro vHFH4AY

X le titre de l fentreD 0h en hut @(gure PVFRAF

Figure PVFP ! ne fentre de type  ool

Figure PVFQ ! ne ine pour l fentre

Figure PVFR ! ne fentre ve un titre

Une fentre avec QDialog


est un widget spilement onu pour gnrer des fentres de type  ote de dilogue F
QDialog

Quelle est la dirence avec une fentre cre partir d'un QWidget ?

RTW

CHAPITRE 28.

LES PRINCIPAUX WIDGETS

in gnrl les QDialog sont des petites fentres seondires X des otes de dilogueF illes proposent le plus souvent un hoix simple entre X ! lider Y ! ennulerF ves QDialog sont rrement utilises pour grer l fentre prinipleF our ette fentreD on prfrer utiliser QWidget ou rrment QMainWindow si on esoin de l9rtillerie lourdeF ves QDialog peuvent tre de P types X ! modales X on ne peut ps der ux utres fentres de l9pplition lorsqu9elles sont ouvertes Y ! non modales X on peut toujours der ux utres fentresF r dfutD les QDialog sont modlesF illes disposent en e'et d9une mthode exec() qui ouvre l ote de dilogue de mnire modleF sl s9vre d9illeurs qu9exec() est un slot @trs prtique pour e'etuer une onnexion el 3AF te vous propose d9essyer de prtiquer de l mnire suivnte X nous llons ouvrir une fentre priniple QWidget qui ontiendr un outonF vorsqu9on liquer sur e outonD il ouvrir une fentre seondire de type QDialogF xotre ojetif est d9ouvrir une fentre seondire prs un li sur un outon de l fentre prinipleF v fentre seondireD de type QDialogD 0her seulement une imge pour et exempleF
5inlude `epplitionb 5inlude `tquib int min@int rgD hr BrgvA { epplition pp@rgD rgvAY idget fenetreY ushfutton Bouton a new ushfutton@4yuvrir l fentre4D 8fenetreAY hilog seondepenetre @8fenetreAY foxvyout Blyout a new foxvyoutY vel Bimge a new vel@8seondepenetreAY imgeEbsetixmp@ixmp@4ioneFpng4AAY lyoutEbddidget@imgeAY seondepenetreFsetvyout@lyoutAY idgetXXonnet@outonD sqxev@liked@AAD 8seondepenetreD vy@exe@AAAY fenetreFshow@AY } return ppFexe@AY

RUH

LES BOUTONS

Mon code est indent de manire bizarrode, je sais. Je trouve que c'est plus lisible : vous pouvez ainsi mieux voir quelles fentres se rapportent les oprations que je fais. Vous voyez donc immdiatement que, dans la premire fentre, je n'ai fait que placer un bouton, tandis que dans la seconde j'ai mis un QLabel achant une image que j'ai place dans un QVBoxLayout. D'autre part, pour cet exemple, j'ai tout fait dans le main. Toutefois, dans la pratique, comme nous le verrons dans les TP, on a en gnral un chier .cpp par fentre, c'est plus facile grer.

eu dprtD l fentre priniple s90he @(gure PVFSAF

Figure PVFS ! v fentre priniple

i vous liquez sur le outonD l ote de dilogue s9ouvre @(gure PVFTAF

Figure PVFT ! v ote de dilogue

gomme elle est modleD vous remrquerez que vous ne pouvez ps der l fentre priniple tnt qu9elle est ouverteF i vous voulez en svoir plus sur les QDialogD vous svez e qu9il vous reste fire X tout est dns l doumenttionF

Les boutons
xous llons mintennt tudier l tgorie des widgets  outons F xous llons psser en revue X ! QPushButton X un outon lssiqueD que vous vez dj lrgement eu l9osion de mnipuler Y RUI

CHAPITRE 28.

LES PRINCIPAUX WIDGETS

! QRadioButton X un outon  rdio D pour un hoix fire prmi une liste Y ! QCheckBox X une se oher @on onsidre que 9est un outon en qs hesignAF ous es widgets hritent de QAbstractButton qui luiEmme hrite de QWidgetD qui (nlement hrite de QObject @(gure PVFUAF

Figure PVFU ! v9hritge des outons

gomme l9indique son nomD QAbstractButton est une lsse striteF i vous vous souvenez des pisodes prdents de notre pssionnnt feuilletonD une lsse strite est une lsseF F F qu9on ne peut ps instnierD rvo 3 yn ne peut don ps rer d9ojets de type QAbstractButtonD il fut forment utiliser une des lsses (llesF QAbstractButton sert don juste de modle de se pour ses lsses (llesF
QPushButton

: un bouton
3

ve QPushButton est l9lment le plus lssique et le plus ommun des fentres @(gure PVFVAF gommenons pr un rppel importntD indiqu pr l doumenttion X QPushButton hrite de QAbstractButtonF it 9est vriment une info importnte r vous serez peutE
3. Je ne vous fais pas l'oense de vous expliquer quoi sert un bouton !

RUP

LES BOUTONS

Figure PVFV ! ushfutton

tre surpris de voir que QPushButton ontient peu de mthodes qui lui sont propresF g9est normlD une grnde prtie d9entre elles se trouvt dns s lsse prente QAbstra ctButtonF
Il faut donc absolument consulter aussi QAbstractButton, et mme sa classe mre QWidget (ainsi qu'ventuellement QObject, mais c'est plus rare), si vous voulez connatre toutes les possibilits oertes au nal par un QPushButto n. Par exemple, setEnabled permet d'activer/dsactiver le bouton, et cette proprit se trouve dans QWidget.

n outon met un signl clicked() qund on l9tiveF g9est le signl le plus ommuE nment utilisF yn note ussi les signux pressed() @outon enfonA et released() @outon relhAD mis ils sont plus rresF
QCheckBox

: une case cocher

ne se oher QCheckBox est gnrlement ssoie un texte de liell omme l (gure PVFWF
Figure PVFW ! ne se oher

yn d(nit le liell de l se lors de l9ppel du onstruteur X


5inlude `epplitionb 5inlude `idgetb 5inlude `ghekfoxb int min@int rgD hr BrgvA { epplition pp@rgD rgvAY idget fenetreY ghekfox Bhekox a new ghekfox@4t9ime les frites4D 8fenetreAY fenetreFshow@AY } return ppFexe@AY

RUQ

CHAPITRE 28.

LES PRINCIPAUX WIDGETS

v se oher met le signl stateChanged(bool) lorsqu9on modi(e son ttF ve oolen en prmtre nous permet de svoir si l se est mintennt ohe ou doE heF i vous voulez vri(er un utre moment si l se est oheD ppelez isChecked() qui renvoie un oolenF yn peut ussi fire des ses oher trois tts @le troisime tt tnt l9tt grisAF enseignezEvous sur l proprit tristate pour pprendre omment fireF xotez que e type de se oher est reltivement rreF in(nD shez que si vous vez plusieurs ses oherD vous pouvez les regrouper u sein d9une QGroupBoxF
QRadioButton

: les boutons radio

g9est une se oher prtiulire X une seule se peut tre ohe l fois prmi une liste @(gure PVFIHAF
Figure PVFIH ! n outon rdio

ves outons rdio qui ont le mme widget prent sont mutuellement exlusifsF i vous en ohez unD les utres seront utomtiquement dohsF in gnrlD on ple les outons rdio dns une QGroupBoxF tiliser des QGroupBox di'rentes vous permet de sprer les groupes de outons rdioF oii un exemple d9utilistion d9une QGroupBox @qui ontient un lyout herergent les QRadioButtonA X
5inlude `epplitionb 5inlude `tquib int min@int rgD hr BrgvA { epplition pp@rgD rgvAY idget fenetreY qroupfox Bgroupox a new qroupfox@4otre plt prfr4D 8fenetreAY diofutton Bsteks a new diofutton@4ves steks4AY diofutton Bhmurgers a new diofutton@4ves hmurgers4AY diofutton Bnuggets a new diofutton@4ves nuggets4AY steksEbsetgheked@trueAY foxvyout Bvox a new foxvyoutY voxEbddidget@steksAY voxEbddidget@hmurgersAY

RUR

LES AFFICHEURS

voxEbddidget@nuggetsAY groupoxEbsetvyout@voxAY groupoxEbmove@SD SAY fenetreFshow@AY } return ppFexe@AY

J'en prote pour rappeler que vous pouvez inclure l'en-tte QtGui pour automatiquement inclure les en-ttes de tous les widgets, comme je l'ai fait ici.

ves outons rdio sont pls dns un lyout qui est luiEmme pl dns l groupoxD qui est elleEmme ple dns l fentre @(gure PVFIIAF (ou 3 ve onept des widgets onteneurs est ii utilis fond 3 it enoreD je n9i ps fit de lyout pour l fentreD e qui fit que l tille initile de l fentre est un peu petiteF wis e n9est ps grveD 9est pour l9exemple F
4

Figure PVFII ! lusieurs outons rdio

Les acheurs
rmi les widgets 0heursD on ompte priniplement X ! QLabel X le plus importntD un widget permettnt d90her du texte ou une imge Y ! QProgressBar X une rre de progressionF itudionsEles en hurD sns heurtsD dns l joie et l onne humeur 3
QLabel

: acher du texte ou une image

g9est vriment vi widget de se pour 0her du texte l9intrieur de l fentre @(gure PVFIPAF xous l9vons dj utilis indiretement uprvntD via les ses oher ou enore les lyouts de formulireF
4. Nota : j'ai quand mme une nourriture plus quilibre que ne le laisse suggrer cette dernire capture d'cran, je vous rassure ! ;-)

RUS

CHAPITRE 28.

LES PRINCIPAUX WIDGETS

Figure PVFIP ! vel


QLabel hrite de QFrame, qui est un widget de base permettant d'acher des bordures. Renseignez-vous auprs de QFrame pour apprendre grer les dirents types de bordure. Par dfaut, un QLabel n'a pas de bordure.

n QLabel peut 0her plusieurs types d9lments X ! du texte @simple ou enrihiA Y ! une imgeF
Acher un texte simple

ien de plus simpleD on utilise setText() X


lelEbsetext@4fonjour les ros 34AY

wis on peut ussi 0her un texte simple ds l9ppel u onstruteurD omme ei X


vel Blel a new vel@4fonjour les ros 34D 8fenetreAY

ve rsultt est le mme que l pture d9rn que je vous i montre plus tt @(gure PVFIPAF ous pouvez jeter ussi un oup d9il l proprit alignmentD qui permet de d(nir l9lignement du texte dns le liellF
Sachez aussi qu'on peut crire du code HTML dans le libell pour lui appliquer une mise en forme (texte en gras, liens hypertexte, etc.).
Acher une image

ous pouvez demnder e que le QLabel 0he une imgeF gomme il n9y ps de onstruteur qui epte une imge en prmtreD on v ppeler le onstruteur qui prend juste un pointeur vers l fentre prenteF xous demnderons ensuite e que le liell 0he une imge l9ide de setPixmapF gette mthode ttend un ojet de type QPixmapF eprs leture de l doumenttion sur QPixmapD il s9vre que ette lsse un onstruteur qui epte le nom du (hier hrger sous forme de hne de rtresF RUT

LES CHAMPS

vel Blel a new vel@8fenetreAY lelEbsetixmp@ixmp@4ioneFpng4AAY

our que el fontionneD l9ine doit se trouver dns le mme dossier que l9exutle @(gure PVFIQAF

Figure PVFIQ ! ne imge dns un lel


QProgressBar

: une barre de progression

ves rres de progression sont gres pr QProgressBarF gel permet d9indiquer l9utilisteur l9vnement des oprtions @(gure PVFIRAF
Figure PVFIR ! QProgressBar

oii quelques proprits utiles de l rre de progression X ! maximum X l vleur mximle que peut prendre l rre de progression Y ! minimum X l vleur minimle que peut prendre l rre de progression Y ! value X l vleur tuelle de l rre de progressionF yn utiliser don setValue pour hnger l vleur de l rre de progressionF r dfut les vleurs sont omprises entre H et IHH7F
Qt ne peut pas deviner o en sont vos oprations. C'est vous de calculer leur pourcentage d'avancement. La QProgressBar se contente d'acher le rsultat.

ne QProgressBar envoie un signl valueChanged() lorsque s vleur t modi(eF

Les champs
xous llons mintennt fire le tour des widgets qui permettent de sisir des donnesF g9est l tgorie de widgets l plus importnteF RUU

CHAPITRE 28.

LES PRINCIPAUX WIDGETS

inore une foisD nous ne verrons ps toutD seulement les prinipux d9entre eux X ! QLineEdit X hmp de texte une seule ligne Y ! QTextEdit X hmp de texte plusieurs lignes pouvnt 0her du texte mis en forme Y ! QSpinBox X hmp de texte dpt l sisie de nomre entiers Y ! QDoubleSpinBox X hmp de texte dpt l sisie de nomre dimux Y ! QSlider X urseur qui permet de sletionner une vleur Y ! QComboBox X liste droulnteF
QLineEdit

: champ de texte une seule ligne

xous vons utilis e widget omme lsse d9exemple lors du hpitre sur l leture de l doumenttion de tD vous vous souvenez c n QLineEdit est un hmp de texte sur une seule ligne @(gure PVFISAF

Figure PVFIS ! QLineEdit

on utilistion estD dns l pluprt des sD ssez simpleF oii quelques proprits onntre X ! text X permet de ruprerGmodi(er le texte ontenu dns le hmpF ! alignment X lignement du texte l9intrieurF ! echoMode X type d90hge du texteF sl fudr utiliser l9numrtion EchoMode pour indiquer le type d90hgeF r dfutD les lettres sisies sont 0hes mis on peut ussi fire en sorte que les lettres soient msquesD pour les mots de psse pr exempleF une hne rpondnt des ritres pris @pr exempleD un numro de tlphone ne doit ps ontenir de lettresAF ous pouvez ussi jeter un oup d9il ux validators qui sont un utre moyen de vlider l sisie de l9utilisteurF ! maxLength X le nomre de rtres mximum qui peuvent tre sisisF ! readOnly X le ontenu du hmp de texte ne peut tre modi(F gette proprit ressemle enabled @d(nie dns QWidgetA misD ve readOnlyD on peut qund mme opierEoller le ontenu du QLineEdit tndis qu9ve enabledD le hmp est ompltement gris et on ne peut ps ruprer son ontenuF yn note ussi plusieurs slots qui permettent de ouperGopierGollerGviderGnnuler le hmp de texteF A in(nD ertins signux omme returnPressed() @l9utilisteur ppuy sur Entre ou textChanged() @l9utilisteur modi( le texteA peuvent tre utiles dns ertins sF RUV !
lineiditEbsetihowode@vineiditXXsswordAY

inputMask X permet de d(nir un msque de sisieD pour oliger l9utilisteur fournir

LES CHAMPS

QTextEdit

: champ de texte plusieurs lignes

ge type de hmp est similire elui qu9on vient de voirD l9exeption du fit qu9il gre l9dition sur plusieurs lignes etD en prtiulierD qu9il utorise l90hge de texte enrihi @rwvAF oii un QTextEdit en (gure PVFITF

Figure PVFIT ! QTextEdit

sl y un ertin nomre de hoses que l9on pourrit voir sur les QTextEdit mis e serit un peu trop long pour e hpitreD qui vise plutt psser rpidement en revue les widgetsF xotez les proprits plainText et html qui permettent de ruprer et modi(er le ontenu respetivement sous forme de texte simple et sous forme de texte enrihi en rwvF out dpend de l9utilistion que vous en fites X normlementD dns l pluprt des sD vous utiliserez plutt plainTextF
QSpinBox

: champ de texte de saisie d'entiers

ne QSpinBox est un hmp de texte @type QLineEditA qui permet d9entrer uniquement un nomre entier et qui dispose de petits outons pour ugmenter ou diminuer l vleur @(gure PVFIUAF
Figure PVFIU ! QSpinBox

oii quelques proprits intressntes X ! accelerated X permet d9utoriser l spinox lrer l modi(tion du nomre si on ppuie longtemps sur le outonF ! minimum X vleur minimle que peut prendre l spinoxF ! maximum X vleur mximle que peut prendre l spinoxF ! singleStep X ps d9inrmenttion @pr dfut de IAF i vous voulez que les outons fssent vrier l spinox de IHH en IHHD 9est ette proprit qu9il fut modi(er 3 ! value X vleur ontenue dns l spinoxF ! prefix X texte 0her vnt le nomreF ! suffix X texte 0her prs le nomreF
5. Tiens, encore une classe abstraite !

QSpinBox hrite de QAbstractSpinBox 5 F ri(ez don ussi l doumenttion QAbstractSpinBox pour onntre toutes les proprits de l spinoxF

de

RUW

CHAPITRE 28.

LES PRINCIPAUX WIDGETS

QDoubleSpinBox

: champ de texte de saisie de nombres dcimaux

ve QDoubleSpinBox @(gure PVFIVA est trs similire u QSpinBoxD l di'rene prs qu9il trville sur des nomres dimux @des douleAF
Figure PVFIV ! QDoubleSpinBox

yn retrouve l pluprt des proprits de QSpinBoxF yn peut rjouter l proprit decimals qui gre le nomre de hi'res prs l virgule 0hs pr le QDoubleSpinBoxF
QSlider

: un curseur pour slectionner une valeur

n QSlider se prsente sous l forme d9un urseur permettnt de sletionner une vleur numrique @(gure PVFIWAF
Figure PVFIW ! QSlider

hrite de QAbstractSlider qui propose dj un grnd nomre de fontionE nlits de seF feuoup de proprits sont les mmes que QSpinBoxD je ne les reprendri don ps iiF xotons l proprit orientation qui permet de d(nir l9orienttion du slider @vertile ou horizontleAF tetez un oup d9il en prtiulier ses signux r on onnete en gnrl le signl valueChanged(int) u slot d9utres widgets pour rperuter l sisie de l9utilisteurF xous vions d9illeurs mnipul e widget lors du hpitre sur les signux et les slotsF
QSlider
6

QComboBox

: une liste droulante

ne QComboBox est une liste droulnte @(gure PVFPHAF

Figure PVFPH ! QComboBox

yn joute des vleurs l liste droulnte ve l mthode addItem X


6. Damned, encore une classe abstraite !

RVH

LES CONTENEURS

gomofox Bliste a new gomofox@8fenetreAY listeEbddstem@4ris4AY listeEbddstem@4vondres4AY listeEbddstem@4ingpour4AY listeEbddstem@4okyo4AY

yn dispose de proprits permettnt de ontrler le fontionnement de l QComboBox X ! count X nomre d9lments dns l liste droulnteF ! currentIndex X numro d9indie de l9lment tuellement sletionnF ves indies ommenent HF einsiD si currentIndex renvoie PD 9est que  ingpour t sletionn dns l9exemple prdentF ! currentText X texte orrespondnt l9lment sletionnF i on sletionn  inE gpour D ette proprit ontient don  ingpour F ! editable X indique si le widget utorise l9jout de vleurs personnlises ou nonF r dfutD l9jout de nouvelles vleurs est interditF i le widget est ditleD l9utilisteur pourr entrer de nouvelles vleurs dns l liste droulnteF ille se omporter don ussi omme un hmp de texteF v9jout d9une nouvelle vleur se fit en ppuynt sur l touhe  intre F ves nouvelles vleurs sont ples pr dfut l (n de l listeF v QComboBox met des signux omme currentIndexChanged() qui indique qu9un nouvel lment t sletionn et highlighted() qui indique l9lment survol pr l souris @es signux peuvent envoyer un int pour donner l9indie de l9lment ou un QString pour le texteAF

Les conteneurs
xormlementD n9importe quel widget peut en ontenir d9utresF gependntD ertins widgets ont t rs spilement pour pouvoir en ontenir d9utres X ! QFrame X un widget pouvnt voir une ordure Y ! QGroupBox X un widget @que nous vons dj utilisA dpt l gestion des groupes de ses oher et de outons rdio Y ! QTabWidget X un widget grnt plusieurs pges d9ongletsF QFrame est simple omprendreD je vous renvoie don vers l doumenttionF ous y pprendrez hoisir le type de ordure qui vous onvient le mieuxF prt elD e widget ne fit rien de prtiulierD on l9utilise simplement pour regrouper d9utres widgets l9intrieurF unt QGroupBoxD nous l9vons dj tudi un peu plus tt @pge RURAD je vous renvoie don ux exemples prdentsF sntressonsEnous ii plus prisment u QTabWidget @systme d9ongletsAD qui est un peu plus dlit mnipulerF ve QTabWidget propose une gestion de plusieurs pges de widgetsD orgnises sous forme d9onglets @(gure PVFPIAF RVI

CHAPITRE 28.

LES PRINCIPAUX WIDGETS

Figure PVFPI ! QTabWidget

ge widgetEonteneur est sensilement plus di0ile utiliser que les utresF in e'etD il ne peut ontenir qu9un widget pr pgeF
Quoi ? On ne peut pas acher plus d'un widget par page ? ! Mais c'est tout nul !

ufF F F qu9un widget peut en ontenir d9utres 3 it si on utilise un lyout pour orgniser le ontenu de e widgetD on peut rriver rpidement une super prsenttionF ve tout est de svoir ominer tout e qu9on ppris jusqu9iiF h9prs le texte d9introdution de l do de QTabWidgetD e onteneur doit tre utilis de l fon suivnte X IF grer un QTabWidgetF PF grer un QWidget pour hune des pges @hun des ongletsA du QTabWidgetD sns leur indiquer de widget prentF QF ler des widgets enfnts dns hun de es QWidget pour peupler le ontenu de hque pgeF tiliser un lyout pour positionner les widgets de prfreneF RF eppeler plusieurs fois addTab() pour rer les pges d9onglets en indiqunt l9dresse du QWidget qui ontient l pge hque foisF fonD 9est un peu plus dlit omme vous pouvez le voirD mis il fut ien un peu de di0ultD e hpitre tit trop fileF YEA i on fit tout dns l9ordreD vous llez voir que l9on n9ur ps de prolmeF te vous propose de lire e ode que j9i rD qui illustre l9utilistion du QTabWidgetF sl est un peu long mis il est omment et vous devriez rriver le digrerF
5inlude `epplitionb 5inlude `tquib int min@int rgD hr BrgvA { epplition pp@rgD rgvAY idget fenetreY GG I X grer le idget

RVP

LES CONTENEURS

idget Bonglets a new idget@8fenetreAY ongletsEbsetqeometry@QHD PHD PRHD ITHAY GG P X grer les pgesD en utilisnt un widget prent pour ontenir hune des pges idget BpgeI a new idgetY idget BpgeP a new idgetY vel BpgeQ a new velY GG gomme un vel est ussi un idget @il en hriteAD on peut ussi s9en servir de pge GG Q X grer le ontenu des pges de widgets GG ge I vineidit Blineidit a new vineidit@4intrez votre nom4AY ushfutton BoutonI a new ushfutton@4gliquez ii4AY ushfutton BoutonP a new ushfutton@4yu lFFF4AY foxvyout BvoxI a new foxvyoutY voxIEbddidget@lineiditAY voxIEbddidget@outonIAY voxIEbddidget@outonPAY pgeIEbsetvyout@voxIAY GG ge P rogressfr Bprogress a new rogressfrY progressEbsetlue@SHAY lider Bslider a new lider@tXXrorizontlAY ushfutton BoutonQ a new ushfutton@4lider4AY foxvyout BvoxP a new foxvyoutY voxPEbddidget@progressAY voxPEbddidget@sliderAY voxPEbddidget@outonQAY pgePEbsetvyout@voxPAY GG ge Q @je ne vis ffiher qu9une imge iiD ps esoin de lyoutA pgeQEbsetixmp@ixmp@4ioneFpng4AAY pgeQEbsetelignment@tXXeligngenterAY GG R X jouter les onglets u idgetD en indiqunt l pge qu9ils ontiennent ongletsEbdd@pgeID 4goordonnes4AY ongletsEbdd@pgePD 4rogression4AY ongletsEbdd@pgeQD 4smge4AY

RVQ

CHAPITRE 28.

LES PRINCIPAUX WIDGETS

fenetreFshow@AY } return ppFexe@AY

gopier e ode gode we X WIQTPW  ous devriez retrouver hune des tpes que j9i mentionnes plus hut X IF te re d9ord le QTabWidget que je positionne ii de mnire solue sur l fentre @mis je pourris ussi utiliser un lyoutAF PF insuiteD je re les pges pour hun de mes ongletsF ges pges sont mtrilises pr des QWidgetF ous noterez queD pour l dernire pgeD je n9utilise ps un QWidget mis un QLabelF gel revient u mme et 9est omptile r QLabel hrite de QWidgetF ur l dernire pgeD je me ontenteri d90her une imgeF QF te re ensuite le ontenu de hune de es pges que je dispose l9ide de lyouts vertiux @suf pour l pge Q qui n9est onstitue que d9un widgetAF v il n9y rien de nouveuF RF in(nD j9joute les onglets ve l mthode addTab()F te dois indiquer le liell de l9onglet insi qu9un pointeur vers le  widgetEpge de ette pgeF sulttD on un super systme omportnt trois d9onglets ve tout plein de widgets dedns @(gure PVFPPA 3

Figure PVFPP ! ve QTabWidget en tion

te vous onseille de vous entrner rer vous ussi un QTabWidgetF g9est un on exerieD et 9est l9osion de rutiliser l pluprt des widgets que l9on vus dns e hpitreF

En rsum
! eve tD tout est onsidr omme un widget X les outonsD les hmps de texteD les imgesF F F et mme l fentre 3 ! t propose de trs nomreux widgetsF our pprendre les utiliserD le plus simple est de lire leur pge de doumenttionF sl est inutile d9essyer de retenir pr ur le nom de toutes les mthodesF RVR

LES CONTENEURS

! n widget peut en ontenir un utreF gertins widgets sont spi(quement onus pour en ontenir d9utresD on les ppelle les onteneursF ! n widget qui n9 ps de prent s90he sous forme de fentreF

RVS

CHAPITRE 28.

LES PRINCIPAUX WIDGETS

RVT

Chapitre

29
Dicult :

TP : ZeroClassGenerator

e pense que le moment est bien choisi de vous exercer avec un petit TP. En eet, vous avez dj vu susamment de choses sur Qt pour tre en mesure d'crire ds maintenant des programmes intressants. Notre programme s'intitulera le ZeroClassGenerator. . . un programme qui gnre le code de base des classes C++ automatiquement, en fonction des options que vous choisissez !

RVU

CHAPITRE 29.

TP : ZEROCLASSGENERATOR

Notre objectif
xe vous lissez ps impressionner pr le nom  eroglssqenertor F ge ne ser ps ien di0ile et rutiliser toutes les onnissnes que vous vez pprises pour les mettre pro(t dns un projet onretF ge est volontirement modulire X je vis vous proposer de rliser un progrmme de se ssez simpleD que je vous lisseri oder et que je orrigeri ensuite ve vousF uisD je vous proposeri un ertin nomre d9mliortions intressntes @non orrigesA pour lesquelles il fudr vous reuser un peu plus les mninges si vous tes motivsF xotre eroglssqenertor est un progrmme qui gnre le ode de se des lsses gCCF u9estEe que el veut dire c

Un gnrateur de classes C++


ge progrmme est un outil grphique qui v rer utomtiquement le ode soure d9une lsse en fontion des options que vous urez hoisiesF ous n9vez jmis remrqu que les lsses vient en gnrl une struture de se siE milireD qu9il fllit rrire hque fois c g9est un peu lorieux prfoisF r exemple X
5ifndef riehiweqsgsix 5define riehiweqsgsix lss wgiien X puli ersonnge { puliX wgiien@AY ~wgiien@AY protetedX }Y privteX

5endif

ien que pour elD il serit prtique d9voir un progrmme ple de gnrer le squelette de l lsseD de d(nir les portes publicD protected et privateD de d(nir un onstruteur pr dfut et un destruteurD etF xous llons rliser une qs @une fentreA ontennt plusieurs optionsF lutt que de fire une longue listeD je vous propose une pture d9rn du progrmme (nl rliser @(gure PWFIAF v fentre priniple est en hut guheD en rrireEplnF v9utilisteur renseigne oligtoirement le hmp  xom D pour indiquer le nom de l lsseF sl peut ussi donner le nom de l lsse mreF RVV

NOTRE OBJECTIF

Figure PWFI ! ve eroglssqenertor

RVW

CHAPITRE 29.

TP : ZEROCLASSGENERATOR

yn propose quelques ses oher pour hoisir des options omme  rotger le heder ontre les inlusions multiples F in(nD on donne l possiilit d9jouter des ommentires en hut du (hier pour indiquer l9uteurD l dte de rtion et le rle de l lsseF g9est une onne hitudeD en e'etD que de ommenter un peu le dut de ses lsses pour voir une ide de e quoi elle sertF vorsqu9on lique sur le outon  qnrer en sD une nouvelle fentre s9ouvre @une QDialogAF ille 0he le ode gnr dns un QTextEdit et vous pouvez prtir de l opierGoller e ode dns votre shi omme gode: :floksou t gretorF g9est un dut et je vous proposeri l (n du hpitre des mliortions intressntes jouter e progrmmeF issyez dj de rliser el orretementD el reprsente un peu de trvilD je peux vous le dire 3
1

Quelques conseils techniques


evnt de vous lher tels des fuves dns l jungleD je voudris vous donner quelques onseils tehniques pour vous guider un peuF
Architecture du projet

te vous reommnde de fire une lsse pr fentreF gomme on deux fentres et qu9on met toujours le main prtD el fit inq (hiers X ! main.cpp X ontiendr uniquement le main qui ouvre l fentre priniple @trs ourtA Y ! FenPrincipale.h X heder de l fentre priniple Y ! FenPrincipale.cpp X implmenttion des mthodes de l fentre priniple Y ! FenCodeGenere.h X heder de l fentre seondire qui 0he le ode gnr Y ! FenCodeGenere.cpp X implementtion de ses mthodesF our l fentre prinipleD vous pourrez hriter de QWidget omme on l9 toujours fitD el me semle le meilleur hoixF our l fentre seondireD je vous onseille d9hriter de QDialogF v fentre priniple ouvrir l QDialog en ppelnt s mthode exec()F
La fentre principale

te vous onseille trs fortement d9utiliser des lyoutsF won lyout priniplD si vous regrdez ien m pture d9rnD est un lyout vertilF sl ontient des QGroupBoxF l9intrieur des QGroupBoxD j9utilise nouveu des lyoutsF te vous lisse le hoix du lyout qui vous semle le plus dpt hque foisF our le QGroupBox  ejouter des ommentires D il fudr jouter une se oherF i ette se est oheD les ommentires seront joutsF inonD on ne mettr ps de
1. Cela consiste placer les lignes qui commencent par un # comme #ifndef et qui vitent que le mme chier .h puisse tre inclus deux fois dans un mme programme.

RWH

NOTRE OBJECTIF

ommentiresF enseignezEvous sur l9utilistion des ses oher dns les QGroupBoxF our le hmp  hte de rtion D je vous propose d9utiliser un QDateEditF xous n9vons ps vu e widget u hpitre prdent mis je vous fis on(neD il est prohe de l QSpinBox etD prs leture de l doumenttionD vous devriez svoir vous en servir sns prolmeF ous  dessinerez le ontenu de l fentre dns le onstruteur de FenPrincipaleF ensez fire de vos hmps de formulire des ttriuts de l lsse @les QLineEditD QCheckboxF F FAD (n que toutes les utres mthodes de l lsse ient s leur vleurF vors d9un li sur le outon  qnrer 3 D ppelez un slot personnlisF hns e slot personnlis @qui ne ser rien d9utre qu9une mthode de FenPrincipaleAD vous ruE prerez toutes les informtions ontenues dns les hmps de l fentre pour gnrer le ode dns une hne de rtres @de type QString de prfreneAF g9est l qu9il fudr un peu r)hir sur l gnrtion du ode mis 9est tout fit fisleF ne fois le ode gnrD votre slot ppeller l mthode exec() d9un ojet de type FenCodeGenere que vous urez r pour l9osionF v fentre du ode gnr s90E her lorsF F F

La fentre du code gnr

feuoup plus simpleD ette fentre est onstitue d9un QTextEdit et d9un outon de fermetureF our le QTextEditD essyez de d(nir une polie hsse (xe @omme  gourier A pour que el ressemle du odeF ersonnellementD j9i rendu le QTextEdit en mode readOnly pour qu9on ne puisse ps modi(er son ontenu @juste le opierAD mis vous fites omme vous voulezF ous onneterez le outon  permer un slot spil de l QDialog qui demnde l fermeture et qui indique que tout s9est ien pssF te vous lisse trouver dns l doumenttion duquel il s9gitF
Minute euh. . . Comment je passe le code gnr (de type QString si j'ai bien compris) la seconde fentre de type QDialog ?

ve mieux est de psser ette QString en prmtre du onstruteurF otre fentre ruprer insi le ode et n9ur plus qu9 l90her dns son QTextEdit 3 ellez hop hop hopD u oulotD vos diteurs 3 ous urez esoin de lire l doumenttion plusieurs fois pour trouver l onne mthode ppeler hque foisD don n9yez ps peur d9y llerF yn se retrouve dns l prtie suivnte pour lF F F orretion 3 RWI

CHAPITRE 29.

TP : ZEROCLASSGENERATOR

Correction
hing 3 g9est l9heure de rmsser les opies 3 fien que je vous ie donn quelques onseils tehniquesD je vous i volontirement liss le hoix pour ertins petits dtils @omme  quelles ses sont ohes pr dfut AF ous pouviez mme prsenter l fentre un peu di'remment si vous vouliezF out el pour dire que m orretion n9est ps l orretion ultimeF i vous vez fit di'remmentD e n9est ps grveF i vous n9vez ps russiD e n9est ps grve non plusD ps de pnique X prenez le temps de ien lire mon ode et d9essyer de omprendre e que je fisF ous devrez tre ples pr l suite de refire e sns regrder l orretionF
main.cpp

gomme prvuD e (hier est tout te et ne mrite mme ps d9explitionF


5inlude `epplitionb 5inlude 4penrinipleFh4 int min@int rgD hrB rgvA { epplition pp@rgD rgvAY penriniple fenetreY fenetreFshow@AY } return ppFexe@AY

te signle simplement qu9on urit pu hrger l lngue frnise omme on l9vit fit dns le hpitre sur les otes de dilogueD (n que les menus ontextuels et ertins outons utomtiques soient trduits en frnisF wis 9est du dtilD el ne se verr ps vriment sur e projetF
FenPrincipale.h

v fentre priniple hrite de QWidget omme prvuF ille utilise l mro Q_OBJECT r nous d(nissons un slot personnlis X
5ifndef riehipixsxgsevi 5define riehipixsxgsevi 5inlude `tquib lss penriniple X puli idget {

RWP

CORRECTION

yftig puliX penriniple@AY privte slotsX void generergode@AY privteX vineidit BnomY vineidit BlssewereY ghekfox BprotetionsY ghekfox BgenerergonstruteurY ghekfox BgenererhestruteurY qroupfox BgroupgommentiresY vineidit ButeurY hteidit BdteY extidit BroleY ushfutton BgenererY ushfutton BquitterY }Y 5endif

ge qui est intressntD e sont tous les hmps de formulire que j9i mis en tnt qu9ttriuts @privsA de l lsseF sl fudr les initiliser dns le onstruteurF v9vntge d9voir d(ni les hmps en ttriutsD 9est que toutes les mthodes de l lsse y uront s et el nous ser ien utile pour ruprer les vleurs des hmps dns l mthode qui gnrer le ode soureF xotre lsse est onstitue de deux mthodesD e qui est ii lrgement su0snt X ! FenPrincipale() X 9est le onstruteurF sl initiliser les hmps de l fentreD jouer ve les lyouts et pler les hmps l9intrieurF sl fer des onnexions entre les widgets et indiquer l tille de l fentreD son titreD son ineF F F ! genererCode() X 9est une mthode @plus prisment un slotA qui ser onnete u signl  yn liqu sur le outon qnrer F hs qu9on lique sur le outonD ette mthode est ppeleF t9i mis le slot en priv r il n9y ps de rison qu9une utre lsse l9ppelleD mis j9uris ussi ien pu le mettre puliF
FenPrincipale.cpp

fonD lD 9est le plus gros moreuF sl n9y que deux mthodes @le onstruteur et elle qui gnre le odeA mis elles sont volumineusesF our onserver l lisiilit de et ouvrge et viter de vous ssommer ve un gros ode soureD je vis vous prsenter uniquement le nevs du ode qu9il fllit rliserF ous trouverez le dtil omplet en tlhrgent le ode soure l9ide du ode we RWQ

CHAPITRE 29.

TP : ZEROCLASSGENERATOR

prsent plus loinF


5inlude 4penrinipleFh4 5inlude 4pengodeqenereFh4 penrinipleXXpenriniple@A { GG grtion des lyouts et des widgets GG FFF GG gonnexions des signux et des slots onnet@quitterD sqxev@liked@AAD qeppD vy@quit@AAAY onnet@genererD sqxev@liked@AAD thisD vy@generergode@AAAY } void penrinipleXXgenerergode@A { GG yn vrifie que le nom de l lsse n9est ps videD sinon on rrte if @nomEbtext@AFisimpty@AA { wessgefoxXXritil@thisD 4irreur4D 4euillez entrer u moins un nom de lsse4AY returnY GG errt de l mthode } GG i tout v ienD on gnre le ode tring odeY GG qnrtion du ode l9ide des informtions de l fentre GG FFF GG yn re puis ffihe l fentre qui ffiher le ode gnrD qu9on lui envoie en prmtre pengodeqenere Bfenetregode a new pengodeqenere@odeD thisAY fenetregodeEbexe@AY }

Vous noterez que j'appelle directement la mthode connect() au lieu d'crire QWidget::connect(). En eet, si on est dans une classe qui hrite de QWidget (et c'est le cas), on peut se passer de mettre le prxe QWidget::.

ve onstruteur n9est ps ompliqu rireD il onsiste juste pler et orgniser ses widgetsF r ontreD le slot genererCode demnd du trvil de r)exion r il fut construire l hne du ode soureF ve slot rupre l vleur des hmps de l fentre @via des mthodes omme text() pour les QLineEditAF n QString code est gnr en fontion des hoix que vous vez fitF ne erreur se RWR

CORRECTION

produit et l mthode s9rrte s9il n9y ps u moins un nom de lsse d(niF out l (n de genererCode()D on n9 plus qu9 ppeler l fentre seondire et lui envoyer le ode gnr X
pengodeqenere Bfenetregode a new pengodeqenere@odeD thisAY fenetregodeEbexe@AY

ve ode est envoy lors de l onstrution de l9ojetF v fentre ser 0he lors de l9ppel exec()F
FenCodeGenere.h

v fentre du ode gnr est euoup plus simple que s prente X


5ifndef riehipixgyhiqixii 5define riehipixgyhiqixii 5inlude `tquib lss pengodeqenere X puli hilog { puliX pengodeqenere@tring 8odeD idget BprentAY privteX extidit BodeqenereY ushfutton BfermerY

}Y 5endif

sl y juste un onstruteur et deux petits widgets de rien du toutF YEA


FenCodeGenere.cpp

ve onstruteur prend deux prmtres X ! une rfrene vers le QString qui ontient le ode Y ! un pointeur vers l fentre prenteF
5inlude 4pengodeqenereFh4 pengodeqenereXXpengodeqenere@tring 8odeD idget Bprent a HA X hilog@prentA { odeqenere a new extidit@AY odeqenereEbsetlinext@odeAY

RWS

CHAPITRE 29.

TP : ZEROCLASSGENERATOR

odeqenereEbsetedynly@trueAY odeqenereEbsetpont@pont@4gourier4AAY odeqenereEbsetvinerpwode@extiditXXxorpAY fermer a new ushfutton@4permer4AY foxvyout Blyoutrinipl a new foxvyoutY lyoutriniplEbddidget@odeqenereAY lyoutriniplEbddidget@fermerAY resize@QSHD RSHAY setvyout@lyoutriniplAY } onnet@fermerD sqxev@liked@AAD thisD vy@ept@AAAY

g9est un rppel mis je pense qu9il ne fer ps de ml X le prmtre parent est trnsfr u onstruteur de l lsseEmre QDialog dns ette ligne X
pengodeqenereXXpengodeqenere@tring 8odeD idget Bprent a HA X hilog@prentA

hmtiquementD le trnsfert se fit omme l (gure PWFPF

Figure PWFP ! rritge et pssge de prmtre

Tlcharger le projet
te vous invite tlhrger le projet zipp X   lhrger le projet eroE glssqenertor gode we X WQRVTT   ge zip ontient X ! les (hiers soure .cpp et .h Y ! le projet .cbp pour eux qui utilisent gode: :floks Y ! l9exutle indows et son ine @ttention X il fudr mettre les hvv de t dns le mme dossier si vous voulez que le progrmme puisse s9exuterAF

Des ides d'amliorations


ous pensiez en voir (ni c ue nenni 3 n tel n9ttend qu9une seule hose X tre mlior 3 RWT

DES IDES D'AMLIORATIONS

oii une liste de suggestions qui me pssent pr l tte pour mliorer le erogodeE qenertor mis vous pouvez inventer les vtres X ! vorsqu9on ohe  rotger le heder ontre les inlusions multiples D un de(ne est gnrF r dfutD e heder gurd est de l forme HEADER_NOMCLASSEF ourquoi ne ps l90her en temps rel dns un liell lorsqu9on tpe le nom de l lsse c yu mieuxD 0hezEle en temps rel dns un QLineEdit pour que l personne puisse le modi(er si elle le dsireF ve ut est de vous fire trviller les signux et les slotsF ! ejoutez d9utres options de gnrtion de odeF r exempleD vous pouvez proposer d9inlure le texte lgl d9une liene lire @omme l qvA dns les ommentires d9enEtte si l personne fit un logiiel lire Y vous pouvez demnder quels heders inlureD l liste des ttriutsD gnrer utomtiquement les esseurs pour es tE triutsD etF ettentionD il fudr peutEtre utiliser des widgets de liste un peu plus omplexesD omme le QListWidgetF ! our le moment on ne gnre que le ode du (hier .hF wme s9il y moins de trvilD e serit ien de gnrer ussi le .cppF te vous propose d9utiliser un QTabWidget @des ongletsA pour 0her le ode .h et le .cpp dns l ote de dilogue du ode gnr @(gure PWFQAF ! yn ne peut que voir et opierGoller le ode gnrF g9est ienD mis omme vous je pense que si on pouvit enregistrer le rsultt dns des (hiersD e serit du temps ggn pour l9utilisteurF te vous propose d9jouter dns l QDialog un outon pour enregistrer le ode dns des (hiersF ge outon ouvrir une fentre qui demnder dns quel dossier enregistrer les (hiers .h et .cppF ve nom de es (hiers ser utomtiquement gnr prtir du nom de l lsseF our l9enregistrement dns des (hiersD regrdez du t de l lsse QFileF fon ourgeF ! g9est un dtil mis les menus ontextuels @qund on fit un liEdroit sur un hmp de texteD pr exempleA sont en nglisF te vous vis prlD dns un des hpitres prdentsD d9une tehnique permettnt de les voir en frnisD un ode pler u dut du main()F te vous lisse le retrouver 3 ! yn vri(e si le nom de l lsse n9est ps vide mis on ne vri(e ps s9il ontient des rtres invlides @omme un espeD des entsD des guillemetsF F FAF sl fudrit 0her une erreur si le nom de l lsse n9est ps vlideF our vlider le texte sisiD vous vez deux tehniques X utiliser un inputMask() ou un validator()F v9inputMask() est peutEtre le plus simple mis el vut le oup d9voir prtiqu les deuxF our svoir fire elD diretion l doumenttion de QLineEdit 3 oil pour un petit dut d9ides d9mliortionsF sl y dj de quoi fire pour que vous ne dormiez ps pendnt quelques nuits F gomme toujours pour les D si vous tes loqusD rendezEvous sur les forums du ite du ro pour demnder de l9ideF fon ourge tous 3
2 3

2. Aussi appel header guard 3. Ne me remerciez pas, c'est tout naturel ! ;-)

RWU

CHAPITRE 29.

TP : ZEROCLASSGENERATOR

Figure PWFQ ! eroglssqenertor et onglets

RWV

Chapitre

30
Dicult :

La fentre principale

ntressons-nous maintenant la fentre principale de nos applications. Pour le moment, nous avons cr des fentres plutt basiques en hritant de QWidget. C'est en eet largement susant pour de petites applications mais, au bout d'un moment, on a besoin de plus d'outils. La classe QMainWindow a t spcialement conue pour grer la fentre principale de votre application quand celle-ci est complexe. Parmi les fonctionnalits qui nous sont oertes par la classe QMainWindow, on trouve notamment les menus, la barre d'outils et la barre d'tat. Voyons voir comment tout cela fonctionne !

RWW

CHAPITRE 30.

LA FENTRE PRINCIPALE

Prsentation de QMainWindow
v lsse QMainWindow hrite diretement de QWidgetF g9est un widget gnrlement utilis une seule fois pr progrmme et qui sert uniquement rer l fentre priniple de l9pplitionF gertines pplitions simples n9ont ps esoin de reourir l QMainWindowF yn v supposer ii que vous vous ttquez un progrmme omplexe et d9envergureF

Structure de la QMainWindow
evnt toute hoseD il me semle indispensle de vous prsenter l9orgnistion d9une QMainWindowF gommenons pr nlyser le shm QHFIF

Figure QHFI ! vyout de l QMainWindow

ne fentre priniple peut tre onstitue de tout es lmentsF it j9i ien dit peutD r rien ne vous olige utiliser hque fois hun de es lmentsF htillonsEles X ! Menu Bar X 9est l rre de menusF g9est l que vous llez pouvoir rer votre menu pihierD ditionD e0hgeD eideD etF ! Toolbars X les rres d9outilsF hns un diteur de texteD on pr exemple des ines pour rer un nouveu (hierD pour enregistrerD etF ! Dock Widgets X plus omplexes et plus rrement utilissD es doks sont des onteE neurs que l9on ple utour de l fentre prinipleF sls peuvent ontenir des outilsD pr exemple les di'rents types de pineux que l9on peut utiliser qund on fit un logiiel de dessinF ! Central Widget X 9est le ur de l fentreD l o il y ur le ontenu proprement ditF ! Status Bar X 9est l rre d9ttF ille 0he en gnrl l9tt du progrmme @ rtGinregistrement en ours D etFAF SHH

PRSENTATION DE

QMAINWINDOW

Exemple de QMainWindow
our imginer es lments en prtiqueD je vous propose de prendre pour exemple le progrmme t hesigner @(gure QHFPAF

Figure QHFP ! t hesigner et s QMainWindow

ous reprez en hut l barre de menus X pileD iditD pormF F F in dessousD on l barre d'outilsD ve les ines pour rer un nouveu projetD ouvrir un projetD enregistrerD nnulerF F F eutour @sur l guhe et l droiteAD on les fmeux docksF sls servent ii sletionner le widget que l9on veut utiliser ou diter les proprits du widget pr exempleF eu entre (gure une prtie grise o il n9y rienD 9est l zone centraleF vorsqu9un doument est ouvertD ette zone l90heF v zone entrle peut 0her un ou plusieurs douments l foisD omme on le verr plus loinF in(nD en sD il y normlement l barre de statut mis t hesigner n9en utilise ps vrimentD visilement @en tout s rien n9est 0h en sAF hns e hpitreD nous tudierons les lments les plus utiliss et les plus importnts X les menusD l rre d9outils et l zone entrleF ves doks sont vriment plus rres et l SHI

CHAPITRE 30.

LA FENTRE PRINCIPALE

rre de sttutD qunt elleD est su0smment simple utiliser pour que vous n9yez ps de prolmeD votre niveuD l leture de s doumenttionF YEA

Le code de base
our suivre e hpitreD il v flloir rer un projet en mme temps que moiF xous llons rer notre propre lsse de fentre priniple qui hriter de QMainWindowD r 9est omme el qu9on fit dns WWDWW 7 des sF xotre projet ontiendr trois (hiers X ! main.cpp X l fontion main() Y ! FenPrincipale.h X d(nition de notre lsse FenPrincipaleD qui hriter de QMai nWindow Y ! FenPrincipale.cpp X implmenttion des mthodes de l fentre prinipleF
main.cpp
5inlude `epplitionb 5inlude `tquib 5inlude 4penrinipleFh4 int min@int rgD hr BrgvA { epplition pp@rgD rgvAY penriniple fenetreY fenetreFshow@AY } return ppFexe@AY

FenPrincipale.h
5ifndef riehipixsxgsevi 5define riehipixsxgsevi 5inlude `tquib lss penriniple X puli winindow { puliX penriniple@AY privteX }Y

SHP

LA ZONE CENTRALE (SDI ET MDI)

5endif

FenPrincipale.cpp
5inlude 4penrinipleFh4 penrinipleXXpenriniple@A { }

Rsultat

i tout v ienD e ode devrit voir pour e'et d90her une fentre videD toute te @(gure QHFQAF

Figure QHFQ ! ne QMainWindow vide

i 9est e qui s90he hez vousD 9est onD nous pouvons ommenerF

La zone centrale (SDI et MDI)


v zone entrle de l fentre priniple est prvue pour ontenir un et un seul widgetF g9est le mme prinipe que les ongletsF yn y insre un QWidget @ou une de ses lsses (llesA et on s9en sert omme onteneur pour mettre d9utres widgets l9intrieurD si esoin estF xous llons refire l mnipultion ii pour nous ssurer que tout le monde omprend omment el fontionneF hez tout d9ord qu9on distingue deux types de QMainWindow X SHQ

CHAPITRE 30.

LA FENTRE PRINCIPALE

! Les SDI X elles ne peuvent 0her qu9un doument l foisF g9est le s du floE xotes pr exempleF ! Les MDI X elles peuvent 0her plusieurs douments l foisF illes 0hent des sousEfentres dns l zone entrleF g9est le s pr exemple de t hesigner @(gure QHFRAF
1 2

Figure QHFR ! rogrmme whs X t hesigner

Dnition de la zone centrale (type SDI)


yn utilise l mthode setCentralWidget() de l QMainWindow pour indiquer quel widE get ontiendr l zone entrleF pisons el dns le onstruteur de FenPrincipale X
5inlude 4penrinipleFh4 penrinipleXXpenriniple@A { idget Bzonegentrle a new idgetY setgentrlidget@zonegentrleAY }

isuellementD el ne hnge rien pour le momentF r ontreD e qui est intressntD 9est qu9on mintennt un QWidget qui sert de onteneur pour les utres widgets de
1. 2.

Single Document Interface Multiple Document Interface

SHR

LA ZONE CENTRALE (SDI ET MDI)

l zone entrle de l fentreF yn peut don y insrer des widgets u milieu X


5inlude 4penrinipleFh4 penrinipleXXpenriniple@A { idget Bzonegentrle a new idgetY vineidit Bnom a new vineiditY vineidit Bprenom a new vineiditY vineidit Bge a new vineiditY pormvyout Blyout a lyoutEbddow@4otre lyoutEbddow@4otre lyoutEbddow@4otre new pormvyoutY nom4D nomAY prnom4D prenomAY ge4D geAY

zonegentrleEbsetvyout@lyoutAY } setgentrlidget@zonegentrleAY

ous noterez que j9i repris le ode du hpitre sur les lyoutsF fonD je reonnis qu9on ne fit rien de ien exitnt pour le momentF wis mintenntD vous svez u moins omment d(nir un widget entrl pour une QMainWindow et elD mine de rienD 9est importntF

Dnition de la zone centrale (type MDI)


ves hoses se ompliquent un peu si vous voulez rer un progrmme whsF F F pr exemple un diteur de texte qui peut grer plusieurs douments l foisF xous llons utiliser pour el une QMdiAreaD qui est une sorte de gros widget onteneur ple d90her plusieurs sousEfentresF yn peut se servir du QMdiArea omme de widget onteneur pour l zone entrle X
5inlude 4penrinipleFh4 penrinipleXXpenriniple@A { wdiere Bzonegentrle a new wdiereY setgentrlidget@zonegentrleAY }

v fentre est mintennt prte epter des sousEfentresF yn re ellesEi en pE pelnt l mthode addSubWindow() du QMdiAreaF gette mthode ttend en prmtre SHS

CHAPITRE 30.

LA FENTRE PRINCIPALE

le widget que l sousEfentre doit 0her l9intrieurF v enoreD vous pouvez rer un QWidget gnrique qui ontiendr d9utres widgetsD euxEmmes orgniss selon un lyoutF yn vise plus simple dns notre exemple X on v fire en sorte que les sousEfentres ontiennent juste un QTextEdit @pour notre diteur de texteA X
5inlude 4penrinipleFh4 penrinipleXXpenriniple@A { wdiere Bzonegentrle a new wdiereY extidit BzoneexteI a new extiditY extidit BzoneexteP a new extiditY wdiuindow BsouspenetreI a zonegentrleEbdduindow@zoneexteIAY wdiuindow BsouspenetreP a zonegentrleEbdduindow@zoneextePAY } setgentrlidget@zonegentrleAY

sulttD on une fentre priniple qui ontient plusieurs sousEfentres l9intrieur @(gure QHFSAF

Figure QHFS ! hes sousEfentres

ges fentres peuvent tres rduites ou grndies l9intrieur mme de l fentre prinE ipleF yn peut leur ttriuer un titre et une ine ve les onnes vieilles mthodes setWindowTitleD setWindowIconD etF g9est qund mme dingue tout e qu9on peut fire en quelques lignes de ode ve t 3 ous remrquerez que addSubWindow() renvoie un pointeur sur une QMdiSubWindow X e pointeur reprsente l sousEfentre qui t reF gel peut tre une onne ide de grder e pointeur pour l suiteF ous pourrez insi supprimer l fentre en ppelnt removeSubWindow()F inonD shez que vous pouvez retrouver tout moment l liste SHT

LES MENUS

des sousEfentres res en ppelnt subWindowList()F gette mthode renvoie l liste des QMdiSubWindow ontenues dns l QMdiAreaF

Les menus
v QMainWindow peut 0her une rre de menusD omme pr exemple X pihierD iditionD e0hgeD eideF F F gomment fitEon pour les rer c

Crer un menu pour la fentre principale


v rre de menus est essile depuis l mthode menuBar()F gette mthode renvoie un pointeur sur un QMenuBarD qui vous propose une mthode addMenu()F gette mthode renvoie un pointeur sur le QMenu rF uisqu9un petit ode vut tous les disours du mondeD voii omment fire X
5inlude 4penrinipleFh4 penrinipleXXpenriniple@A { wenu Bmenupihier a menufr@AEbddwenu@48pihier4AY wenu Bmenuidition a menufr@AEbddwenu@48idition4AY wenu Bmenueffihge a menufr@AEbddwenu@48effihge4AY }

eve elD nous vons r trois menus dont nous grdons les pointeurs @menuFichierD menuEditionD menuAffichageAF ous noterez qu9on utilise ii ussi le symole & pour d(nir des rouris lvier F xous vons mintennt trois menus dns notre fentre @(gure QHFTAF
3

Figure QHFT ! ves menus

wisF F F es menus n90hent rien 3 in e'etD ils ne ontiennent pour le moment uun lmentF
3. Les lettres F, E et A seront donc des raccourcis vers leurs menus respectifs).

SHU

CHAPITRE 30.

LA FENTRE PRINCIPALE

Cration d'actions pour les menus


n lment de menu est reprsent pr une actionF g9est l lsse QAction qui gre elF
bMenu

Pourquoi avoir cr une classe QAction au lieu de. . . je sais pas moi. . . QSu pour dire  sous-menu  ?

in fitD les QAction sont des lments de menus gnriquesF sls peuvent tre utiliss l fois pour les menus et pour l rre d9outilsF r exempleD imginons l9lment  xouveu qui permet de rer un nouveu doumentF yn peut en gnrl y der depuis fru endroits di'rents X ! le menu pihier b xouveu Y ! le outon de l rre d9outils  xouveu D gnrlement reprsent pr une ine de doument videF ne seule QAction peut servir d(nir es P lments l foisF ves dveloppeurs de t se sont en e'et rendu ompte que les tions des menus tient souvent dupliques dns l rre d9outilsD d9o l rtion de l lsse QAction que nous rutiliserons lorsque nous rerons l rre d9outilsF our rer une tion vous vez deux possiilits X ! soit vous l rez d9ordD puis vous rez l9lment de menu qui orrespond Y ! soit vous rez l9lment de menu diretement et eluiEi vous renvoie un pointeur vers l QAction re utomtiquementF te vous propose d9essyer ii l premire tehnique X
5inlude 4penrinipleFh4 penrinipleXXpenriniple@A { wenu Bmenupihier a menufr@AEbddwenu@48pihier4AY etion Btionuitter a new etion@48uitter4D thisAY menupihierEbddetion@tionuitterAY wenu Bmenuidition a menufr@AEbddwenu@48idition4AY wenu Bmenueffihge a menufr@AEbddwenu@48effihge4AY }

hns l9exemple de ode iEdessusD nous rons d9ord une QAction orrespondnt l9tion  uitter F xous d(nissons en seond prmtre de son onstruteur un pointeur sur l fentre priniple @thisAD qui servir de prent l9tionF uisD nous joutons l9tion u menu  pihier F sulttD l9lment de menu est r @(gure QHFUAF SHV

LES MENUS

Figure QHFU ! n lment de menu

Les sous-menus
ves sousEmenus sont grs pr l lsse QMenuF smginons que nous voulions rer un sousEmenu  pihiers rents dns le menu  pihier F ge sousEmenu 0her une liste de (hiers remment ouverts pr le proE grmmeF eu lieu d9ppeler addAction() de l QMenuBarD ppelez ette fois addMenu() qui renvoie un pointeur vers un QMenu X
wenu Bfihierseents a menupihierEbddwenu@4pihiers 8rents4AY fihierseentsEbddetion@4pihier idon IFtxt4AY fihierseentsEbddetion@4pihier idon PFtxt4AY fihierseentsEbddetion@4pihier idon QFtxt4AY

ous voyez que j9joute ensuite de nouvelles tions pour peupler le sousEmenu  piE hiers rents @(gure QHFVAF

Figure QHFV ! ves sousEmenus

te n9i ps rupr de pointeur vers les QAction res hque foisF t9uris d le fire si je voulis ensuite onneter les signux des tions des slotsD mis je ne l9i ps fit ii pour simpli(er le odeF SHW

CHAPITRE 30.

LA FENTRE PRINCIPALE

Vous pouvez crer des menus contextuels personnaliss de la mme faon, avec des QMenu. Un menu contextuel est un menu qui s'ache lorsqu'on fait un clic droit sur un widget. C'est un petit peu plus complexe. Je vous laisse lire la doc de QWidget propos des menus contextuels pour savoir comment faire cela si vous en avez besoin.

Manipulations plus avances des QAction


ne QAction est u minimum onstitue d9un texte desriptifF wis e serit dommge de l limiter elF oyons un peu e qu9on peut fire ve les etionF F F
Connecter les signaux et les slots

ve premier rle d9une QAction est de gnrer des signuxD que l9on ur onnets des slotsF v QAction propose plusieurs signux intressntsF ve plus utilis d9entre eux est triggered() qui indique que l9tion t hoisie pr l9utilisteurF yn peut onneter notre tion  uitter u slot quit() de l9pplition X
onnet@tionuitterD sqxev@triggered@AAD qeppD vy@quit@AAAY

hsormisD un li sur  pihier b uitter fermer l9pplitionF ous vez ussi un vnement hovered() qui s9tive lorsqu9on psse l souris sur l9tionF e tester 3
Ajouter un raccourci

yn peut d(nir un rouri lvier pour l9tionF yn psse pour el pr l mthode addShortcut()F gette mthode peut tre utilise de plusieurs mnires di'rentesF v tehnique l plus simple est de lui envoyer une QKeySequence reprsentnt le rouri lvier X
tionuitterEbsethortut@ueyequene@4gtrlC4AAY

oilD il su0t d9rire dns le onstruteur de l QKeySequence le rouri ppropriD t se hrger le rouri tout seulF ous pouvez fire le rouri de omprendre lvier Ctrl C Q n9importe o dns l fentreD prtir de mintenntD el tiver l9tion  uitter 3
Ajouter une icne

ghque tion peut voir une ineF vorsque l9tion est ssoie un menuD l9ine est 0he guhe de l9lment de menuF wisD souvenezEvousD une tion peut ussi SIH

LES MENUS

tre ssoie une rre d9outils omme on le verr plus trdF v9ine peut don tre rutilise dns l rre d9outilsF our jouter une ineD ppelez setIcon() et envoyezElui un QIcon @(gure QHFWA X
tionuitterEbsetson@son@4quitterFpng4AAY

Figure QHFW ! ne ine dns un menu


Pouvoir cocher une action

vorsqu9une tion peut voir deux tts @tiveD dstiveAD vous pouvez l rendre  ohle gre setCheckable()F smginons pr exemple le menu idition b qrs X
tionqrsEbsetghekle@trueAY

ve menu mintennt deux tts et peut tre prd d9une se oher @(gure QHFIHAF

Figure QHFIH ! n menu ohle

yn vri(er dns le ode si l9tion est ohe ve isChecked()F vorsque l9tion est utilise sur une rre d9outilsD le outon reste enfon lorsque l9tion est  ohe F g9est e que vous vez l9hitude de voir dns un tritement de texte pr exempleF ehD puisqu9on prle de rre d9outilsD il serit temps d9pprendre en rer une 3 SII

CHAPITRE 30.

LA FENTRE PRINCIPALE

La barre d'outils
v rre d9outils est gnrlement onstitue d9ines et situe sous les menusF eve tD l rre d9outils utilise des tions pour onstruire hun des lments de l rreF tnt donn que vous vez ppris mnipuler des tions juste vntD vous devriez don tre ples de rer une rre d9outils trs rpidementF our jouter une rre d9outilsD vous devez tout d9ord ppeler l mthode addTool Bar() de l QMainWindowF sl fudr donner un nom l rre d9outilsD mme s9il ne s90he psF ous ruprez un pointeur vers l QToolBar X
oolfr Btoolfrpihier a ddoolfr@4pihier4AY

wintennt que nous vons notre QToolBarD nous pouvons ommener 3

Ajouter une action


ve plus simple est d9jouter une tion l QToolBarF yn utilise omme pour les menus une mthode ppele addAction() qui prend omme prmtre une QActionF ve gros intrt que vous devriez sisir mintenntD 9est que vous pouvez rutiliser ii vos QAc tion res pour les menus 3
5inlude 4penrinipleFh4 penrinipleXXpenriniple@A { GG grtion des menus wenu Bmenupihier a menufr@AEbddwenu@48pihier4AY etion Btionuitter a menupihierEbddetion@48uitter4AY tionuitterEbsethortut@ueyequene@4gtrlC4AAY tionuitterEbsetson@son@4quitterFpng4AAY wenu Bmenuidition a menufr@AEbddwenu@48idition4AY wenu Bmenueffihge a menufr@AEbddwenu@48effihge4AY GG grtion de l rre d9outils oolfr Btoolfrpihier a ddoolfr@4pihier4AY toolfrpihierEbddetion@tionuitterAY } onnet@tionuitterD sqxev@triggered@AAD qeppD vy@quit@AAAY

hns e odeD on voit qu9on re d9ord une QAction pour un menuD puis plus loin on rutilise ette tion pour l9jouter l rre d9outils @(gure QHFIIAF it voil omment t fit d9une pierre deux oups gre ux QAction 3 SIP

LA BARRE D'OUTILS

Figure QHFII ! ne rre d9outils

Ajouter un widget
ves rres d9outils ontiennent le plus souvent des QAction mis il rriver que vous yez esoin d9insrer des lments plus omplexesF v QToolBar gre justement tous types de widgetsF ous pouvez jouter des widgets ve l mthode addWidget()D omme vous le fisiez ve les lyouts X
pontgomofox Bhoixolie a new pontgomofoxY toolfrpihierEbddidget@hoixolieAY

siD on insre une liste droulnteF ve widget s9insre lors dns l rre d9outils @(gure QHFIPAF

Figure QHFIP ! n widget dns une rre d9outils


La mthode addWidget() cre une QAction automatiquement. Elle renvoie un pointeur vers cette QAction cre. Ici, on n'a pas rcupr le pointeur mais vous pouvez le faire si vous avez besoin d'eectuer des oprations ensuite sur la QAction.

SIQ

CHAPITRE 30.

LA FENTRE PRINCIPALE

Ajouter un sparateur
i votre rre d9outils ommene omporter trop d9lmentsD el peut tre une onne ide de les sprerF g9est pour el que t propose des separators @sprteursAF sl su0t d9ppeler l mthode ddeprtor@A l9endroit o vous voulez insrer un sprteur X
toolfrpihierEbddeprtor@AY

En rsum
! ne QMainWindow est une fentre prinipleF ille peut ontenir des sousEfentresD des menusD une rre d9outilsD une rre d9ttD etF ! ne fentre hs ne peut 0her qu9un seul doument l foisF ne fentre whs peut en 0her plusieurs sous l forme de sousEfentresF ! v rre d9outils peut ontenir tous types de widgetsF ! wenus et rres d9outils prtgent le mme lment gnrique X l QActionF ne mme QAction peut tre utilise l fois dns le menu et dns l rre d9outilsF

SIR

Chapitre

31
Dicult :

Modliser ses fentres avec Qt Designer

force d'crire le code de vos fentres, vous devez peut-tre commencer trouver cela long et rptitif. C'est amusant au dbut mais, au bout d'un moment on en a un peu marre d'crire des constructeurs de 3 kilomtres de long juste pour placer les widgets sur la fentre. C'est l que Qt Designer vient vous sauver la vie. Il s'agit d'un programme livr avec Qt (vous l'avez donc dj install) qui permet de concevoir vos fentres visuellement. Mais plus encore, Qt Designer vous permet aussi de modier les proprits des widgets, d'utiliser des layouts et d'eectuer la connexion entre signaux et slots.

SIS

CHAPITRE 31.

MODLISER SES FENTRES A VEC QT DESIGNER

xous ommenerons pr pprendre mnipuler t hesigner luiEmmeF ous verrez que 9est un outil omplexe mis qu9on s9y fit vite r il est ssez intuitifF insuiteD nous pprendrons utiliser les fentres gnres ve t hesigner dns notre ode soureF g9est prti 3
Qt Designer n'est pas un programme magique qui rchit votre place. Il vous permet simplement de gagner du temps et d'viter les tches rptitives d'criture du code de gnration de la fentre. N'utilisez PAS Qt Designer et ne lisez PAS ce chapitre si vous ne savez pas coder vos fentres la main.

Prsentation de Qt Designer
t hesigner existe sous forme de progrmme indpendnt mis il est ussi intgr u sein de t gretorD dns l setion DesignF sl est plus simple de trviller diretement l9intrieur de t gretor et el ne hnge stritement rien ux possiilits qui vous sont o'ertesF in e'etD t hesigner est ompltement intgr dans t gretor 3 gomme 9est le plus simple et que ette solution n9 que des vntgesD nous llons don trviller diretement dns t gretorF te vis supposer que vous vez dj r un projet dns t gretorF our jouter une fentre de t hesignerD llez dns le menu Fichier > Nouveau fichier ou projet puis sletionnez Qt > Classe d'interface graphique Qt Designer @(gure QIFIAF

Choix du type de fentre crer


vorsque vous demndez rer une fentreD on vous propose de hoisir le type de fentre @(gure QIFPAF ves Q premiers hoix orrespondent des QDialogF ous pouvez ussi rer une QMain Window si vous vez esoin de grer des menus et des rres d9outilsF in(nD le dernier hoix orrespond une simple fentre de type QWidgetF our tester t hesignerD peu importe le hoix que vous ferez iiF yn peut prtir sur une QDialog si vous voulez @premier hoix pr exempleAF hns l fentre suivnteD on vous demnde le nom des (hiers rer @(gure QIFQAF our le moment vous pouvez lisser les vleurs pr dfutF rois (hiers seront rs X ! dialog.ui X 9est le (hier qui ontiendr l9interfe grphique @de type wvAF g9est e (hier que nous modi(erons ve l9diteur t hesigner Y ! dialog.h X permet de hrger le (hier .ui dns votre projet gCC @enEtte de lsseA Y ! dialog.cpp X permet de hrger le (hier .ui dns votre projet gCC @ode soure de lsseAF SIT

PRSENTATION DE QT DESIGNER

Figure QIFI ! ejout d9une fentre

Figure QIFP ! ghoix du type de fentre

SIU

CHAPITRE 31.

MODLISER SES FENTRES A VEC QT DESIGNER

Figure QIFQ ! xoms des (hiers

Analyse de la fentre de Qt Designer


vorsque vous vez r votre fentreD t hesigner s9ouvre u sein de t gretor @voir (gure QIFRAF

Figure QIFR ! t hesigner dns t gretor

SIV

PRSENTATION DE QT DESIGNER

xotez queD d9prs le run de guheD nous sommes dns l setion hesign de t gretorF ous pouvez retrouver les (hiers de votre projet en liqunt sur diterF
Wow ! Mais comment je vais faire pour m'y retrouver avec tous ces boutons ?

in y llnt mthodiquementF xotez que l position des fentres peut tre un peu di'rente hez vousD ne soyez ps surprisF htillons hune des zones importntes dns l9ordre X IF ur l barre d'outils de t hesignerD u moins qutre outons mritent votre ttentionF ge sont les qutre outons situs sous l mrque  (1) rouge que j9i ple sur l pture d9rnF sls permettent de psser d9un mode d9dition un utreF t hesigner propose qutre modes d9dition X ! diter les widgets X le mode pr dfutD que vous utiliserez le plus souventF sl permet d9insrer des widgets sur l fentre et de modi(er leurs propritsF ! diter signaux/slots X permet de rer des onnexions entre les signux et les slots de vos widgetsF ! diter les copains X permet d9ssoier des QLabel ve leurs hmps respeE tifsF vorsque vous fites un lyout de type QFormLayoutD es ssoitions sont utomtiquement resF ! diter l'ordre des onglets X permet de modi(er l9ordre de tultion entre les hmps de l fentreD pour eux qui nviguent u lvier et pssent d9un hmp l9utre en ppuynt sur l touhe Tab F xous ne verrons dns e hpitre que les deux premiers modes @diter les widgets et diter signuxGslotsAF ves utres modes sont peu importnts et je vous lisse les douvrir pr vousEmmesF PF eu centre de t hesignerD vous vez l fentre que vous tes en trin de dessinerF our le momentD elleEi est videF i vous rez une QMainWindowD vous urez en plus une rre de menus et une rre d9outilsF veur dition se fit l sourisD 9est trs intuitifF i vous rez une QDialogD vous urez prolement des outons  yu et  ennuler dj dispossF QF Widget Box X e dok vous donne l possiilit de sletionner un widget pler sur l fentreF ous pouvez onstter qu9il y un ssez lrge hoix 3 reureusementD euxEi sont orgniss pr groupes pour y voir plus lirF our pler un de es widgets sur l fentreD il su0t de fire un glisserEdplerF imple et intuitifF RF Property Editor X lorsqu9un widget est sletionn sur l fentre prinipleD vous pouvez diter ses propritsF ous noterez que les widgets possdent en gnrl euoup de propritsD et que ellesEi sont orgnises en fontion de l lsse dns lquelle elles ont t d(niesF yn peut insi modi(er toutes les proprits dont un widget hriteD en plus des proprits qui lui sont propresF i uun widget n9est sletionnD e sont les proprits de l fentre que vous diterezF ous pourrez don pr exemple modi(er son titre ve l proprit windowTitleD son ine ve windowIconD etF SIW

CHAPITRE 31.

MODLISER SES FENTRES A VEC QT DESIGNER

SF Object Inspector X 0he l liste des widgets pls sur l fentreD en fontion de leur reltion de prentD sous forme d9rreF gel peut tre prtique si vous vez une fentre omplexe et que vous ommenez vous perdre dednsF TF diteur de signaux/slots et diteur d'action X ils sont sprs pr des onE gletsF v9diteur de signuxGslots est utile si vous vez ssoi des signux et des slotsD les onnexions du widget sletionn pprissnt iiF xous verrons tout l9heure omment rliser des onnexions dns t hesignerF v9diteur d9tions permet de rer des QActionF g9est don utile lorsque vous rez une QMainWind ow ve des menus et une rre d9outilsF
Comme toutes les classes hritent de QObject, vous aurez toujours la proprit objectName. C'est le nom de l'objet qui sera cr. N'hsitez pas le personnaliser, an d'y voir plus clair tout l'heure dans votre code source .
1

oil qui devrit su0re pour une prsenttion gnrle de t hesignerF wintenntD prtiquons un peuF

Placer des widgets sur la fentre


ler des widgets sur l fentre est en fit trs simple X vous prenez le widget que vous voulez dns l liste guhe et vous le fites glisser o vous voulez sur l fentreF ge qui est trs importnt svoirD 9est qu9on peut pler ses widgets de deux mnires di'rentes X ! De manire absolue X vos widgets seront disposs u pixel prs sur l fentreF g9est l mthode pr dfutD l plus priseD mis l moins )exile ussiF te vous vis prl de ses dfuts dns le hpitre sur les lyoutsF ! Avec des layouts @reommnd pour les fentres omplexesA X vous pouvez utiliser tous les lyouts que vous onnissezF ertiuxD horizontuxD en grilleD en formuE lireF F F qre ette tehniqueD les widgets s9dpteront utomtiquement l tille de votre fentreF gommenons pr les pler de mnire solueD puis nous verrons omment utiliser les lyouts dns t hesignerF

Placer les widgets de manire absolue


te vous proposeD pour vous entrnerD de fire une petite fentre simple ompose de Q widgets X ! QSlider Y ! QLabel Y ! QProgressBarF
1. Sinon vous aurez par exemple des boutons appels pushButton, pushButton_2, pushButton_3, ce qui n'est pas trs clair.

SPH

PLACER DES WIDGETS SUR LA FENTRE

otre fentre devrit mintennt ressemler peu prs l (gure QIFSF

Figure QIFS ! lement de widgets sur l fentre

ous pouvez dpler es widgets omme on vous semle sur l fentreF ous pouvez les grndir ou les rtrirF uelques rouris onntre X ! in mintennt l touhe Ctrl ppuyeD vous pouvez sletionner plusieurs widgets en mme tempsF ! pites Suppr pour supprimer les widgets sletionnsF ! i vous mintenez l touhe Ctrl enfone lorsque vous dplez un widgetD eluiEi ser opiF ! ous pouvez fire un douleEli sur un widget pour modi(er son nom @il vut mieux donner un nom personnlis plutt que lisser le nom pr dfutAF ur ertins widE gets omplexesD omme l QComboBox @liste droulnteAD le douleEli vous permet d9diter l liste des lments ontenus dns l liste droulnteF ! ensez ussi fire un li droit sur les widgets pour modi(er ertines propritsD omme l ulle d9ide @toolTipAF

Utiliser les layouts


our le momentD nous n9utilisons uun lyoutF i vous essyez de redimensionner l fentreD vous verrez que les widgets ne s9dptent ps l nouvelle tille et qu9ils peuvent mme disprtre si on rduit trop l tille de l fentre 3 sl y deux fons d9utiliser des lyouts X ! utiliser l rre d9outils en hut Y ! glisserEdpler des lyouts depuis le dok de sletion de widgets @ idget fox AF our une fentre simple omme elleElD nous n9urons esoin que d9un lyout priniplF our d(nir e lyout priniplD le mieux est de psser pr l rre d9outils @(gure QIFTAF gliquez sur une zone vide de l fentre @en lirD 9est l fentre qui doit tre sletionE SPI

CHAPITRE 31.

MODLISER SES FENTRES A VEC QT DESIGNER

Figure QIFT ! frre d9outils des lyouts

ne et non un de ses widgetsAF ous devriez lors voir les outons de l rre d9outils des lyouts s9tiverF gliquez sur le outon orrespondnt u lyout vertil @le seondA pour orgniser uE tomtiquement l fentre selon un lyout vertilF ous devriez lors voir vos widgets s9orgniser omme sur l (gure QIFUF

Figure QIFU ! vyout vertil

g9est le lyout vertil qui les ple insi (n qu9ils oupent toute l tille de l fentreF fien srD vous pouvez rduire l tille de l fentre si vous le dsirezF ous pouvez ussi demnder e que l fentre soit rduite l tille minimle eptleD en liqunt sur le outon tout droite de l rre d9outilsD intitul  edjust ize F
Maintenant que vous avez dni le layout principal de la fentre, sachez que vous pouvez insrer un sous-layout en plaant par exemple un des layouts proposs dans la Widget Box.

Insrer des spacers


ous trouvez que l fentre est un peu mohe si on l9grndit trop c woi ussiF ves widgets sont trop espsD el ne me onvient psF our hnger l position des widgets tout en onservnt le lyoutD on peut insrer un sperF sl s9git d9un widget invisile qui sert rer de l9espe sur l fentreF ve mieux est enore d9essyer pour omprendre e que el fitF hns l idget foxD vous devriez voir une setion  pers @(gure QIFVAF renez un  ertil per D et insrezEle tout en s de l fentre @(gure QIFWAF SPP

PLACER DES WIDGETS SUR LA FENTRE

Figure QIFV ! pers

Figure QIFW ! pentre ve sper

ve sper fore les utres widgets se oller tout en hutF sls sont toujours orgniss selon un lyoutD mis u moinsD mintenntD nos widgets sont plus rpprohs les uns des utresF issyez de dpler le sper sur l fentre pour voirF lezEle entre le liell et l rre de progressionF ous devriez voir que l rre de progression se olle mintennt tout en sF ve omportement du sper est ssez logique mis il fut l9essyer pour ien le omE prendreF

diter les proprits des widgets


sl nous reste une hose trs importnte voir X l9dition des proprits des widgetsF letionnez pr exemple le liell @QLabelAF egrdez le dok intitul  roperty iditor F sl 0he mintennt les proprits du QLabel @(gure QIFIHAF ges proprits sont orgnises en fontion de l lsse dns lquelle elles ont t d(nies et 9est une onne hoseF te m9expliqueF ous svez peutEtre qu9un QLabel hrite de QFrameD qui hrite de QWidgetD qui hrite luiEmme de QObject c ghune de es lsses d(nit des propritsF QLabel hrite don des proprits de QFrameD QWidget et QObjectD mis ussi des proprits qui lui sont propresF ur m pture d9rnD on peut voir une proprit de QObject X objectNameF g9est le nom de l9ojet qui ser r dns le odeF te vous onseille de le personnliser pour vous y retrouver dns le ode soure pr l suiteF SPQ

CHAPITRE 31.

MODLISER SES FENTRES A VEC QT DESIGNER

Figure QIFIH ! diteur de proprits


La plupart du temps, on peut diter le nom d'un widget en faisant un doubleclic dessus, sur la fentre.

i vous desendez un peu plus s dns l listeD vous devriez vous rendre ompte qu9un grnd nomre de proprits sont proposes pr QWidget @notmment l polieD le style de urseur de l sourisD etFAF hesendez enore plus sF ous devriez rriver sur les proprits hrites de QFrameD puis elles propres QLabelF ous devriez modi(er l proprit textD pour hnger le texte 0h dns le QLabelF wettez pr exemple  H F emusezEvous hnger l polie @proprit font issue de QWidgetA ou enore mettre une ordure @proprit frameShape issue de QFrameAF ous remrquerez queD lorsque vous ditez une propritD son nom s90he en grs pour tre mis en vleurF gel vous permet pr l suite de reprer du premier oup d9il les proprits que vous vez modi(esF wodi(ez ussi les proprits de l QProgressBar pour qu9elle 0he H7 pr dfut @proprit valueAF ous pouvez ussi modi(er les proprits de l fentreF gliquez sur une zone vide de l fentre (n qu9uun widget ne soit sletionnF ve dok  roperty iditor vous 0her lors les proprits de l fentre F
2

Astuce : si vous ne comprenez pas quoi sert une proprit, cliquez dessus puis appuyez sur la touche F1 . Qt Designer lancera automatiquement Qt Assistant pour acher l'aide sur la proprit slectionne.

issyez d9voir une fentre quiD u (nlD ressemle grosso modo l mienne @(gure QIFIIAF
2. Ici, notre fentre est un QWidget, donc vous aurez juste les proprits de QWidget.

SPR

CONFIGURER LES SIGNAUX ET LES SLOTS

Figure QIFII ! issyez de onstruire une fentre omme elleEi 3

ve liell et l rre de progression doivent 0her H pr dfutF frvoD vous svez mintennt insrer des widgetsD les orgniser selon un lyout et personnliser leurs proprits dns t hesigner 3 xous n9vons utilis pour le moment que le mode  idit idgets F sl nous reste tudier le mode  idit ignlsGlots F F F

Congurer les signaux et les slots


ssez en mode  idit ignlsGlots en liqunt sur le seond outon de l rre d9outils @(gure QIFIPAF
Figure QIFIP ! ghngement de mode

hns e modeD on ne peut ps jouterD modi(erD supprimerD ni dpler de widgetsF r ontreD si vous pointez sur les widgets de votre fentreD vous devriez les voir s9endrer de rougeF ous pouvezD de mnire trs intuitiveD ssoier les widgets entre eux pour rer des onnexions simples entre leurs signux et slotsF te vous propose pr exemple d9ssoier le QSlider ve notre QProgressBarF our elD liquez sur le QSlider et mintenez enfon le outon guhe de l sourisF ointez sur l QProgressBar et relhez le outonF ne fentre pprt lors pour que vous puissiez hoisir le signl et le slot onneter @(gure QIFIQAF ! guhe X les signux disponiles dns le QSliderF ! droite X les slots compatibles disponiles dns l QProgressBarF letionnez un signl guheD pr exemple sliderMoved(int)F ge signl est envoy ds que l9on dple un peu le sliderF ous verrez que l liste des slots omptiles SPS

CHAPITRE 31.

MODLISER SES FENTRES A VEC QT DESIGNER

Figure QIFIQ ! ghoix des signux et slots

pprt droiteF xous llons onneter sliderMoved(int) du QSlider ve setValue(int) de l QProgressBarF pites yu pour vlider une fois le signl et le slot hoisisF g9est onD l onnexion est re @(gure QIFIRA 3

Figure QIFIR ! gonnexion tlie 3

pites de mme pour ssoier sliderMoved(int) du lider setNum(int) du QLabelF xotez que vous pouvez ussi onneter un widget l fentreF hns e sD visez une zone vide de l fentreF v )he devrit se trnsformer en symole de msse @(gure QIFISAF gel vous permet d9ssoier un signl du widget un slot de l fentreD e qui peut vous tre utile si vous voulez rer un outon  permer l fentre pr exempleF
3

3. Bien connu par ceux qui font de l'lectricit ou de l'lectronique.

SPT

UTILISER LA FENTRE DANS VOTRE APPLICATION

Figure QIFIS ! gonnexion l msse


Attention : si dans la fentre du choix du signal et du slot vous ne voyez aucun slot s'acher pour la fentre, c'est normal. Qt les masque par dfaut car ils sont nombreux. Si on les achait pour chaque connexion entre 2 widgets, on en aurait beaucoup trop (puisque tous les widgets hritent de QWidget). Pour acher quand mme les signaux et slots issus de QWidget, cochez la case  Show signals and slots inherited from QWidget .

our des onnexions simples entre les signux et les slots des widgetsD t hesigner est don trs intuitif et onvient prfitementF
Eh, mais si je veux crer un slot personnalis pour faire des manipulations un peu plus complexes, comment je fais ?

t hesigner ne peut ps vous ider pour elF i vous voulez rer un signl ou un slot personnlisD il fudr le fire tout l9heure dns le ode soure @en modi(nt les (hiers .h et .cpp qui ont t rs en mme temps que le .uiAF gomme vous pourrez le voirD nnmoinsD 9est trs simple fireF in y r)hissnt ienD 9est mme l seule hose que vous urez oder 3 in e'etD tout le reste est utomtiquement gr pr t hesignerF ous n9vez plus qu9 vous onentrer sur l prtie  r)exion de votre ode soureF t hesigner vous permet don de ggner du temps en vous prgnnt les thes rptitives et siques qu9on fit hque fois que l9on re une fentreF

Utiliser la fentre dans votre application


sl reste une dernire tpe et non des moindres X pprendre utiliser l fentre insi re dns votre pplitionF

Notre nouvel exemple


te vous propose de rer une nouvelle fentreF yn v rer une miniElultrie @(gure QIFITAF SPU

CHAPITRE 31.

MODLISER SES FENTRES A VEC QT DESIGNER

Figure QIFIT ! winiElultrie

issyez de reproduire peu prs l mme fentre que moiD de type idgetF n lyout prinipl horizontl su0r orgniser les widgetsF v fentre est onstitue des widgets suivntsD de guhe droite X
Widget
QSpinBox QComboBox QSpinBox QPushButton QLabel

Nom de l'objet
nombre1 operation nombre2 boutonEgal resultat

ensez ien renommer les widgets (n que vous puissiez vous y retrouver dns votre ode soure pr l suiteF our l liste droulnte du hoix de l9oprtionD je l9i dj prEremplie ve qutre vleurs X +D -D * et /F pites un douleEli sur l liste droulnte pour jouter et supprimer des vleursF sl fudr donner un nom l fentre lorsque vous l rerez dns t gretor @(gure QIFIUAF te l9i ppele FenCalculatrice @de mme que les (hiers qui seront rsAF

Figure QIFIU ! ghoix du nom de l lsse

SPV

UTILISER LA FENTRE DANS VOTRE APPLICATION

Utiliser la fentre dans notre application


our utiliser dns notre pplition l fentre re l9ide de t hesignerD plusieurs mthodes s9o'rent nousF ve plus simple est enore de lisser t gretor nous guider 3 ih ouiD souvenezEvous X t gretor r un (hier .ui mis ussi des (hiers .cpp et .h de lsse 3 ge sont es derniers (hiers qui vont ppeler l fentre que nous vons reF in prtiqueD dns l dlrtion de l lsse gnre pr t gretor @(hier FenCalcu latrice.hAD on retrouve le ode suivnt X
5ifndef pixgevgvesgir 5define pixgevgvesgir 5inlude `idgetb nmespe i { lss penglultrieY } lss penglultrie X puli idget { yftig puliX expliit penglultrie@idget Bprent a HAY ~penglultrie@AY privteX iXXpenglultrie BuiY }Y 5endif GG pixgevgvesgir

ve (hier FenCalculatrice.cppD luiD ontient le ode suivnt X


5inlude 4penglultrieFh4 5inlude 4uipenglultrieFh4 penglultrieXXpenglultrie@idget BprentA X idget@prentAD ui@new iXXpenglultrieA { uiEbsetupi@thisAY } penglultrieXX~penglultrie@A { delete uiY }

SPW

CHAPITRE 31.

MODLISER SES FENTRES A VEC QT DESIGNER

Comment marche tout ce bazar ?

ous vez une lsse FenCalculatrice qui t re utomtiquement pr t greE tor @(hiers FenCalculatrice.h et FenCalculatrice.cppAF vorsque vous rez une nouvelle instne de ette lsseD l fentre que vous vez dessine tout l9heure s9fE (he 3
Pourquoi ? Le chier de la classe est tout petit et ne fait pas grand chose pourtant ?

iD regrdez ien X un (hier utomtiquement gnr pr t hesigner t utomE tiquement inlus dns le .cpp X #include"ui_FenCalculatrice.h" r illeurs le onstruteur hrge l9interfe d(nie dns e (hier utoEgnr gre ui->setupUi(this);F g9est ette ligne qui lne l onstrution de l fentreF fien srD l fentre est enore une oquille vide X elle ne fit rienF tilisez l lsse FenCalculatrice pour omplter ses fontionnlits et l rendre intelligenteF r exempleD dns le onstruteurD pour modi(er un lment de l fentreD vous pouvez fire ei X
penglultrieXXpenglultrie@idget BprentA X idget@prentAD ui@new iXXpenglultrieA { uiEbsetupi@thisAY } uiEboutoniglEbsetext@4igl4AY

Le nom du bouton boutonEgal, nous l'avons dni dans Qt Designer tout l'heure (proprit objectName de QObject). Retournez voir le petit tableau un peu plus haut pour vous souvenir de la liste des noms des widgets associs la fentre.

fonD en gnrlD vous n9urez ps esoin de personnliser vos widgets vu que vous vez tout fit sous t hesignerF wis si vous vez esoin d9dpter leur ontenu l9exution @pour 0her le nom de l9utilisteur pr exempleAD il fudr psser pr lF wintennt e qui est intressnt surtoutD 9est d9e'etuer une onnexion X
penglultrieXXpenglultrie@idget BprentA X idget@prentAD ui@new iXXpenglultrieA {

SQH

UTILISER LA FENTRE DANS VOTRE APPLICATION

uiEbsetupi@thisAY } onnet@uiEboutoniglD sqxev@liked@AAD thisD vy@lulerypertion@AAAY

N'oubliez pas chaque fois de prxer chaque nom de widget par ui !

ge ode nous permet de fire en sorte que le slot calculerOperation() de l fentre soit ppel hque fois que l9on lique sur le outonF fien srD 9est vous d9rire le slot calculerOperation()F sl ne vous reste plus qu9 dpter votre main pour ppeler l fentre omme une fentre lssique X
5inlude `epplitionb 5inlude `tquib 5inlude 4penglultrieFh4 int min@int rgD hr BrgvA { epplition pp@rgD rgvAY penglultrie fenetreY fenetreFshow@AY } return ppFexe@AY

Personnaliser le code et utiliser les Auto-Connect


ves fentres res ve t hesigner n(ient du systme  eutoEgonnet de tF g9est un systme qui re les onnexions tout seulF r quelle mgie c sl vous su0t en fit de rer des slots en leur donnnt un nom qui respete une onventionF renons le widget boutonEgal et son signl clicked()F i vous rez un slot ppel on_boutonEgal_clicked() dns votre fentreD e slot ser utomtiquement ppel lors d9un li sur le outonF v onvention respeter est reprsente sur le shm QIFIVF Exercice X ompltez le ode de l lultrie pour e'etuer l9oprtion orresponE dnt l9lment sletionn dns l liste droulnteF
4

4. Ne me dites pas que vous ne l'avez pas vu venir !

SQI

CHAPITRE 31.

MODLISER SES FENTRES A VEC QT DESIGNER

Figure QIFIV ! honnez un nom pris votre slot et l onnexion ser utomtique 3

En rsum
! t hesigner est un progrmme qui permet de onstruire rpidement ses fentres l sourisF sl nous vite l9riture de nomreuses lignes de odeF ! t hesigner est intgr t gretor mis existe ussi sous forme de progrmme externeF sl est onseill de l9utiliser dns t gretor r le fontionnement est plus simpleF ! t hesigner ne nous prgne ps une ertine r)exion X il est toujours nessire de rdiger des lignes de ode pour fire fontionner s fentre prs l9voir dessineF ! t hesigner re utomtiquement un (hier de ode qui ple les widgets sur l fentreF yn trville ensuite sur une lsse qui hrite de e ode pour dpter l fentre nos esoinsF

SQP

Chapitre

32
Dicult :

TP : zNavigo, le navigateur web des Zros !

epuis le temps que vous pratiquez Qt, vous avez acquis sans vraiment le savoir les capacits de base pour raliser des programmes complexes. Le but d'un TP comme celui-ci, c'est de vous montrer justement que vous tes capables de mener bien des projets qui auraient pu vous sembler compltement fous il y a quelque temps. Vous ne rvez pas : le but de ce TP sera de. . . raliser un navigateur web ! Et vous allez y arriver, c'est votre porte ! Nous allons commencer par dcouvrir la notion de moteur web, pour bien comprendre comment fonctionnent les autres navigateurs. Puis, nous mettrons en place le plan du dveloppement de notre programme an de nous assurer que nous partons dans la bonne direction et que nous n'oublions rien.

SQQ

CHAPITRE 32.

TP : ZNAVIGO, LE NAVIGATEUR WEB DES ZROS !

Figure QPFI ! zxvigoD le nvigteur we que nous llons rliser

Les navigateurs et les moteurs web


gomme toujoursD il fut d9ord prendre le temps de r)hir son progrmme vnt de foner le oder tte isseF g9est e qu9on ppelle l phse de conceptionF te sisD je me rpte hque fois mis 9est vriment pre que 9est trs importntF i je vous dis  fitesEmoi un nvigteur we et que vous rez de suite un nouveu projet en vous demndnt e que vous llez ien pouvoir mettre dns le mainF F F 9est l9he ssurF our moiD l oneption est l9tpe l plus di0ile du projetF lus di0ile mme que le odgeF in e'etD si vous onevez ien votre progrmmeD si vous r)hissez ien l fon dont il doit fontionnerD vous urez simpli( l9vne votre projet et vous n9urez ps rire inutilement des lignes de ode di0ilesF hns un premier tempsD je vis vous expliquer omment fontionne un nvigteur weF n peu de ulture gnrle e sujet vous permettr de mieux omprendre e que vous vez fire @et e que vous n9vez ps fireAF te vous donneri ensuite quelques onseils pour orgniser votre ode X quelles lsses rerD pr quoi ommenerD etF SQR

LES NAVIGATEURS ET LES MOTEURS WEB

Les principaux navigateurs


gommenons pr le ommenement X vous svez e qu9est un nvigteur we c fonD je ne me moque ps de vous mis il vut mieux tre sr de ne perdre personneF n nvigteur we est un progrmme qui permet de onsulter des sites weF rmi les plus onnus d9entre euxD itons snternet ixplorerD wozill pirefoxD qoogle ghrome ou enore friF wis il y en ussi euoup d9utresD ertes moins utilissD omme yperD uonquerorD ipiphnyD wxthonD vynxF F F te vous rssureD il n9est ps nessire de tous les onntre pour pouvoir prtendre en rer unF r ontreD e qu9il fut que vous shiezD 9est que hun de es nvigteurs est onstitu de e qu9on ppelle un moteur webF u9estEe que 9est que ette teE l c

Le moteur web
ous les sites we sont rits en lngge rwv @ou rwvAF oii un exemple de ode rwv permettnt de rer une pge trs simple X
`3hygi html fvsg 4EGGQgGGhh rwv IFH tritGGix4 4httpXGGwwwFwQForgGG xhtmlIGhhGxhtmlIEstritFdtd4b `html xmlnsa4httpXGGwwwFwQForgGIWWWGxhtml4 xmlXlnga4fr4 b `hedb `titlebfienvenue sur mon site 3`Gtitleb `met httpEequiva4gontentEype4 ontenta4textGhtmlY hrsetaisoEVVSWEI4 Gb `Ghedb `odyb `Godyb `Ghtmlb

g9est ien joli tout e odeD mis el ne ressemle ps u rsultt visuel qu9on l9hitude de voir lorsqu9on nvigue sur le eF v9ojetif est justement de trnsformer e ode en un rsultt visuel X le site weF g9est le rle du moteur weF v (gure QPFP prsente son fontionnementD rsum dns un shm trs simpleF gel n9 l9ir de rien mis 9est un trvil di0ile X rliser un moteur we est trs dlitF g9est gnrlement le fruit des e'orts de nomreux progrmmeurs experts F gertins moteurs sont meilleurs que d9utres mis uun n9est prfit ni ompletF gomme le e est en perptuelle volutionD il est peu prole qu9un moteur prfit sorte un jourF und on progrmme un nvigteurD on utilise gnrlement le moteur we sous forme de iliothqueF ve moteur we n9est don ps un progrmme mis il est utilis pr des progrmmesF
1

1. Et encore, ils avouent parfois avoir du mal !

SQS

CHAPITRE 32.

TP : ZNAVIGO, LE NAVIGATEUR WEB DES ZROS !

Figure QPFP ! ve rle du moteur we

ge ser peutEtre plus lir ve un shmF egrdons omment est onstitu pirefox pr exemple @(gure QPFQAF

Figure QPFQ ! hm du nvigteur we

SQT

LES NAVIGATEURS ET LES MOTEURS WEB

yn voit que le nvigteur @en vertA  ontient le moteur we @en june u entreAF
La partie en vert est habituellement appele le  chrome , pour dsigner l'interface. Mais c'est nul ! Alors le navigateur web c'est juste les 2-3 boutons en haut et c'est tout ?

yh non 3 voin de lF ve nvigteur ne se ontente ps de grer les outons  ge rdente D  ge uivnte D  etuliser D etF g9est ussi lui qui gre les mrqueE pges @fvorisAD le systme d9ongletsD les options d90hgeD l rre de reherheD etF out el reprsente dj un norme trvil 3 in fitD les dveloppeurs de pirefox ne sont ps les mmes que eux qui dveloppent son moteur weF sl y des quipes spresD tellement hun de es lments reprsente du trvilF n grnd nomre de nvigteurs ne s9oupent d9illeurs ps du moteur weF sls en utilisent un  tout prt F he nomreux nvigteurs sont ss sur le mme moteur weF v9un des plus lres s9ppelle euit X il est utilis pr friD qoogle ghrome et uonquerorD notmmentF grer un moteur we n9est ps de votre niveu F gomme de nomreux nvigteursD nous en utiliserons un prEexistntF vequel c ih ien il se trouve que t vous propose depuis d9utiliser le moteur euit dns vos progrmmesF g9est don e moteurEl que nous llons utiliser pour rer notre nvigteurF
2

Congurer son projet pour utiliser WebKit


euit est un des nomreux modules de tF sl ne fit ps prtie du module  qs D ddi l rtion de fentresD il s9git d9un module prtF our pouvoir l9utiliserD il fudr modi(er le (hier .pro du projet pour que t she qu9il esoin de hrger euitF oii un exemple de (hier .pro qui indique que le projet utilise euit X
5555555555555555555555555555555555555555555555555555555555555555555555 5 eutomtilly generted y qmke @PFHIA merF IVF juin IIXRWXRW 5555555555555555555555555555555555555555555555555555555555555555555555 iwvei a pp Ca wekit eqi a hiixher Ca F
2. Ni du mien !

SQU

CHAPITRE 32.

TP : ZNAVIGO, LE NAVIGATEUR WEB DES ZROS !

sxgvhier Ca F 5 snput riehi Ca penrinipleFh ygi Ca penrinipleFpp minFpp

h9utre prtD vous devrez rjouter l9include suivnt dns les (hiers de votre ode soure fisnt ppel euit X
5inlude `teuitb

in(nD il fudr joindre deux nouveux hvv votre progrmme pour qu9il fontionne X QtWebKit4.dll et QtNetwork4.dllF yufD tout est prtF

Organisation du projet
Objectif
evnt d9ller plus loinD il est onseill d9voir en tte le progrmme que l9on herhe rerF eportezEvous l (gure QPFI pge SQRF rmi les fontionnlits de e super nvigteurD 'etueusement nomm  zxvigo D on ompte X ! der ux pges prdentes et suivntes Y ! rrter le hrgement de l pge Y ! tuliser l pge Y ! revenir l pge d9ueil Y ! sisir une dresse Y ! nviguer pr onglets Y ! 0her le pourentge de hrgement dns l rre d9ttF ve menu Fichier permet d9ouvrir et de fermer un ongletD insi que de quitter le proE grmmeF ve menu Navigation reprend le ontenu de l rre d9outils @e qui est trs file fire gre ux QActionD je vous le rppelleAF ve menu ? @ideA propose d9fE (her les fentres propos... et propos de Qt... qui donnent des informtions respetivement sur notre progrmme et sur tF gel n9 l9ir de rien omme elD mis el reprsente dj un sr oulot 3 i vous vez du ml dns un premier tempsD vous pouvez vous prgner l gestion des ongletsF F F mis moi j9i trouv que 9tit un peu trop simple sns les onglets lors j9i hoisi de vous fire jouer veD histoire de orser le toutF YEA SQV

ORGANISATION DU PROJET

Les chiers du projet


t9i l9hitude de fire une lsse pr fentreF gomme notre projet ne ser onstitu @u moins dns un premier tempsA que d9une seule fentreD nous urons don les (hiers suivnts X ! main.cpp Y ! FenPrincipale.h Y ! FenPrincipale.cppF i vous voulez utiliser les mmes ines que moiD utilisez le ode we qui suit pour les tlhrger F  lhrger les ines gode we X RWURRV 
3

Utiliser QWebView pour acher une page web


est le prinipl nouveu widget que vous urez esoin d9utiliser dns e hpitreF sl permet d90her une pge weF g9est lui le moteur weF ous ne svez ps vous en servir mis vous svez mintennt lire l doumenttionF ous llez voirD e n9est ps ien di0ile 3 egrdez en prtiulier les signux et slots proposs pr le QWebViewF sl y tout e qu9il fut svoir pourD pr exempleD onntre le pourentge de hrgement de l pge pour le rperuter sur l rre de progression de l rre d9tt @signl loadProgress (int)AF gomme l9indique l doumenttionD pour rer le widget et hrger une pgeD 9est trs simple X
QWebView
eiew Bpgee a new eiewY pgeeEblod@rl@4httpXGGwwwFsiteduzeroFomG4AAY

oil 9est tout e que je vous expliqueri sur QWebViewD pour le reste lisez l douE menttionF XEA

La navigation par onglets


ve prolme de QWebViewD 9est qu9il ne permet d90her qu9une seule pge we l foisF sl ne gre ps l nvigtion pr ongletsF sl v flloir implmenter le systme d9onglets nousEmmesF ous n9vez jmis entendu prler de QTabWidget c i siD souvenezEvousD nous l9vons douvert dns un des hpitres prdentsF ge widgetEonteneur est ple d9E ueillir n9importe quel widgetF F F omme un QWebView 3 in ominnt un QTabWidget
3. Toutes ces icnes sont sous licence LGPL et proviennent du site everaldo.com

SQW

CHAPITRE 32.

TP : ZNAVIGO, LE NAVIGATEUR WEB DES ZROS !

et des QWebView @un pr ongletAD vous pourrez reonstituer un vritle nvigteur pr onglets 3 ne petite stue toutefoisD qui pourr vous tre ien utile X svoir retrouver un widget ontenu dns un widget prentF gomme vous le svezD le QTabWidget utilise des sousE widgets pour grer hune des pgesF ges sousEwidgets sont gnrlement des QWidget gnriques @invisilesAD qui servent ontenir d9utres widgetsF hns notre s X QTabWidget contient des QWidget @pges d9ongletsA qui euxEmmes contiennent hun un QWebView @l pge weAF oyez l (gure QPFRF

Figure QPFR ! truture de zxvigo

v mthode findChild @d(nie dns QObjectA permet de retrouver le widget enfnt ontenu dns le widget prentF r exempleD si je onnis le QWidget pageOngletD je peux retrouver le QWebView qu9il ontient omme ei X
eiew Bpgee a pgeyngletEbfindghild`eiew Bb@AY

wieux enoreD je vous donne l mthode toute fite qui permet de retrouver le QWebView tuellement visulis pr l9utilisteur @(gure QPFSA X
eiew BpenrinipleXXpgeetuelle@A { return ongletsEburrentidget@AEbfindghild`eiew Bb@AY }

onglets orrespond u QTabWidgetF mthode currentWidget() permet d9otenir un pointeur vers le QWidget qui sert de pge pour l pge tuellement 0heF yn

SRH

GNRATION DE LA FENTRE PRINCIPALE

Figure QPFS ! tilistion de findChild

demnde ensuite retrouver le QWebView que le QWidget ontient l9ide de l mthode findChild()F gette mthode utilise les templtes gCC @ve <QWebView*>AF gel permet de fire en sorte que l mthode renvoie ien un QWebView* @sinon elle n9urit ps su quoi renvoyerAF t9dmetsD 9est un petit peu ompliquD mis u moins el pourr vous iderF
4

Let's go !
oilD vous svez dj tout e qu9il fut pour vous en sortirF xotez que e fit l prt elle l QMainWindowD n9hsitez don ps relire e hpitre dns un premier temps pour ien vous remmorer son fontionnementF our m prtD j9i hoisi de oder l fentre  l min @ps de t hesigner donA r elleEi est un peu omplexeF gomme il y euoup d9initilistions fire dns le onstruteurD je vous onseille de les pler dns des mthodes que vous ppellerez depuis le onstruteur pour mliorer l lisiilit glole X
penrinipleXXpenriniple@A { reeretions@AY reerwenus@AY reerfrresyutils@AY GB eutres initilistions BG }

fon ourge 3

Gnration de la fentre principale


te ne vous prsente ps ii le (hier main.cppD il est simple et lssiqueF sntressonsE nous ux (hiers de l fentreF
4. Nous dcouvrirons en profondeur leur fonctionnement dans un prochain chapitre !

SRI

CHAPITRE 32.

TP : ZNAVIGO, LE NAVIGATEUR WEB DES ZROS !

FenPrincipale.h

(premire version)

hns un premier tempsD je ne re que le squelette de l lsse et ses premires mE thodesD j9en rjouteri d9utres u fur et mesure si esoin estF
5ifndef riehipixsxgsevi 5define riehipixsxgsevi 5inlude `tquib 5inlude `teuitb lss penriniple X puli winindow { yftig puliX penriniple@AY privteX void void void void reeretions@AY reerwenus@AY reerfrresyutils@AY reerfrreitt@AY

privte slotsX privteX idget BongletsY etion etion etion etion etion etion etion etion etion etion etion BtionxouvelyngletY BtionpermeryngletY BtionuitterY BtioneroposY BtioneropostY BtionreedenteY BtionuivnteY BtiontopY BtionetuliserY BtioneueilY BtionqoY

}Y 5endif

vineidit BhmpedresseY rogressfr BprogressionY

v lsse hrite de QMainWindow omme prvuF t9i inlus QtGui et QtWebKit pour pouvoir utiliser le module qs et le module euit @moteur weAF SRP

GNRATION DE LA FENTRE PRINCIPALE

won ide 9estD omme je vous l9vis ditD de ouper le onstruteur en plusieurs sousE mthodes qui s9oupent hune de rer une setion di'rente de l QMainWindow X tionsD menusD rre d9outilsD rre d9ttF F F t9i prvu une setion pour les slots personnliss mis je n9i enore rien misD je verri u fur et mesureF in(nD j9i prpr les prinipux ttriuts de l lsseF in (n de ompteD prt de nomreuses QActionD il n9y en ps euoupF te n9i mme ps eu esoin de mettre des ojets de type QWebView X euxEi seront rs l vole u ours du progrmme et on pourr les retrouver gre l mthode pageActuelle() que je vous i donne un peu plus ttF oyons voir l9implmenttion du onstruteur et de ses sousEmthodes qui gnrent le ontenu de l fentreF

Construction de la fentre
hiretion FenPrincipale.cppD on ommene pr le onstruteur X
5inlude 4penrinipleFh4 penrinipleXXpenriniple@A { GG qnrtion des widgets de l fentre priniple reeretions@AY reerwenus@AY reerfrresyutils@AY reerfrreitt@AY GG qnrtion des onglets et hrgement de l pge d9ueil onglets a new idgetY ongletsEbdd@reeryngletgee@tr@4httpXGGwwwFsiteduzeroFom4AAD tr@4@xouvelle pgeA4AAY onnet@ongletsD sqxev@urrentghnged@intAAD thisD vy@hngementynglet@ intAAAY setgentrlidget@ongletsAY GG hfinition de quelques proprits de l fentre setwinimumize@SHHD QSHAY setindowson@son@4imgesGznvigoFpng4AAY setindowitle@tr@4zxvigo4AAY

ves mthodes creerActions()D creerMenus()D creerBarresOutils() et creerBarre Etat() ne seront ps prsentes dns le livre r elles sont longues et rptitives F illes
5

5. Mais vous pourrez les retrouver en entier en tlchargeant le code web prsent la n de ce chapitre !

SRQ

CHAPITRE 32.

TP : ZNAVIGO, LE NAVIGATEUR WEB DES ZROS !

onsistent simplement mettre en ple les lments de l fentre priniple omme nous vons ppris le fireF r ontreD e qui est intressnt ensuite dns le onstruteurD 9est que l9on re le QTabWidget et on lui joute un premier ongletF our l rtion d9un ongletD on v fire ppel une mthode  mison creerOngletPageWeb() qui se hrge de rer le idgetEpge de l9ongletD insi que de rer un QWebView et de lui fire hrger l pge we envoye en prmtre F ous noterez que l9on utilise l fontion de tr() prtout o on rit du texte suseptile d9tre 0hF gel permet de filiter l trdution ultrieure du progrmme dns d9utres lnguesD si on le souhiteF on utilistion ne ote rien et ne omplexi(e ps vriment le progrmmeD don pourquoi s9en priver c yn onnete en(n et surtout le signl currentChanged() du QTabWidget un slot personnlis changementOnglet() que l9on v devoir rireF ge slot ser ppel hque fois que l9utilisteur hnge d9ongletD pourD pr exempleD mettre jour l9v dns l rre d9dresse insi que le titre de l pge 0h en hut de l fentreF oyons mintennt quelques mthodes qui s9oupent de grer les ongletsF F F
6

Mthodes de gestion des onglets


in fitD il n9y que P mthodes dns ette tgorie X ! creerOngletPageWeb() X je vous en i prl dns le onstruteurD elle se hrge de rer un idgetEpge insi qu9un QWebView l9intrieurD et de renvoyer e idgetEpge l9ppelnt pour qu9il puisse rer le nouvel ongletF ! pageActuelle() X une mthode ien prtique que je vous i donne un peu plus ttD qui permet tout moment d9otenir un pointeur vers le QWebView de l9onglet tuellement sletionnF oii es mthodes X
idget BpenrinipleXXreeryngletgee@tring urlA { idget Bpgeynglet a new idgetY eiew Bpgee a new eiewY foxvyout Blyout a new foxvyoutY lyoutEbsetgontentswrgins@HDHDHDHAY lyoutEbddidget@pgeeAY pgeyngletEbsetvyout@lyoutAY if @urlFisimpty@AA { pgeeEblod@rl@tr@4htmlGpgelnheFhtml4AAAY }
6. http://www.siteduzero.com sera donc la page d'accueil par dfaut, mais je vous promets que j'ai choisi ce site au hasard ! ;-)

SRR

LES SLOTS PERSONNALISS

else { if @urlFleft@UA 3a 4httpXGG4A { url a 4httpXGG4 C urlY } pgeeEblod@rl@urlAAY } GG qestion des signux envoys pr l pge we onnet@pgeeD sqxev@titleghnged@tringAAD thisD vy@hngementitre@ tringAAAY onnet@pgeeD sqxev@urlghnged@rlAAD thisD vy@hngementrl@rlAAAY onnet@pgeeD sqxev@lodtrted@AAD thisD vy@hrgementheut@AAAY onnet@pgeeD sqxev@lodrogress@intAAD thisD vy@hrgementingours@int AAAY onnet@pgeeD sqxev@lodpinished@oolAAD thisD vy@hrgementermine@ oolAAAY } return pgeyngletY

eiew BpenrinipleXXpgeetuelle@A { return ongletsEburrentidget@AEbfindghild`eiew Bb@AY }

te ne ommente ps pageActuelle()D je l9i dj fit uprvntF our e qui est de creerOngletPageWeb()D elle re omme prvu un QWidget et elle ple un nouveu QWebView l9intrieurF v pge we hrge l9v indique en prmtre et rjoute le pr(xe http:// si eluiEi t ouliF i uune v n9 t spi(eD on hrge une pge lnheF t9i pour l9osion r un (hier rwv videD pl dns un sousEdossier html du progrmmeF yn onnete plusieurs signux intressnts envoys pr le QWebView quiD mon visD prlent d9euxEmmes X  ve titre hng D  v9v hng D  hut du hrgeE ment D  ghrgement en ours D  ghrgement termin F frefD rien de sorierD mis el fit enore tout plein de slots personnliss rire 3 YEA

Les slots personnaliss


fonD il y de quoi fireF sl fut omplter FenPrincipale.h pour lui jouter tous les slots que l9on l9intention d9rire X precedente()D suivante()D etF te vous lisse le soin de le fireD e n9est ps di0ileF ge qui est intressntD 9est de voir leur implmenttion dns le (hier .cppF SRS

CHAPITRE 32.

TP : ZNAVIGO, LE NAVIGATEUR WEB DES ZROS !

Implmentation des slots


Slots appels par les actions de la barre d'outils

gommenons pr les tions de l rre d9outils X


void penrinipleXXpreedente@A { pgeetuelle@AEbk@AY } void penrinipleXXsuivnte@A { pgeetuelle@AEbforwrd@AY } void penrinipleXXueil@A { pgeetuelle@AEblod@rl@tr@4httpXGGwwwFsiteduzeroFom4AAAY } void penrinipleXXstop@A { pgeetuelle@AEbstop@AY } void penrinipleXXtuliser@A { pgeetuelle@AEbrelod@AY }

yn utilise l @trsA prtique fontion pageActuelle() pour otenir un pointeur vers le QWebView que l9utilisteur est en trin de regrder @histoire d9'eter l pge we de l9onglet en ours et non ps les utresAF outes es mthodesD omme back() et forward()D sont des slotsF yn les ppelle ii omme si 9tient de simples mthodes F
7

Pourquoi ne pas avoir connect directement les signaux envoys par les QAction aux slots du QWebView ?

yn urit puD s9il n9y vit ps eu d9ongletsF ve prolme justement iiD 9est qu9on gre plusieurs onglets di'rentsF r exempleD on ne pouvit ps onneter lors de s rtion l QAction  tuliser u QWebViewF F F pre que le QWebView tuliser dpend de l9onglet tuellement
7. Je vous rappelle que les slots sont en ralit des mthodes qui peuvent tre connectes des signaux.

SRT

LES SLOTS PERSONNALISS

sletionn 3 oil don pourquoi on psse pr un petit slot mison qui v d9ord herher svoir quel est le QWebView que l9on est en trin de visuliser pour tre sr qu9on rehrge l onne pgeF
Slots appels par d'autres actions des menus

oii les slots ppels pr les tions des menus suivnts X ! xouvel onglet Y ! permer l9onglet Y ! proposF F F
void penrinipleXXropos@A { wessgefoxXXinformtion@thisD tr@4e proposFFF4AD tr@4zxvigo est un projet rlis pour illustrer les tutoriels gCC du ` hrefa4httpXGGwwwFsiteduzero Fom4bite du ro`GbF`r Gbves imges de e progrmme ont t res pr ` hrefa4httpXGGwwwFeverldoFom4biverldo goelho`Gb4AAY } void penrinipleXXnouvelynglet@A { int indexxouvelynglet a ongletsEbdd@reeryngletgee@AD tr@4@xouvelle pgeA4AAY ongletsEbsetgurrentsndex@indexxouvelyngletAY hmpedresseEbsetext@44AY hmpedresseEbsetpous@tXXytherpousesonAY

void penrinipleXXfermerynglet@A { GG yn ne doit ps fermer le dernier onglet if @ongletsEbount@A b IA { ongletsEbremove@ongletsEburrentsndex@AAY } else { wessgefoxXXritil@thisD tr@4irreur4AD tr@4sl fut u moins un onglet 34AAY } }

ve slot aPropos() se ontente d90her une ote de dilogueF nouvelOnglet() rjoute un nouvel onglet l9ide de l mthode addTab() du QTabW idgetD omme on l9vit fit dns le onstruteurF our que le nouvel onglet s90he immditementD on fore son 0hge ve setCurrentIndex() qui se sert de l9index SRU

CHAPITRE 32.

TP : ZNAVIGO, LE NAVIGATEUR WEB DES ZROS !

@numroA de l9onglet que l9on vient de rerF yn vide l rre d9dresse et on lui donne le fousD 9estEEdire que le urseur est diretement pl dedns pour que l9utilisteur puisse rire une vF
L'action  Nouvel onglet  a comme raccourci Ctrl + T , ce qui permet d'ouvrir un onglet tout moment l'aide du raccourci clavier correspondant. Vous pouvez aussi ajouter un bouton dans la barre d'outils pour ouvrir un nouvel onglet ou, encore mieux, rajouter un mini-bouton dans un des coins du QTabWidget. Regardez du ct de la mthode setCornerWidget().
fermerOnglet() supprime l9onglet tuellement sletionnF sl vri(e u prlle que l9on n9est ps en trin d9essyer de supprimer le dernier ongletD uquel s le QTabWidget n9urit plus lieu d9exister F
8

Slots de chargement d'une page et de changement d'onglet

ges slots sont ppels respetivement lorsqu9on demnde hrger une pge @on ppuie sur l touhe Entre prs voir rit une v ou on lique sur le outon tout droite de l rre d9outilsA et lorsqu9on hnge d9ongletF
void penrinipleXXhrgerge@A { tring url a hmpedresseEbtext@AY GG yn rjoute le 4httpXGG4 s9il n9est ps dj dns l9dresse if @urlFleft@UA 3a 4httpXGG4A { url a 4httpXGG4 C urlY hmpedresseEbsetext@urlAY } } pgeetuelle@AEblod@rl@urlAAY

void penrinipleXXhngementynglet@int indexA { hngementitre@pgeetuelle@AEbtitle@AAY hngementrl@pgeetuelle@AEburl@AAY }

yn vri(e u prlle que l9utilisteur mis le pr(xe http:// etD si e n9est ps le s on le rjoute @sinon l9dresse n9est ps vlideAF vorsque l9utilisteur hnge d9ongletD on met jour deux lments sur l fentre X le titre de l pgeD 0h tout en hut de l fentre et sur un ongletD et l9v insrite dns l rre d9dresseF changementTitre() et changementUrl() sont des slots personnlissD
8. Un systme onglets sans onglets, cela fait dsordre !

SRV

LES SLOTS PERSONNALISS

que l9on se permet d9ppeler omme n9importe quelle mthodeF ges slots sont ussi utomtiquement ppels lorsque le QWebView envoie les signux orrespondntsF oyons voir omment implmenter es slotsF F F
Slots appels lorsqu'un signal est envoy par le QWebView

vorsque le QWebView s9tiveD il v envoyer des signuxF geuxEi sont onnets des slots personnliss de notre fentreF ves voii X
void penrinipleXXhngementitre@onst tring 8 titregompletA { tring titregourt a titregompletY GG yn tronque le titre pour viter des onglets trop lrges if @titregompletFsize@A b RHA { titregourt a titregompletFleft@RHA C 4FFF4Y } setindowitle@titregourt C 4 E 4 C tr@4zxvigo4AAY ongletsEbsetext@ongletsEburrentsndex@AD titregourtAY

void penrinipleXXhngementrl@onst rl 8 urlA { if @urlFtotring@A 3a tr@4htmlGpgelnheFhtml4AA { hmpedresseEbsetext@urlFtotring@AAY } } void penrinipleXXhrgementheut@A { progressionEbsetisile@trueAY } void penrinipleXXhrgementingours@int pourentgeA { progressionEbsetlue@pourentgeAY } void penrinipleXXhrgementermine@ool okA { progressionEbsetisile@flseAY sttusfr@AEbshowwessge@tr@4rt4AD PHHHAY }

ges slots ne sont ps trs omplexesF sls mettent jour l fentre @pr exemple l rre de progression en sA lorsqu9il y lieuF SRW

CHAPITRE 32.

TP : ZNAVIGO, LE NAVIGATEUR WEB DES ZROS !

gertins sont trs utilesD omme changementUrl()F in e'etD lorsque l9utilisteur lique sur un lien dns l pgeD l9v hnge et il fut pr onsquent mettre jour le hmp d9dresseF

Conclusion et amliorations possibles


Tlcharger le code source et l'excutable
te vous propose de tlhrger le ode soure insi que l9exutle indows du projetF  lhrger le progrmme gode we X QITRRI  ensez jouter les hvv nessires dns le mme dossier que l9exutleD si vous vouE lez que eluiEi fontionneF gette foisD omme je vous l9vis ditD il fut deux nouveux hvv X QtWebKit4.dll et QtNetwork4.dllF

Amliorations possibles
emliorer le nvigteurD 9est possile c gertinement 3 sl fontionne mis il est enore loin d9tre prfitD et j9i des tonnes d9ides pour l9mliorerF fonD es ides sont reE pompes des nvigteurs qui existent dj mis rien ne vous emphe d9en inventer de nouvellesD superErvolutionnires ien sr 3 ! Acher l'historique dans un menu X il existe une lsse QWebHistory qui permet de ruprer l9historique de toutes les pges visites via un QWebViewF enseignezE vous ensuite sur l do de QWebHistory pour essyer de trouver omment ruprer l liste des pges visitesF ! Recherche dans la page X rjoutez l possiilit de fire une reherhe dns le texte de l pgeF sndie X QWebView dispose d9une mthode findText() 3 ! Fentre d'options X vous pourriez rer une nouvelle fentre d9options qui permet de d(nir l tille de polie pr dfutD l9v de l pge d9ueilD etF our modi(er l tille de l polie pr dfutD regrdez du t de QWebSettingsF our enregistrer les optionsD vous pouvez psser pr l lsse QFile pour rire dns un (hierF wis j9i mieux X utilisez l lsse QSettings qui est spilement onue pour enregistrer des optionsF in gnrlD les options sont enregistres dns un (hier @.iniD .confF F FAD mis on peut ussi enregistrer les options dns l se de registre sous indowsF ! Gestion des marque-pages (favoris) X voil une fontionnlit trs rpndue sur l pluprt des nvigteursF v9utilisteur ime ien pouvoir enregistrer les dresses de ses sites we prfrsF v enoreD pour l9enregistrementD je vous reommnde hudement de psser pr un QSettingsF

SSH

Quatrime partie

Utilisez la bibliothque standard

SSI

Chapitre

33
Dicult :

Qu'est-ce que la bibliothque standard ?

aintenant que vous tes des champions de Qt, dcouvrir une bibliothque de fonctions ne devrait pas vous faire peur. Vous verrez qu'utiliser les outils standard n'est pas toujours de tout repos mais cela peut rendre vos programmes diablement plus simples crire et plus ecaces. La bibliothque standard du C++ est la bibliothque ocielle du langage, c'est--dire qu'elle est disponible partout o l'on peut utiliser le C++. Apprendre l'utiliser vous permettra de travailler mme sur les plates-formes les plus excentriques o d'autres outils, comme Qt par exemple, n'existent tout simplement pas.

SSQ

CHAPITRE 33.

QU'EST-CE QUE LA BIBLIOTHQUE STANDARD ?

ge hpitre d9introdution l iliothque stndrd @l v A ne devrit ps vous poser de prolmes de omprhensionF yn v ommener en doueur pr se ultiver un peu et revoir ertins lments dont vous vez dj entendu prlerF xous llons u prohin hpitre nous plonger rellement dns l prtie intressnte de l iliothqueD l lre v F
1 2

Un peu d'histoire
hns l9introdution de e oursD je vous i dj un petit peu prl de l9histoire des lngges de progrmmtion en gnrlD (n de situer le gCCF te vous propose d9enE trer un peu plus dns les dtils pour omprendre pourquoi un lngge possde une iliothque stndrdF

La petite histoire raccourcie du C++


renons notre mhine remonter le temps et retournons ette poque de l9inforE mtique o le gh n9vit ps enore t inventD o l souris n9existit psD o les ordinteurs tient moins puissnts que les proesseurs de votre lveElinge ou de votre four miroEondesF F F xous sommes en IWUWD fjrne troustrupD un informtiien de hez e8D dveloppe le C with classes prtir du g et en s9inspirnt des lngges plus modernes et innovnts de l9poque omme le imulF sl rit luiEmme le premier ompilteur de son nouveu lngge et l9utilise dns son trvilF l9poqueD son lngge n9tit utilis que pr luiE mme pour ses reherhes personnellesF sl voulit en rlit mliorer le g en joutnt les outils quiD selon luiD mnquient pour se simpli(er l vieF etit petitD des ollgues et d9utres pssionns ommenent s9intresser u C with classesF it le esoin se fit sentir d9jouter de nouvelles fontionnlitsF in IWVQD les rfrenesD l surhrge d9oprteurs et les fontions virtuelles sont joutes u lngge qui s9ppeller dsormis gCCF ve lngge ommene ressemler un peu e que vous onnissezF in fitD qusiment tout e que vous vez ppris dns les prties s et ss de e ours est dj prsent dns le lnggeF ous svez don utiliser des notions qui ont de l9geF ve gCC ommene intresser les gens et troustrup (nit pr pulier une version ommerile de son lngge en IWVSF in IWVWD l version PFH du gCC sortF ille pporte en prtiulier l9hritge multipleD les lsses strites et d9utres petites nouveuts pour les lssesF lus trdD les templtes et les exeptions @deux notions que nous verrons dns l prtie de e ours 3A seront jouts u lngge qui est qusiment quivlent e que l9on onnt ujourd9huiF in prllle ette volutionD une iliothque plus ou moins stndrd se reD dns un premier temps pour rempler les printf et utres hoses peu prtiques du g pr les coutD nettement plus files utiliserF gette prtie de l vD ppele iostream existe toujours et vous l9vez dj utiliseF
1. 2.

Standard Library Standard Template Library

SSR

UN PEU D'HISTOIRE

lus trd d9utres lments seront jouts l iliothque stndrdD omme pr exemple l v D reprise de trvux plus niens d9elexnder tepnov notmment et  trduits de l9ed vers le gCCF get norme joutD qui v nous ouper dns l suiteD est une vne mjeure pour le gCCF g9est e momentEl que des hoses trs prtiques omme les string ou les vector pprissent 3 he nos joursD il est di0ile d9imginer un progrmme sns es  riques de seF it je suis sr que le reste de l v v ussi vous plireF in IWWVD un omit de normlistion se forme et dide de stndrdiser le lngge u niveu interntionlD 9estEEdire que hque implmenttion du gCC devr fournir un ertin nomre de fontionnlits minimlesF g9est dns e dre qu9est (x le gCC tuelF g9est ussi e momentEl que l iliothque stndrd est (ge et insrite dns l normeF Cela veut dire que l'on devrait obligatoirement retrouver la bibliothque standard avec n'importe quel compilateurF it 9est el qui fit s foreF i vous vez un ordinteur ve un ompilteur gCCD il proposer forment toutes les fontions de l vF ge n9est ps forment le s d9utres iliothques qui n9existent que sous indows ou que sous vinuxD pr exempleF in(nD en PHIID le gCC devrit suir une rvision mjeure qui lui pporter de nomE reuses fontionnlits ttendues depuis longtempsF rmi es hngementsD on iter l9jout de nouveux motsElsD l simpli(tion des templtes et l9jout de nomreux lments vns l iliothque stndrd F i l future normeD qu9on ppelle gCCIxD vous intresseD je vous renvoie vers l9enylopdie ikipediF  gCCIx sur ikipedi gode we X STSWVV 
3 4

Pourquoi une bibliothque standard ?


g9est une question que euoup de monde poseF ns l vD le gCC ne ontient en rlit prtiquement rienF issyez d9rire un progrmme sns stringD vectorD cout ou mme new @qui utilise en interne des prties de l vA 3 g9est solument impossile ou lorsD el reviendrit rire nousEmmes es riques pour les utiliser pr l suiteD 9estEEdire rire notre propre version de cout ou de vectorF te vous ssure que 9est trs trs ompliqu fireF eu lieu de rinventer l roueD les progrmmeurs se sont don mis d9ord sur un ensemle de fontionnlits de se utilises pr un mximum de personnes et les ont mises disposition de tout le mondeF ous les lngges proposent des iliothques stndrd ve des lments disposition des utilisteursF ve lngge tvD pr exempleD propose mme des outils pour rer des fentres lors que le gD luiD ne propose qusiment rienF und on utilise e lnggeD il fut don souvent friquer ses propres fontions de seF ve gCC est un peu entre les deux puisque s v met disposition des ojets vector ou string mis ne propose uun moyen de rer des fentresF g9est pour el que nous vons ppris utiliser tF sl fllit utiliser quelque hose d9externeF
3. Standard Template Library 4. Notamment des fonctionnalits venant de la clbre bibliothque boost.

SSS

CHAPITRE 33.

QU'EST-CE QUE LA BIBLIOTHQUE STANDARD ?

fon 3 essez prlF oyons e qu9elle dns le ventreD ette iliothque stndrdF

Le contenu de la SL
v iliothque stndrd est grosso modo ompose de trois grndes prties que nous llons explorer plus ou moins en dtil dns e oursF gomme vous llez le voirD il y des moreux que vous onnissez dj ien @ou que vous devriez onntreAF
Cette classication est assez arbitraire et selon les sources que l'on consulte, on trouve jusqu' 5 parties.

L'hritage du C
v9ensemle de l iliothque stndrd du g est prsente dns l vF ves IS (hiers d9enEtte du g @norme de IWWHA sont disponiles qusiment l9identique en gCCF he ette mnireD les progrmmes rits en g peuvent @presque tousA tre rutiliss tels quels en gCCF te vous prsenteri es vnrles lments venus du g l (n de e hpitreF

Les ux
hns une deuxime prtieD on trouve tout e qui trit ux )uxD 9estEEdire l9ensemle des outils permettnt de fire ommuniquer les progrmmes ve l9extrieurF ge sont les lsses permettnt X ! d90her des messges dns l onsole Y ! d9rire du texte dns l onsole Y ! ou enore d9e'etuer des oprtions sur les (hiersF t9espre que el vous rppelle quelque hose 3 get spet ser rivement ord dns l suite de ette prtie misD omme vous onnissez dj ien es hosesD il ne ser ps nessire de dtiller tout e qu9on y trouveF xous vons dj ppris utiliser coutD cin insi que les fstream pour ommuniquer ve des (hiers plus tt dns e oursF te ne vis ps vous en pprendre euoup plus dns l suiteF wis nous llons qund mme voir quelques fontionnlitsD omme l opie d9un (hier dns un tleu de motsF ous verrez que ertines oprtions fstidieuses peuvent tre rlises de mnire trs simple une fois que l9on onnt les ons oneptsF SST

SE DOCUMENTER SUR LA SL

La STL
v Standard Template Library @vA est ertinement l prtie l plus intressnteF yn y trouve des onteneursD tels que les vectorD permettnt de stoker des ojets selon di'rents ritresF yn y trouve glement quelques lgorithmes stndrd omme l reherhe d9lments dns un onteneur ou le tri d9lmentsF yn y trouve des itrteursD des fonteursD des prditsD des pointeurs intelligents et enore plein d9utres hoses mystrieuses que nous llons douvrir en dtilF ous vous en doutez peutEtreD l suite de e ours ser onsre priniplement l desription de l vF

Le reste
te vous vis dit qu9il y vit trois prtiesF F F wis omme souventD les lssi(tions ne sont ps rellement utilisles dns l rE litF sl y don quelques lments de l v qui sont inlsslesD en prtiulier l lsse stringD qui est l frontire entre l v et les )uxF he mmeD ertins outils onerE nnt l gestion (ne de l mmoireD les prmtres rgionux ou enore les nomres omplexes ne rentrent dns uune des trois prties priniplesF wis el ne veut ps dire que je ne vous en prleri psF

Se documenter sur la SL
hns le hpitre Apprendre lire la documentation de Qt @pge RQIA vous vez ppris vous servir d9une doumenttion pour trouver les lsses et fontions utilesF F F it vous vous dites srement qu9il en v de mme pour l iliothque stndrdF te vis vous devoirD mis e n9est ps le sF sl n9existe ps de  doumenttion o0ielle pour l vF it 9est ien dommgeF in fitD e n9est ps tout fit vriF v desription trs dtille de hque fontionnE lit se trouve dns l norme du lnggeF g9est un gros doument de prs de VHH pgesD entirement en nglisD solument indigesteF r exempleD on y trouve l desription suivnte pour les ojets vector X e vetor is kind of sequene tht supports rndom ess itertorsF sn dditionD it supports @mortizedA onstnt time insert nd erse opertions t the end Y insert nd erse in the middle tke liner timeF torge mE ngement is hndled utomtillyD though hints n e given to improve e0ienyF he elements of vetor re stored ontiguouslyD mening tht if v is vector<T,Allocator> where is some type other thn oolD then it oeys the identity &v[n]==&v[0]+n for ll 0<=n<v.size()F wme si vous prlez nglis ourmmentD vous n9vez ertinement ps ompris grnd hoseF it pourtntD je vous i hoisi un pssge ps trop osurF ous omprendrez don que l9on ne peut ps trviller ve elF SSU

CHAPITRE 33.

QU'EST-CE QUE LA BIBLIOTHQUE STANDARD ?

Des ressources sur le Web


reureusementD il existe quelques sites we qui prsentent le ontenu de l vF wis mnque de hne pour les nglophoesD toutes les rfrenes intressntes sont en nglisF oii qutre soures que j9utilise rgulirementF illes ne sont ps toutes ompltes mis elles su0sent dns l pluprt des sF te les i lsses de l plus simple suivre l plus ompliqueF ! cplusplus.com E ne doumenttion plus simple qui prsente l9ensemle de l vF ves explitions ne sont ps toujours ompltes mis elles sont ompgnes d9exemples simples qui permettent de ien omprendre l9intrt de hque fontion et lsseF ! ApacheC++ E ne onne doumenttion de l v en gnrlF ves fontions sont ompgnes d9exemples simples permettnt de omprendre le fontionnement de hune d9ellesF ille est surtout intressnte pour s prtie sur les )uxF ! sgi E ne doumenttion trs omplte de l vF v desription n9est ps toujours ise lire pour un dutnt et ertins lments prsents ne font ps prtie de l v stndrd mis seulement d9une version propose pr qsF rsente uniquement l vF ! dinkumware.com E ne rfrene trs omplte et trs ien fite sur l v u ompletF ve site prsente glement de l doumenttion sur ID l future iliothque stndrd du gCCF rolement l meilleure doumenttion sur l vF  plusplusFom gode we X IIRHUR   ephe gCC gode we X QPQPWW   sgi gode we X QHRITT   dinkumwreFom gode we X RTVTST  te vous onseille de nviguer un peu sur es sites et de regrder elui qui vous plt le plusF v9utre solution est de me fire on(ne et douvrir le tout via e oursF te ne pourri ien sr ps tout vous prsenter mis on v fire le tour de l9essentielF

L'hritage du C
ve gCC tnt en quelque sorte un desendnt du gD l totlit de l iliothque stndrd du g est disponile dns l vF sl y quelques outils qui sont toujours utilissD d9utres qui ont t rempls pr des versions mliores et (nlement d9utres qui sont totlement osoltesF t9espre ne ps vous devoir en ne prlnt que des lments SSV

L'HRITAGE DU C

utilesF g9est dj euoup 3


Si vous avez fait du C, vous devriez reconnatre les en-ttes dont je vais vous parler. La principale dirence rside dans le nom du chier. En C, on utilise math.h, alors qu'en C++, c'est cmath. Le  .h  a disparu et un  c  a t ajout devant le nom.

gomme tout le reste de l vD l prtie hrite du g est spre en di'rents (hiers d9enEtte plus ou moins ohrentsF

L'en-tte cmath
geluiElD vous le onnissez djF ous l9vez douvert tout u dut du oursF g9est dns e (hier que sont d(nies toutes les fontions mthmtiques usuellesF gomme je suis sympD voii un petit rppel pour eux qui dorment u fond de l lsseF
5inlude`iostremb 5inlude`mthb using nmespe stdY int min@A { doule @RFQAD @SFPAY out `` pow@DA `` endlY out `` sqrt@A `` endlY out `` os@A `` endlY return HY }

GGglul de GGglul de l rine rre de GGglul du osinus de

eh je vois que vous vous en souvenez enoreF rfit 3 g9est don le (hier inlure lorsque vous vez des luls mthmtiques e'etuerF te ne vis ps vous rrire toute l liste des fontionsD vous les onnissez djF our vous hituer l doumenE ttionD essyez don de retrouver es fontions dns les di'rentes ressoures que je vous i indiquesF  houmenttion de cmath gode we X THRWPH 

L'en-tte cctype
ge (hier propose quelques fontions pour onntre l nture d9un charF und on mnipule du texteD on doit souvent rpondre des questions omme X ! gette lettre estEelle une mjusule ou une minusule c ! ge rtre estEil un espe c ! ge symole estEil un hi're c SSW

CHAPITRE 33.

QU'EST-CE QUE LA BIBLIOTHQUE STANDARD ?

ves fontions prsentes dns l9enEtte cctype sont l pour elF our tester si un char donn est un hi'reD pr exempleD on utiliser l fontion isdigit()F gomme dns l9exemple suivnt X
5inlude `iostremb 5inlude `typeb using nmespe stdY int min@A { out `` 4intrez un rtere X 4Y hr symoleY in bb symoleY if@isdigit@symoleAA out `` 4g9est un hiffreF4 `` endlY else out `` 4ge n9est ps un hiffreF4 `` endlY } return HY

gomme vous le voyezD 9est vriment trs simple utiliserF ve tleu suivnt prsente les fontions les plus utilises de et enEtteF ous trouverez l liste omplte dns votre doumenttion fvoriteF
Nom de la fonction Description
isalpha() isdigit() islower() isupper() isspace()

ri(e si le rtre est une lettreF ri(e si le rtre est un hi'reF ri(e si le rtre est une minusuleF ri(e si le rtre est une mjusuleF ri(e si le rtre est un espe ou un retour l ligneF

in plus de elD il y deux fontions tolower() et toupper() qui onvertissent une mjusule en minusule et inversementF yn peut insi isment trnsformer un texte en mjusules X
5inlude `iostremb 5inlude `typeb 5inlude `stringb using nmespe stdY int min@A { out `` 4intrez une phrse X 4 `` endlY string phrseY getline@inD phrseAY

STH

L'HRITAGE DU C

GGyn prourt l hne pour l onvertir en mjusules for@int i@HAY i`phrseFsize@AY CCiA { phrsei a toupper@phrseiAY } out `` 4otre phrse en mjusules est X 4 `` phrse `` endlY return HY

nouveuD rien de ien sorierF te vous lisse vous muser un peu ve es fontionsF issyez pr exemple de rliser un progrmme qui remple tous les espes d9une string pr le symole #F te suis sr que 9est dns vos ordesF

L'en-tte ctime
gomme son nom l9indiqueD e (hier d9enEtte ontient plusieurs fontions lies l gestion du tempsF v pluprt sont ssez izrres utiliser et don peu utilisesF he toute fonD l pluprt des utres iliothquesD omme tD proposent des lsses pour grer les heuresD les jours et les dtes de mnire plus iseF ersonnellementD l seule fontion de ctime que j9utilise est l fontion time()F ille renvoie le nomre de seondes qui se sont oules depuis le Ier jnvier IWUHF g9est e qu9on ppelle l9heure UNIXF
5inlude `iostremb 5inlude `timeb using nmespe stdY int min@A { int seondes a time@HAY out `` 4sl s9est eoule 4 `` seondes `` 4 seondes depuis le HIGHIGIWUHF4 `` endlY return HY }

La fonction attend en argument un pointeur sur une variable dans laquelle stocker le rsultat. Mais bizarrement, elle renvoie aussi ce rsultat comme valeur de retour. L'argument est donc en quelque sorte inutile. On fournit gnralement la fonction un pointeur ne pointant sur rien, d'o le 0 pass en argument.

ge qui donne X
sl s9est eoule IQHPRUIUSR seondes depuis le HIGHIGIWUHF

STI

CHAPITRE 33.

QU'EST-CE QUE LA BIBLIOTHQUE STANDARD ?

ge qui fit euoup de seondes 3


Euh. . . quoi cela sert-il ?

sl y priniplement trois risons d9utiliser ette fontion X ! v premire utilistion est ien sr de luler l dteF eve un petit peu d9rithmE tiqueD on retrouve filement l dte et l9heure tuelleF wis omme je vous l9i ditD l pluprt des iliothques proposent des outils plus simples pour elF ! heuximementD on peut l9utiliser pour luler le temps que met le progrmme s9exuterF yn ppelle l fontion time() en dut de progrmme puis une deuxime fois l (nF ve temps pss dns le progrmme ser simplement l di'rene entre les deux vleurs otenues 3 ! ve dernier s d9utilistion de ette fontionD vous l9vez dj vu 3 yn l9utilise pour gnrer des nomres ltoiresF xous llons voir omment dns l suiteF

L'en-tte cstdlib
oii nouveu une vieille onnissneF ouvenezEvousD dns le premier D je vous vis prsent un moyen de hoisir un nomre u hsrdF sl fllit utiliser les fontions srand() et rand()F g9est ertinement l9enEtte le plus utile en gF sl ontient toutes les riques de se et je rois qu9il n9y ps un seul progrmme de g qui n9inlue ps stdlib.h @l9quivlent  g de e (hierAF r ontreD en gCCD eh ienF F F il ne sert qusiment rienF wise prt l gnrtion de nomres ltoiresD tout t rempl en gCC pr de nouvelles fontionnlitsF evoyons qund mme en vitesse omment gnrer des nomres ltoiresF v fontion rand() renvoie un nomre u hsrd entre H et RAND_MAX @un trs grnd nomreD gnrlement plus grnd que 109 AF i l9on souhite otenir un nomre u hsrd entre H et IHD on utilise l9oprteur modulo @%AF
n a rnd@A 7 IHY GGn prendr une vleur u hsrd entre H et W omprisF

tusque lD rien de ien ompliquF ve prolme est qu9un ordinteur ne sit ps gnrer un nomre u hsrdF out e qu9il sit fire 9est rer des suites de nomres qui ont l'air alatoiresF sl fut don spi(er un dut pour l squeneF it 9est l qu9intervient l fontion srand() X elle permet de spi(er le premier terme de l suiteF
Il ne faut appeler qu'une seule et unique fois la fonction srand() par programme !

ve prolme est que si l9on donne hque fois le mme premier terme l9ordinteurD il gnre hque fois l mme squene 3 sl fut don lui donner quelque hose de STP

L'HRITAGE DU C

di'rent hque exution du progrmmeF it qu9estEe qui hnge hque fois que l9on exute un progrmme c v dte et l9heureD ien sr 3 v solution est don d9utiliser le rsultt de l fontion time() omme premier terme de l srieF
5inlude `iostremb 5inlude `timeb 5inlude `stdlib using nmespe stdY int min@A { srnd@time@HAAY

GGyn initilise l suite de nomres ltoires

for@int i@HAY i`IHY CCiA out `` rnd@A 7 IH `` endlY GGyn gnre des nomres u hsrd } return HY

vire vous ensuite d9utiliser es nomres pour mlnger des lettres omme dns le ou pour rer un jeu de sinoF ve prinipe de se est toujours le mmeF

Les autres en-ttes


wis prt cassert dont nous prlerons plus trdD le reste des IS enEttes du g n9est que trs rrement utilis en gCCF te ne vous en diri don ps plus dns e oursF fonD ssez trvill ve les reliques du g 3 our l9instntD je ne vous i ps prsent de grndes rvolutions pour vos progrmmes omme je vous l9vis promisF xe le dites ps trop fort si vous renontrez des mteurs de g mis 9est pre qu9on n9 ps enore utilis l puissne du gCCF etthez vos einturesD l suite du voyge v seouerF

En rsum
! v iliothque stndrd du gCC propose de nomreuses riques de se pour simpli(er l9riture de nos progrmmesF ! yn peut onsidrer qu9elle est doupe en trois prties X l vD les )ux et tout e qui t repris du lngge gF ! rmi les lments repris du gD on utilise priniplement cctype pour nlyser des lettresD ctime pour l mesure du temps et cstdlib pour gnrer des nomres ltoiresF

STQ

CHAPITRE 33.

QU'EST-CE QUE LA BIBLIOTHQUE STANDARD ?

STR

Chapitre

34
Dicult :

Les conteneurs

prs cette brve introduction la SL et aux lments venus du C, il est temps de se plonger dans ce qui fait la force de la bibliothque standard, la fameuse STL. Ce sigle signie Standard Template Library, ce que l'on pourrait traduire par  Bibliothque standard base sur des templates . Pour l'instant, vous ne savez pas ce que sont les templates, nous les dcouvrirons plus tard. Mais cela ne veut pas dire que vous n'avez pas le niveau requis ! Souvenez-vous de la classe string, vous avez appris l'utiliser bien avant de savoir ce qu'tait un objet. Il en sera de mme ici, nous allons utiliser (beaucoup) de templates sans que vous ayez besoin d'en savoir plus leur sujet. L'lment de base de toute la STL est le conteneur. Un conteneur est un objet permettant de stocker d'autres objets. D'ailleurs, vous en connaissez dj un : le vector. Dans ce premier vrai chapitre sur la SL, vous allez dcouvrir qu'il existe d'autres sortes de conteneurs pour tous les usages. La vraie dicult sera alors de faire son choix parmi tous ces conteneurs. Mais ne vous en faites pas, je serai l pour vous guider.

STS

CHAPITRE 34.

LES CONTENEURS

Stocker des lments


ous l9vez vu tout u long de e oursD stoker des ojets dns d9utres ojets est une oprtion trs ournteF ensez pr exemple ux olletions htrognesD lorsque nous vons vu le polymorphismeD ou ux di'rents lyouts dns t qui permettient d9rrnger les outons et utres ojets dns les widgetsF in jrgon informtiqueD es moyens de stokge s9ppellent des conteneursF ge sont des ojets qui peuvent onteE nir toute une srie d9utres ojets et qui proposent des mthodes permettnt de les mnipulerF A prioriD ette d(nition peut fire un peu peurF wis e ne devrit ps tre le sF gel fit ien longtemps que vous vez ppris utiliser les vectorD le memre le plus onnu de l vF oii un petit rppel sique pour eux qui dormient u fond de l slle de oursF
5inlude `iostremb 5inlude `vetorb using nmespe stdY int min@A { vetor`intb t@SDRAY GGn tleu ontennt S entiers dont l vleur est R tFpopk@AY GGyn supprime l dernire se du tleuF tFpushk@TAY GGyn joute un T l fin du tleuF for@int i@HAY i`tFsize@AY CCiA GGyn utilise size@A pour onntre le nomre d9lments dns le vetor out `` ti `` endlY GGyn utilise les rohets pour der ux lments } return HY

Souvenez-vous, la premire case d'un vector possde toujours l'indice 0.

ves vector sont des tleux dynmiquesF eutrement ditD les lments qu9ils ontiennent sont stoks les uns ot des utres dns l mmoireF yn pourrit se dire que 9est l seule mnire de rnger des ojetsF in tout sD 9est omme el que l pluprt des gens rngent leurs ves ou leurs tgresF te suis sr que vous fites de mmeF gette mnire de rnger des livres sur une iliothque est sns doute l plus simple que l9on puisse imginerF yn peut der diretement u troisime ou u huitime livre en tendnt simplement le rsF wis pour d9utres oprtionsD ette mthode de rngement n9est ps forment l meilleureF i vous devez jouter un livre u milieu de l olletionD vous llez devoir dler tous eux situs droiteF siD e n9est ps un gros trvilF wis imginez que votre iliothque ontienne des entines de livresD tout dler prendr du tempsF STT

STOCKER DES LMENTS

he mmeD ter un livre u milieu de l9tgre ser oteuxD il v flloir nouveu tout dpler 3 ge ne sont ps les seules oprtions di0iles e'etuer ve des livresF rier les livres selon le nom de l9uteur est ussi quelque hose de long et di0ile rliserF i le tri vit t e'etu u moment o les livres ont t poss pour l premire foisD on n9urit plus le fireF r ontreD jouter un livre dns l olletion implique une r)exion prlleF sl futD en e'etD pler le ouquin u on endroit pour que l olletion reste trieF snverser l9ordre des livres est ussi un long trvil dns une grnde iliothqueF frefD rnger des ojets n9est ps ussi simple qu9on pourrit le penserF ous l9vez srement onsttD toutes les iliothques rngent leurs livres les uns ots des utresF wis les informtiiens sont des gens mlinsF sls ont invent d9utres mthodes de rngementF xous llons les douvrir prtir de mintenntF
Il n'existe pas de  conteneur ultime , pour lequel toutes les oprations sont rapides. Il faut choisir la mthode de stockage adapte chaque problme en fonction des oprations que l'on veut privilgier. Je vous donnerai quelques astuces la n de ce chapitre.

Les deux catgories de conteneurs


ves di'rents onteneurs peuvent tre prtgs en deux tgories selon que les lments sont lsss l suite les uns des utres ou nonF yn prle dns un s de squenes et dns l9utre de onteneurs ssoitifsF ves vector sont ien videmment des squenes puisqueD omme je vous l9i ditD toutes les ses sont rnges de mnire ontigu dns l mmoireF xous llons voir tous es onteneurs en dtilF our l9instntD voii une liste de tous les onteneurs de l v tris suivnt leur tgorieF ! quenes X ! vector ! deque ! list ! stack ! queue ! priority_queue ! gonteneurs ssoitifs X ! set ! multiset ! map ! multimap ves noms des onteneurs sont en nglis et peutEtre un peu izrresD mis vous llez vite vous y fireF it puisD les nomsD ien que ompliqusD drivent plutt ien quoi ils serventF STU

CHAPITRE 34.

LES CONTENEURS

Pour utiliser ces conteneurs, il faut inclure le chier d'en-tte correspondant. Et l, rien de bien sorcier. Pour utiliser des list, il faut ajouter la ligne #include <list> en haut de votre code. De mme, pour utiliser une map, il faudra appeler #include<map> en dbut de chier.

ous vous dites peutEtre qu9pprendre utiliser IS onteneurs di'rents v demnder euoup de trvilF te vous rssure tout de suiteD ils sont qund mme trs similiresF eprs toutD ils sont tous l pour stoker des ojets 3 it omme les onepteurs de l v sont sympsD ils ont donn les mmes noms ux mthodes ommunes de tous les onteneursF r exempleD l mthode size() renvoie l tille d9un vectorD d9une list ou d9une mapF wgique 3

Quelques mthodes communes


gonntre l tilleD 9est ien mis on prfois simplement esoin de svoir si le onteE neur est vide ou psF our elD il existe l mthode empty() qui renvoie true si le onteneur est vide et false sinonF
list`douleb Y GGne liste de doule if@Fempty@AA out `` 4v liste est videF4 `` endlY else out `` 4v liste n9est ps videF4 `` endlY

ous ne svez ps enore e que sont les listes ni omment et qund les utiliserD mis je rois que vous n9vez ps eu de peine omprendre et extrit de odeF ne utre mthode ien prtique est elle qui permet de vider entirement un onteE neurF sl s9git de clear()F gel ne devrit ps surprendre les nglophones prmi vous 3
set`stringb Y GGn ensemle de hnes de rtres GGuelques tionsFFF Fler@AY GGit on vide le tout 3

nouveuD rien de ien di0ileD mme ve une lsse dont vous ne svez rienF in(nD il rrive qu9on it esoin d9hnger le ontenu de deux onteneurs de mme typeF it plutt que de devoir opier un un et l min les lmentsD les onepteurs de l v ont r une mthode swap() qui e'etue et hnge de l mnire l plus e0e possileF
vetor`douleb @VDQFIRAY vetor`douleb @SDPFUIAY GGn vetor ontennt V fois le nomre QFIR GGn utre vetor ontennt S fois le nomre PFUI

Fswp@AY GGyn hnge le ontenu des deux tleuxF GG mintennt une tille de V et une tille de SF

STV

LES SQUENCES ET LEURS ADAPTATEURS

Comme nous le verrons dans la partie suivante du cours, vector<int> et vector<double> sont des types dirents. On ne peut donc pas changer le contenu de deux conteneurs dont les lments sont de types dirents.

fon onD moiD tout el m9 donn envie d9en svoir plus sur es onteneursF ournons nous don vers les squenesF

Les squences et leurs adaptateurs


gommenons ve notre vieil miD le vectorF

Les vector, encore et toujours


i vous prlez l lngue de hkespereD vous urez ertinement reonnu dns le nom de es ojetsD le mot  veteur D es drles d9ojets mthmtiques que l9on reprsente pr des )hesF ih ienD ils n9ont ps normment de hoses en ommun 3 ves vector ne sont vriment ps dpts pour e'etuer des oprtions mthmtiquesF it en plusD ils n9en ont mme ps les rtristiquesF yn pourrit dire que 9est un muvis hoix de nom de l prt des onepteurs de l vF wis onD il est trop trd pour en hngerF F F ous llez don devoir vous hituer e fuxEmiF gomme vous l9vez vu depuis longtempsD les vector sont trs simples utiliserF yn de ux lments via les rohets []D omme pour les tleux sttiquesD et l9jout d9lments l (n se fit via l mthode push_back()F in rlitD ette mthode est une oprtion ommune toutes les squenesF sl en v de mme pour pop_back()F sl existe en plus de el deux mthodes plus rrement utilises permettnt d9der u premier et u dernier lment d9un vector ou de toute utre squeneF sl s9git des mthodes front() et back()F wis omme il n9est que rrement utile d9der seulement u premier ou u dernier lmentD es mthodes ne prsentent gure d9intrtF pinlementD il existe l mthode assign() permettnt de remplir tous les lments d9une squene ve l mme vleurF pitulons tout el dns un tleuF
Mthode
push_back() pop_back() front() back() assign()

Description

ejout d9un lment l (n du tleuF uppression de l dernire se du tleuF es l premire se du tleuF es l dernire se du tleuF wodi(tion du ontenu d9un tleuF

in plus des rohetsD il est possile d9der ux lments d9un vector en utilisnt des itrateursF g9est e que nous llons douvrir dns le prohin hpitreF our l9instntD tournonsEnous vers les utres types de squenesF STW

CHAPITRE 34.

LES CONTENEURS

Les deque, ces drles de tableaux


deque est en fit un ronyme @izrreA pour double ended queueD e qui donne en frnisD  queue deux outs F herrire e nom un peu originl se he un onept trs simple X 9est un tleu uquel on peut jouter des lments ux deux extrmitsF ves vector proposent les mthodes push_back() et pop_back() pour mnipuler e qui se trouve l (n du tleuF wodi(er e qui se trouve u dut n9est ps possileF ves deque lvent ette limittion en proposnt des mthodes push_front() et pop_ front()F illes sont ussi trs simples utiliserF v seule di0ult vient du fit que le premier lment possde toujours l9indie HF ves indies sont don dls hque jout en dut de dequeF
5inlude `dequeb GGxe ps oulier 3 5inlude `iostremb using nmespe stdY int min@A { deque`intb d@RDSAY GGne deque de R entiers vlnt S dFpushfront@PAY dFpushk@VAY GGyn joute le nomre P u dut GGit le nomre V l fin

for@int i@HAY i`dFsize@AY CCiA out `` di `` 4 4Y GGeffihe P S S S S V } return HY

it pour ien omprendre le toutD je vous propose un petit shm @(gure QRFIAF

Figure QRFI ! pontionnement d9une deque

SUH

LES SQUENCES ET LEURS ADAPTATEURS

Mme si l'on ajoute des lments au dbut d'une deque, l'indice du premier lment est toujours 0. Je vous l'ai dj dit mais je prfre vous viter des soucis avec votre compilateur.

fonD je rois que vous vez omprisF i vous vez survu ux premiers hpitres de e oursD tout el doit vous semler ien fileF

Les stack, une histoire de pile


v lsse stack est l premire struture de donnes un peu spile que vous renonE trezF g9est un onteneur qui n9utorise l9s qu9u dernier lment joutF in fitD il n9y que Q oprtions utorises X IF ejouter un lment Y PF gonsulter le dernier lment jout Y QF upprimer le dernier lment joutF gel se fit via les trois mthodes push()D top() et pop()F
Je ne comprends pas bien l'intrt d'un tel stockage !

in termes tehniquesD on prle de structure LIFO F ve dernier lment jout est le premier pouvoir tre tF gomme sur une pile d9ssiettes 3 ous ne pouvez der qu9 l dernire ssiette pose sur l pile @(gure QRFPAF gel permet d9e'etuer des tritements sur les donnes en ordre inverse de leur rrive dns l pileD omme pour les ssiettesF v dernire ssiette sle sur l pile est l premire tre lve lors que elle rrive en premier @et qui est don tout enEs de l pileA ser trite en dernierF n exemple plus informtique serit l gestion d9un stokF yn joute l pile le nomre d9rtiles vendus hque mois etD pour rer le iln trimestrielD on onsulte les trois derniers jouts sns s9ouper du resteF
1

5inlude `stkb 5inlude `iostremb using nmespe stdY int min@A { stk`intb pileY pileFpush@QAY pileFpush@RAY pileFpush@SAY
1.

GGne pile vide GGyn joute le nomre Q l pile

Last In First Out

SUI

CHAPITRE 34.

LES CONTENEURS

Figure QRFP ! ne pile d9lments @stackA


out `` pileFtop@A `` endlY GGyn onsulte le sommet de l pile @le nomre SA pileFpop@AY GGyn supprime le dernier lment jout @le nomre SA

out `` pileFtop@A `` endlY GGyn onsulte le sommet de l pile @le nomre RA } return HY

eutEtre urezEvous esoin de e genre de strutures un jourF epensez lors e hpitre 3

Les queue, une histoire de le


ves (les sont trs similires ux piles @et ps que pour leurs noms 3AF in termes tehE niquesD on prle de structure FIFO F v di'rene ii est que l9on ne peut der qu9u premier lment joutD extement omme dns une (le de supermrhF ves gens ttendent les uns derrire les utres et l issire trite les ourses de l premire personne rriveF und elle terminD elle s9oupe de l deuxime et insi de suite @(gure QRFQAF ve fontionnement est nlogue elui des pilesF v seule di'rene est qu9on utilise front() pour der e qui se trouve l9vnt de l (le u lieu de top()F
2

2.

First In First Out

SUP

LES SQUENCES ET LEURS ADAPTATEURS

Figure QRFQ ! ne (le @queueA

Les priority_queue, la n de l'galit


ves priority_queue sont des queue qui ordonnent leurs lmentsF n peu omme si les lients ve les plus gros pquets de ourses pssient vnt les gens ve seulement un ou deux rtilesF ves mthodes sont extement les mmes que dns le s des (les simplesF
5inlude `queueb GGettention 3 queue et priorityqueue sont dfinies dns le mme fihier 5inlude `iostremb using nmespe stdY int min@A { priorityqueue`intb fileY fileFpush@SAY fileFpush@VAY fileFpush@QAY out `` fileFtop@A `` endlY @le nomre VA } return HY GGeffihe le plus grnd des lments insrs

SUQ

CHAPITRE 34.

LES CONTENEURS

Les objets stocks dans une priority_queue doivent avoir un oprateur de comparaison (<) surcharg an de pouvoir tre classs !

yn utilise pr exemple e genre de struture pour grer des vnements selon leur prioritF ensez ux signux et slots de tF yn pourrit leur 'eter une vleur pour triter les vnements dns un ertin ordreF

Les list, voir plus tard


pinlementD le dernier onteneur sous forme de squene est l listeF gependntD pour les utiliser de mnire e0e il fut svoir mnipuler les itrteursD e que nous pE prendrons fire u prohin hpitreF he toute fonD je rois que je vous i ssez prl de squenes pour le momentF sl est temps de prler d9une tout utre mnire de rnger des ojetsF

Les tables associatives


tusqu9 mintenntD vous tes hitus der ux lments d9un onteneur en utilisnt les rohets []F hns un vector ou une dequeD les lments sont essiles via leur indexD un nomre entier positifF ge n9est ps toujours trs prtiqueF smginez un ditionnire X vous n9vez ps esoin de svoir que  nne est le VQPe mot pour der s d(nitionF ves tles ssoitives sont des strutures de donnes qui utorisent l9emploi de n9importe quel type omme indexF in termes tehniquesD on dit qu9une map est une tle ssoitive permettnt de stoker des pires lEvleurF gonrtementD el veut dire que vous pouvez rer un onteneur oD pr exempleD les indies sont des stringF gomme le type des indies peut vrierD il fut l9indiquer lors de l dlrtion de l9ojet X
5inlude `mpb 5inlude `stringb using nmespe stdY mp`stringD intb Y

ge ode dlre une tle ssoitive qui stoke des entiers mis dont les indies sont des hnes de rtresF yn peut lors der un lment via les rohets [] omme ei X
4slut4 a QY GGv se 4slut4 de l mp vut mintennt Q

i l se n9existe psD elle est utomtiquement reF yn peut utiliser e que l9on veut omme lF v seule ondition est que l9ojet utilis possde un oprteur de omprison  plusEpetitEque @<AF SUR

LES TABLES ASSOCIATIVES

eve e nouvel outilD on peut trs filement ompter le nomre d9ourrenes d9un mot dns un (hierF issyez pr vousEmme 9est un trs on exerieF ve prinipe est simpleF yn prourt le (hier et pour hque mot on inrmente l se orrespondnte dns l tle ssoitiveF oii m solution X
5inlude `mpb 5inlude `stringb 5inlude `fstremb using nmespe stdY int min@A { ifstrem fihier@4texteFtxt4AY string motY mp`stringD intb ourrenesY while@fihier bb motA GGyn lit le fihier mot pr mot { CCourrenesmotY GGyn inrmente le ompteur pour le mot lu } out `` 4ve mot 9nne9 est present 4 `` ourenes4nne4 `` 4 fois dns le fihier4 `` endlY return HY }

yn peut di0ilement fire plus ourt 3 our le moment en tout sF ves map ont un utre gros point fort X les lments sont tris selon leur lF hon si l9on prourt une map du dut l (nD on prourt les ls de l plus petite l plus grndeF ve prolme 9est queD pour prourir une tle ssoitive du dut l (nD il fut utiliser les itrteurs et don ttendre le prohin hpitreF

Les autres tables associatives


ves utres tles sont des vritions de l mapF ve prinipe de fontionnement de es onteneurs est trs similire mis D nouveuD il nous fut utiliser les itrteurs pour exploiter l pleine puissne de es strutures de donnesF te sens que vous llez ientt voir envie d9en svoir plus sur es drles de tesF F F in ttendntD je vis qund mme vous en dire quelques mots sur es utres strutures de donnesF ! ves set sont utiliss pour reprsenter les ensemlesF yn peut insrer des ojets dns l9ensemle et y der via une mthode de reherheF r ontreD il n9est ps possile d9y der via les rohetsF in fitD 9est omme si on vit une map o les ls et les lments tient onfondusF ! ves multiset et multimap sont des opies des set et map o hque l peut exister en plusieurs exempliresF yn reprler un peu de tout el mis es trois derniers onteneurs sont qund mme d9un usge plus rreF SUS

CHAPITRE 34.

LES CONTENEURS

Choisir le bon conteneur


v priniple di0ult ve l v est de hoisir le on onteneur 3 gomme dns l9exemple de l iliothque de livresD fire le muvis hoix peut voir des onsquenes dsstreuses en termes de performnesF it puisD tous les onteneurs n9o'rent ps les mmes serviesF evezEvous esoin d9der ux lments diretement c yu prfrezE vous les trier et n9der qu9 l9lment ve l plus grnde priorit c g9est e genre de questions qu9il fut rpondre pour fire le on hoixF it e n9est ps file 3 reureusementD je vis vous ider via un shm @(gure QRFRAF in suivnt les )hes et en rpondnt ux questions poses dns les losngesD on tome sur le onteneur le plus ppropriF

Figure QRFR ! ghoisir le on onteneur

eve elD ps moyen de se tromper 3 sl est videmment inutile d9pprendre e shm pr urF hez simplement qu9il existe et o le trouverF eu (nlD on utilise souvent des vectorF get outil de se permet de rsoudre ien des prolmes sns se poser trop de questionsF it on sort une map qund on esoin SUT

CHOISIR LE BON CONTENEUR

d9utiliser utre hose que des entiers pour indexer les lmentsF tiliser e shmD 9est le niveu suprieur mis hoisir le on onteneur peut devenir essentiel qund on herhe rer un progrmme vriment optimisF

En rsum
! v v propose de nomreux onteneursF sls sont tous optimiss pour des usges di'rentsF ! ves deque et vector permettent de stoker des ojets teEEte dns l mmoireF ! ves map et set sont utiliser si l9on souhite indexer les lments ontenus ve utre hose que des entiersF ! ghoisir le on onteneur est une the di0ileF hez que vector est le plus frE quemment utilisF ous pourrez toujours revenir sur votre dision pr l suite si vous vez esoin d9un onteneur plus dptF

SUU

CHAPITRE 34.

LES CONTENEURS

SUV

Chapitre

35
Dicult :

Itrateurs et foncteurs

u chapitre prcdent, vous avez pu vous familiariser un peu avec les dirents conteneurs de la STL. Vous avez appris ajouter des lments l'intrieur mais vous n'avez gure fait plus excitant. Vous avez d rester un peu sur votre faim. Il faut bien sr apprendre parcourir les conteneurs et appliquer des traitements aux lments. Pour ce faire, nous allons avoir besoin de deux notions, les itrateurs et les foncteurs. Les itrateurs sont des objets ressemblant aux pointeurs, qui vont nous permettre de parcourir les conteneurs. L'intrt de ces objets est qu'on les utilise de la mme manire quel que soit le conteneur ! Pas besoin de faire de distinction entre les vector, les map ou les list. Vous allez voir, c'est magique. Les foncteurs, quant eux, sont des objets que l'on utilise comme fonction. Nous allons alors pouvoir appliquer ces fonctions tous les lments d'un conteneur par exemple.

SUW

CHAPITRE 35.

ITRATEURS ET FONCTEURS

Itrateurs : des pointeurs boosts


hns les premiers hpitres de e oursD nous vions vu que les pointeurs peuvent tre ssimils des )hes pointnt sur les ses de l mmoire de l9ordinteurF ge n9est ien sr qu9une imge mis elle v nous ider pr l suiteF n onteneur est un ojet ontennt des lmentsD un peu omme l mmoire ontient des vrilesF ves onepteurs de l v ont don eu l9ide de rer des pointeurs spiux pour se dpler dns les onteneurs omme le ferit un pointeur dns l mmoireF ges pointeurs spiux s9ppellent des itrateursF
Les itrateurs sont en ralit des objets plutt complexes et non de simples pointeurs.

v9vntge de ette mnire de fire est qu9elle rutilise quelque hose que l9on onnt ienF yn peut dpler l9itrteur en utilisnt les oprteurs ++ et --D omme on pourE rit le fire pour un pointeurF wis l9nlogie ne s9rrte ps l X on de l9lment point @ou itrA via l9toile *F frefD el nous rppelle de vieux souvenirsF hu moins j9espre 3

Dclarer un itrateur. . .
ghque onteneur possde son propre type d9itrteur mis l mnire de les dlrer est toujours l mmeF gomme toujoursD il fut un type et un nomF ghoisir un nomD 9est votre prolme misD pour le typeD je vis vous iderF sl fut indiquer le type du onteneurD suivi de l9oprteur :: et du mot iteratorF r exempleD pour un itrteur sur un vector d9entiersD on X
5inlude `vetorb using nmespe stdY vetor`intb tleu@SDRAY vetor`intbXXitertor itY GGn tleu de S entiers vlnt R GGn itrteur sur un vetor d9entiers

oii enore quelques exemples X


mp`stringD intbXXitertor itIY GGn itrteur sur les tles ssoitives stringEint deque`hrbXXitertor itPY GGn itrteur sur une deque de rtres list`doulebXXitertor itQY GGn itrteur sur une liste de nomres virgule

fonF te rois que vous vez omprisF SVH

ITRATEURS : DES POINTEURS BOOSTS

. . . et itrer
sl ne nous reste plus qu9 les utiliserF ous les onteneurs possdent une mthode begin() renvoynt un itrteur sur le premier lment ontenuF yn peut insi fire pointer l9itrteur sur le premier lmentF yn vne lors dns le onteneur en utilisnt l9oprteur ++F sl ne nous reste plus qu9 spi(er une ondition d9rrtF yn ne veut ps ller en dehors du onteneurF our viter elD les onteneurs possdent une mthode end() renvoynt un itrteur sur l (n du onteneurF
En ralit, end() renvoie un itrateur sur un lment en dehors du conteneur. Il faut donc itrer jusqu' end() exclu.

yn peut don prourir un onteneur en itrnt dessus depuis begin() jusqu9 end()F oyons el ve un exemple X
5inlude`dequeb 5inlude `iostremb using nmespe stdY int min@A { deque`intb d@SDTAY GGne deque de S lments vlnt T deque`intbXXitertor itY GGn itrteur sur une deque d9entiers GGit on itre sur l deque for@it a dFegin@AY it3adFend@AY CCitA { out `` Bit `` endlY GGyn de l9lment point vi l9toile } return HY

Les itrateurs ne sont pas optimiss pour l'oprateur de comparaison. On ne devrait donc pas crire it<d.end() comme on en a l'habitude avec les index de tableau. Utiliser != est plus ecace.

imple non c i vous vez im les pointeurs D vous llez dorer les itrteursF our les vector et les dequeD el peut vous semler inutile X on peut fire ussi ien ve les rohets []F wis pour les map et surtout les listD e n9est ps vri X les itrteurs sont le seul moyen que nous vons de les prourirF
1

1. Si tant est que ce soit possible !

SVI

CHAPITRE 35.

ITRATEURS ET FONCTEURS

Des mthodes uniquement pour les itrateurs


wme pour les vector ou dequeD il existe des mthodes qui nessitent l9emploi d9itrE teursF sl s9git en prtiulier des mthodes insert() et erase() quiD omme leur nom l9indiqueD permettent d9jouter ou supprimer un lment u milieu d9un onteneurF tusqu9 mintenntD vous ne pouviez qu9jouter des lments l (n d9un onteneurD jmis u milieuF v rison en est simple X pour jouter quelque hose u milieuD il fut indiquer o l9on souhite insrer l9lmentF it elD 9est justement le ut d9un itrteurF n exemple vut mieux qu9un long disoursF
5inlude `vetorb 5inlude `stringb 5inlude `iostremb using nmespe stdY int min@A { vetor`stringb tY

GGn tleu de mots

tFpushk@4les4AY GGyn joute deux mots dns le tleu tFpushk@4eros4AY tFinsert@tFegin@AD 4lut4AY GGyn insre le mot 4lut4 u dut GGeffihe les mots don l hne 4lut les eros4 for@vetor`stringbXXitertor itatFegin@AY it3atFend@AY CCitA { out `` Bit `` 4 4Y } tFerse@tFegin@AAY GGyn supprime le premier mot GGeffihe les mots don l hne 4les eros4 for@vetor`stringbXXitertor itatFegin@AY it3atFend@AY CCitA { out `` Bit `` 4 4Y } } return HY

it 9est l mme hose pour tous les types de onteneursF i vous vez un itrteur sur un lmentD vous pouvez le supprimer via erase() ou jouter un lment juste prs gre insert()F SVP

ITRATEURS : DES POINTEURS BOOSTS

Souvenez-vous quand mme que les vector ne sont pas optimiss pour l'insertion et la suppression au milieu. Le schma du chapitre prcdent vous aidera faire un meilleur choix si vous avez vraiment besoin de raliser ce genre de modications sur votre conteneur.

te vous vis dit que vous lliez dorer e hpitre 3 it el ne fit que ommenerF

Les dirents itrateurs


erminons qund mme ve quelques spets un petit peu plus tehniquesF sl existe en rlit inq sortes d9itrteursF vorsque l9on dlre un vector::iterator ou un map::iteratorD on dlre en rlit un ojet d9une de es inq tgoriesF gel inE tervient via une red(nition de typeD hose que nous verrons dns l inquime prtie de e oursF rmi les inq types d9itrteursD seuls deux sont utiliss pour les onteE neurs X les bidirectional iterators et les random access iteratorsF oyons e qu9ils nous proposentF
Les bidirectional iterators

ge sont les plus simples des deuxF Bidirectional iterator signi(e itrteur idiretionE nelD mis el ne nous vne ps euoupF F F ge sont des itrteurs qui permettent d9vner et de reuler sur le onteneurF gel veut dire que vous pouvez utiliser ussi ien ++ que F v9importnt tnt que l9on ne peut vner que d9un seul lment l foisF hon pour der u sixime lment d9un onteneurD il fut prtir de l position begin() puis ppeler inq fois l9oprteur ++F ge sont les itrteurs utiliss pour les listD set et mapF yn ne peut don ps utiliser es itrteurs pour der diretement u milieu d9un de es onteneursF
Les random access iterators

eu vu du nomD vous vous en doutez peutEtreD es itrteurs permettent d9der u hsrdD e qui dns un meilleur frnis veut dire que l9on peut der diretement u milieu d9un onteneurF ehniquementD es itrteurs proposent en plus de ++ et  des oprteurs + et - permettnt d9vner de plusieurs lments d9un oupF r exemple pour der u huitime lment d9un vectorD on peut utiliser l syntxe suivnte X
vetor`intb t@IHHDPAY GGn tleu de IHH entiers vlnt P vetor`intbXXitertor it a tFegin@A C UY GGn itrteur sur le Vme lment

in plus des vectorD es itrteurs sont eux utiliss pr les dequeF ve mnisme ext des itrteurs est trs ompliquD 9est pour el que je ne vous prsente que les lments qui vous seront rellement nessires dns l suiteF voir que SVQ

CHAPITRE 35.

ITRATEURS ET FONCTEURS

ertins itrteurs sont plus limits que d9utres nous ser utile u prohin hpitre puisque ertins lgorithmes ne sont utilisles qu9ve des random access iteratorsF

La pleine puissance des list et map


te ne vous i ps enore prl des listes hnes de type listF g9est un onteneur ssez di'rent de e que vous onnissezF ves lments ne sont ps rngs les uns t des utres dns l mmoireF ghque  se ontient un lment et un pointeur sur l se suivnteD situe illeurs dns l mmoireD omme illustr l (gure QSFIF

Figure QSFI ! ne liste hne @listA

v9vntge de ette struture de donnes est que l9on peut filement jouter des lE ments u milieuF sl n9est ps nessire de dler toute l suite omme dns l9exemple de l iliothque du hpitre prdentF wis @il y toujours un misA on ne peut ps diretement der une se donneF F F tout simplement pre qu9on ne sit ps o elle se trouve dns l mmoireF yn est olig de suivre toute l hne des lmentsF our ller l huitime seD il fut ller l premire seD suivre le pointeur jusqu9 l deuximeD suivre le pointeur jusqu9 l troisime et insi de suite jusqu9 l huitimeF g9est don trs oteuxF sser de se en seD dns l9ordreD est une mission prfite pour les itrteursF it puisD il n9y ps d9oprteur [] pour les listesF yn n9 don ps le hoix 3 v9vntge 9est que tout se psse omme pour les utres onteneursF g9est elD l mgie des itrteursF yn n9 ps esoin de onntre les spi(its du onteneur pour itrer dessusF
5inlude `listb 5inlude `iostremb using nmespe stdY int min@A {

SVR

LA PLEINE PUISSANCE DES

LIST

ET

MAP

list`intb listeY listeFpushk@SAY listeFpushk@VAY listeFpushk@UAY

GGne liste d9entiers GGyn joute un entier dns l liste GGit un deuxime GGit enore un 3

GGyn itre sur l liste for@list`intbXXitertor it a listeFegin@AY it3alisteFend@AY CCitA { out `` Bit `` endlY } return HY

uper non c

La mme chose pour les map


v struture interne des map est enore plus omplique que elle des listF illes utiE lisent e qu9on ppelle des rres inires et se dpler dns un tel rre peut vite devenir un vri sseEtteF qre ux itrteursD e n9est ps vous de vous prouE per de tout elF ous utilisez simplement les oprteurs ++ et  et l9itrteur sute d9lment en lmentF outes les oprtions omplexes sont msques l9utilisteurF sl y juste une petite sutilit ve les tles ssoitivesF ghque lment est en rlit onstitu d9une l et d9une vleurF n itrteur ne peut pointer que sur une seule hose l foisF sl y don a priori un prolmeF ien de grve je vous rssureF ves itrteurs pointent en rlit sur des pairF ge sont des ojets ve deux ttriuts pulis ppels first et secondF ves pair sont dlres dns le (hier d9enEtte utilityF sl est ependnt trs rre de devoir utiliser diretement e (hier puisqu9il est inlus pr presque tous les utresF grons qund mme une pireD simplement pour essyerF
5inlude `utilityb 5inlude `iostremb using nmespe stdY int min@A { pir`intD douleb p@PD QFIRAY GGne pire ontennt un entier vlnt P et un nomre virgule vlnt QFIR out `` 4v pire vut @4 `` pFfirst `` 4D 4 `` pFseond `` 4A4 `` endlY } return HY

it 9est tout 3 yn ne peut rien fire d9utre ve une pireF illes servent juste ontenir deux ojetsF SVS

CHAPITRE 35.

ITRATEURS ET FONCTEURS

Les deux attributs sont publics. Cela peut vous sembler bizarre puisque je vous ai conseill de toujours dclarer vos attributs dans la partie prive de la classe. Les pair sont l uniquement pour contenir deux variables d'un coup. La classe ne contient donc ni mthode, ni rien d'autre. C'est juste un outil trs basique et on n'a pas envie de s'embter avec des mthodes get() et set(). C'est pour cela que les attributs sont publics.

hns une mapD les ojets stoks sont en rlit des pairF our hque pireD l9ttriut first orrespond l l lors que second est l vleurF te vous i dit u hpitre prdent que les map triient leurs lments selon leurs lsF xous llons mintennt pouvoir le vri(er filementF
5inlude `iostremb 5inlude `stringb 5inlude `mpb using nmespe stdY int min@A { mp`stringD douleb poidsY GGne tle qui ssoie le nom d9un niml son poids GGyn joute les poids de quelques nimux poids4souris4 a HFHSY poids4tigre4 a PHHY poids4ht4 a QY poids4elephnt4 a IHHHHY GGit on prourt l tle en ffihnt le nom et le poids for@mp`stringD doulebXXitertor itapoidsFegin@AY it3apoidsFend@AY CCitA { out `` itEbfirst `` 4 pese 4 `` itEbseond `` 4 kgF4 `` endlY } return HY

i vous testezD vous verrez que les nimux sont 0hs pr ordre lphtiqueD mme si on les insrs dns un tout utre ordre X
ht pese Q kgF elephnt pese IHHHH kgF souris pese HFHS kgF tigre pese PHH kgF

La map utilise l'oprateur < de la classe string pour trier ses lments. Nous verrons dans la suite comment changer ce comportement.

SVT

FONCTEUR : LA VERSION OBJET DES FONCTIONS

ves itrteurs sont ussi utiles pour reherher quelque hose dns une tle ssoitiveF v9oprteur [] permet d9der un lment donn mis il un  dfut F i l9lment n9existe psD l9oprteur [] le reF yn ne peut ps l9utiliser pour svoir si un lment donn est dj prsent dns l tle ou psF g9est pour plier e prolme que les map proposent une mthode find() qui renvoie un itrteur sur l9lment reherhF i l9lment n9existe psD elle renvoie simplement end()F ri(er si une l existe dj dns une tle est don trs simpleF eprenons l tle de l9exemple prdent et vri(ons si le poids d9un chien s9y trouveF
int min@A { mp`stringD douleb poidsY GGne tle qui ssoie le nom d9un niml son poids GGyn joute les poids de quelques nimux poids4souris4 a HFHSY poids4tigre4 a PHHY poids4ht4 a QY poids4elephnt4 a IHHHHY mp`stringD doulebXXitertor trouve a poidsFfind@4hien4AY if@trouve aa poidsFend@AA { out `` 4ve poids du hien n9est ps dns l tle4 `` endlY } else { out `` 4ve hien pese 4 `` trouveEbseond `` 4 kgF4 `` endlY } return HY

te rois ne ps voir esoin d9en dire plusF te sens que vous tes dj des fns des itrteursF

Foncteur : la version objet des fonctions


i vous suivez un ours d9informtique l9universitD on vous dir que les itrteurs sont des strtions des pointeurs et que les fonteurs sont des strtions des fontionsF it gnrlementD le ours v s9rrter lF te pourris fire de mme et vous lisser vous drouiller ve un ou deux exemples mis je ne pense ps que vous seriez trs heureuxF ge que l9on imerit fireD 9est ppliquer des hngements sur des onteneursD pr exemple prendre un tleu de lettres et toutes les onvertir en mjusuleF yu prendre une liste de nomres et jouter S tous les nomres pirsF frefD on imerit ppliquer une fontion sur tous les lments d9un onteneurF ve prolmeD 9est qu9il fudrit SVU

CHAPITRE 35.

ITRATEURS ET FONCTEURS

pouvoir psser ette fontion en rgument d9une mthode du onteneurF it elD on ne sit ps le fireF yn ne peut psser que des ojets en rgument et ps des fontionsF
Techniquement, ce n'est pas vrai. Il existe des pointeurs sur des fonctions et l'on pourrait utiliser ces pointeurs pour rsoudre ce problme. Les foncteurs sont par contre plus simples d'utilisation et orent plus de possibilits.

ves fonteurs sont des ojets possdnt une surhrge de l9oprteur ()F sls peuvent insi gir omme une fontion mis tre psss en rgument une mthode ou une utre fontionF

Crer un foncteur
n fonteur est une lsse possdnt si nessire des ttriuts et des mthodesF wisD en plus de elD elle doit proposer un oprteur () qui e'etue l9oprtion que l9on souE hiteF gommenons ve un exemple simpleD un fonteur qui dditionne deux entiersF
lss eddition{ puliX int opertor@A@int D int A { return CY } GGv surhrge de l9oprteur @A

}Y

gette lsse ne possde ps d9ttriut et juste une mthodeD l fmeuse surhrge de l9oprteur ()F gomme il n9y ps d9ttriut et rien de spil e'etuerD le onstruteur gnr pr le ompilteur est lrgement su0sntF
Vous aurez reconnu la syntaxe habituelle pour les oprateurs : le mot operator suivi de l'oprateur que l'on veut, ici les parenthses. La particularit de cet oprateur est qu'il peut prendre autant d'arguments que l'on veut, au contraire de tous les autres qui ont un nombre d'arguments x.

yn peut lors utiliser e fonteur pour dditionner deux nomres X


5inlude `iostremb using nmespe stdY int min@A { eddition fonteurY int @PAD @QAY out `` `` 4 C 4 `` `` 4 a 4 `` fonteur@DA `` endlY GGyn utilise le fonteur omme s9il s9gissit d9une fontion

SVV

FONCTEUR : LA VERSION OBJET DES FONCTIONS

return HY

ge ode donne ien videmment le rsultt esompt X


P C Q a S

it l9on peut ien sr rer tout e que l9on veut omme fonteurF r exempleD un fonteur joutnt S ux nomres pirs peut tre rit omme suit X
lss ejout{ puliX int opertor@A@int A { if@7P aa HA return CSY else return Y } GGv surhrge de l9oprteur @A

}Y

ien de neufD en somme 3

Des foncteurs volutifs


ves fonteurs sont des ojetsF sls peuvent don utiliser des ttriuts omme n9importe quelle utre lsseF gel nous permet en quelque sorte de rer une fontion ve une mmoireF ille pourr don e'etuer une oprtion di'rente hque ppelF te pense qu9un exemple ser plus prlntF
lss emplir{ puliX emplir@int iA Xmvleur@iA {} int opertor@A@A { CCmvleurY return mvleurY } privteX int mvleurY }Y

SVW

CHAPITRE 35.

ITRATEURS ET FONCTEURS

v premire hose remrquer est que notre fonteur possde un onstruteurF on ut est simplement d9initiliser orretement l9ttriut m_valeurF v9oprteur prenthse renvoie simplement l vleur de et ttriutD mis e n9est ps toutF sl inrmente et ttriut hque ppelF xotre fonteur renvoie don une vleur di'rente hque ppel 3 yn peut pr exemple l9utiliser pour remplir un vector ve les nomres de I IHHF te vous lisse essyerF fonD omme 9est enore une notion rente pour vousD je vous propose qund mme une solution X
int min@A { vetor`intb t@IHHDHAY GGn tleu de IHH ses vlnt toutes H emplir f@HAY for@vetor`intbXXitertor itatFegin@AY it3atFend@AY CCitA { Bit a f@AY GGyn ppelle simplement le fonteur sur hun des lments du tleu } } return HY

gei n9est ien sr qu9un exemple tout simpleF yn peut rer des fonteurs ve euE oup d9ttriuts et des omportement ien plus omplexesF yn peut ussi jouter d9utres mthodes pour rinitiliser m_valeurD pr exempleF gomme e sont des oE jetsD tout e que vous svez leur sujet reste vlle 3
Si vous connaissez le C, vous aurez peut-tre pens au mot-cl static qui autorise le mme genre de choses pour les fonctions normales. Le foncteur avec des attributs constitue l'quivalent, en C++, de cette technique.

Les prdicats
te sens que vous tes un peu e'rys pr e nouveu nom rreF g9est vri que e hpitre prsente euoup de notions nouvelles et qu9il fut un peu de temps pour tout ssimilerF ien de ien ompliqu iiD je vous rssureF ves prdits sont des fonteurs un peu prtiuliersF ge sont des fonteurs prennt un seul argument et renvoynt un boolenF sls servent tester une proprit prtiulire de l9ojet pss en rgumentF yn les utilise pour rpondre des questions omme X ! ge nomre estEil plus grnd que IH c ! gette hne de rtres ontientEelle des voyelles c SWH

FONCTEUR : LA VERSION OBJET DES FONCTIONS

! ge Personnage estEil enore vivnt c ges prdits seront trs utiles dns l suiteF xous verrons u prohin hpitre omE ment supprimer des ojets qui vri(ent une ertine propritD et 9est ien sr un fonteur de e genre qu9il fudr utiliser 3 oyons qund mme un petit ode vnt d9ller plus loinF renons le s d9un prdit qui teste si une hne de rtres ontient des voyellesF
lss estoyelles { puliX ool opertor@A@string onst8 hineA onst { for@int i@HAY i`hineFsize@AY CCiA { swith @hineiA GGyn teste les lettres une une { se 99X GGi 9est une voyelle se 9e9X se 9i9X se 9o9X se 9u9X se 9y9X return trueY GGyn renvoie 9true9 defultX rekY GGinonD on ontinue } } return flseY GGi on rrive lD 9est qu9il n9y vit ps de voyelle du tout } }Y

Nous verrons dans la suite comment crire cela de manire plus simple !

erminons ette setion en jetnt un oup d9il quelques fonteurs prEd(nis dns l vF ih ouiD il y en mme pour les finnts 3

Les foncteurs pr-dnis


our les oprtions les plus simplesD le trvil est prEmhF out se trouve dns le (hier d9enEtte functionalF te ne vis ependnt ps vous prsenter ii tout e qui s9y trouveF te vous propose de fire un tour dns l doumenttion F
2

2. Ce sera l'occasion de vous habituer la lire !

SWI

CHAPITRE 35.

ITRATEURS ET FONCTEURS

renons tout de mme un exempleF ve premier fonteur que je vous i prsent prenit omme rguments deux entiers et renvoyit l somme de es nomresF v v propose un fonteur nomm plus @quelle originlitA pour fire elF
5inlude `iostremb 5inlude `funtionlb using nmespe stdY GGxe ps oulier 3

int min@A { plus`intb fonteurY GGyn dlre le fonteur dditionnnt deux entiers int @PAD @QAY out `` `` 4 C 4 `` `` 4 a 4 `` fonteur@DA `` endlY GGyn utilise le fonteur omme s9il s9gissit d9une fontion return HY }

gomme pour les onteneursD il fut indiquer le type souhit entre les hevronsF in utilisnt es fonteurs prEd(nisD on s9onomise un peu de trvilF oyons (nlement omment utiliser es fonteurs ve des onteneursF

Fusion des deux concepts


ves fonteurs sont u ur de l vF sls sont trs utiliss dns les lgorithmes que nous verrons u prohin hpitreF our l9instntD nous llons modi(er le ritre de tri des map gre un fonteurF

Modier le comportement d'une map


ve onstruteur de l lsse map prend en rlit un rgument X le fonteur de ompriE son entre les lsF r dfutD si l9on ne spi(e rienD 9est un fonteur onstruit prtir de l9oprteur < qui sert de omprisonF v map que nous vons utilise prdemment utilisit e fonteur pr dfutF v9oprteur < pour les string ompre les hnes pr ordre lphtiqueF ghngeons e omportement pour utiliser une omprison des longueursF te vous lisse essyer d9rire un fonteur omprnt l longueur de deux stringF oii m solution X
5inlude `stringb using nmespe stdY lss gomprevongueur { puliX ool opertor@A@onst string8 D onst string8 A

SWP

FUSION DES DEUX CONCEPTS

{ }Y }

return Flength@A ` Flength@AY

te pense que vous vez rit quelque hose de similireF sl ne reste mintennt plus qu9 indiquer notre map que nous voulons utiliser e fonteurF
int min@A { GGne tle qui ssoie le nom d9un niml son poids mp`stringD douleDgomprevongueurb poidsY GGyn utilise le fonteur omme ritre de omprison GGyn joute les poids de quelques nimux poids4souris4 a HFHSY poids4tigre4 a PHHY poids4ht4 a QY poids4elephnt4 a IHHHHY GGit on prourt l tle en ffihnt le nom et le poids for@mp`stringD doulebXXitertor itapoidsFegin@AY it3apoidsFend@AY CCitA { out `` itEbfirst `` 4 pese 4 `` itEbseond `` 4 kgF4 `` endlY } return HY

it e progrmme donne le rsultt suivnt X


ht pese Q kgF tigre pese PHH kgF souris pese HFHS kgF elephnt pese IHHHH kgF

ves nimux ont t tris suivnt l longueur de leur nomF ghnger le omportement d9un onteneur est don une oprtion trs simple rliserF

Rcapitulatif des conteneurs les plus courants


eu prohin hpitreD nous llons utiliser plusieurs onteneurs di'rents et omme tout el est enore un peu nouveu pour vousD voii un petit rpitultif des S onteneurs les plus ourntsF SWQ

CHAPITRE 35.

ITRATEURS ET FONCTEURS

vector

ixemple X vector<int> ! lments stoks teEEte Y ! optimis pour l9jout en (n de tleu Y ! lments indexs pr des entiersF

Figure QSFP ! vector


deque

ixemple X deque<int> ! lments stoks teEEte Y ! optimis pour l9jout en dut et en (n de tleu Y ! lments indexs pr des entiersF

Figure QSFQ ! deque


list

ixemple X list<int> ! lments stoks de mnire  ltoire dns l mmoire Y ! ne se prourt qu9ve des itrteurs Y ! optimis pour l9insertion et l suppression u milieuF
map

ixemple X map<string,int> ! lments indexs pr e que l9on veut Y SWR

FUSION DES DEUX CONCEPTS

Figure QSFR ! list

! lments tris selon leurs index Y ! ne se prourt qu9ve des itrteursF

Figure QSFS ! map


set

ixemple X set<int> ! lments tris Y ! ne se prourt qu9ve des itrteursF

Figure QSFT ! set

SWS

CHAPITRE 35.

ITRATEURS ET FONCTEURS

En rsum
! ves itrteurs sont ssimilles des pointeurs limits un onteneurF ! yn utilise les oprteurs ++ et  pour les dpler et l9oprteur * pour der l9lment pointF ! ves fonteurs sont des lsses qui surhrgent l9oprteur ()F yn les utilise omme des fontionsF ! v v utilise euoup les fonteurs pour modi(er le omportement de ses onteE neursF

SWT

Chapitre

36
Dicult :

La puissance des algorithmes

ous avons dcouvert les itrateurs qui nous permettent de parcourir des conteneurs, comme les vector. Dans ce chapitre, nous allons dcouvrir les algorithmes de la STL, des fonctions qui nous permettent d'eectuer des modications sur les conteneurs. Cela fait un moment que je vous parle de modications mais qu'est-ce que cela veut dire ? Eh bien, par exemple on peut trier un tableau, supprimer les doublons, inverser une slection, chercher, remplacer ou supprimer des lments, etc. Certains de ces algorithmes sont simples crire et vous ne voyez peut-tre pas l'intrt d'utiliser des fonctions toutes faites. L'avantage d'utiliser les algorithmes de la STL est qu'il n'y a pas besoin de rchir pour crire ces fonctions. Il n'y a qu' utiliser ce qui existe dj. De plus, ces fonctions sont extrmement optimises. En bref, ne rinventez pas la roue et utilisez les algorithmes !

SWU

CHAPITRE 36.

LA PUISSANCE DES ALGORITHMES

Il est ncessaire d'avoir bien compris le chapitre prcdent, notamment les itrateurs et les foncteurs. Nous allons en utiliser beaucoup dans ce qui suit.

Un premier exemple
te vous prviens tout de suiteD nous n9llons ps tudier tous les lgorithmes proposs pr l vF sl y en une soixntine et ils ne sont ps tous trs utilesF it puisD qund vous urez ompris le prinipeD vous surez vous drouiller seulsF v premire hose fire estD omme toujoursD l9inlusion du on enEtteF hns notre sD il s9git du (hier algorithmF it royezEmoiD vous llez souvent en voir esoin prtir de mintenntF

Un dbut en douceur
eu hpitre prdentD nous vions r un fonteur nomm Remplir et nous l9vons ppliqu tous les lments d9un vectorF xous utilisions pour el une oule for qui prourit les lments du tleu de l position begin() l position end()F ve plus simple des lgorithmes s9ppelle generate et il fit extement l mme hoseD mis de fon plus optimiseF sl ppelle un fonteur sur tous les lments situs entre deux itrteursF qre et lgorithmeD notre ode de remplissge de tleu devient euoup plus ourt X
5inlude `lgorithmb 5inlude `vetorb using nmespe stdY GGhfinition de emplirFFF int min@A { vetor`intb t@IHHDHAY GGn tleu de IHH ses vlnt toutes H emplir f@HAY generte@tFegin@AD tFend@AD fAY GGyn pplique f tout e qui se trouve entre egin@A et end@A } return HY

ge ode l9vntge d9tre en plus trs simple omprendreF i vous prlez l lngue de hkespereD vous urez ompris que  to generte signi(e  gnrer F v ligne mise en videne se lit don de l mnire suivnte X Gnre, grce au foncteur f, tous SWV

UN PREMIER EXEMPLE

les lments situs entre tab.begin() et tab.end().

lir 3

yn peut di0ilement fire plus

Mais pourquoi doit-on utiliser des itrateurs ? Pourquoi la fonction generate() ne prend-elle pas comme premier argument le vector ?

ixellente question 3 te vois que vous suivezF sl serit ien plus simple de pouvoir rire quelque hose omme generate(tab, f) l ple des itrteursF yn s9viterit toute l thorie sur les itrteurs 3 in fitD 9est une fusse onne ide de proder insiF smginez que vous ne vouliez ppliquer votre fonteur qu9ux dix premiers lments du tleu et ps u tleu entierF gomment feriezEvous ve votre tehnique c ge ne serit tout simplement ps possileF v9vntge des itrteurs est lir dns e s X on peut se restreindre une portion d9un onteneurF enezD pour remplir seulement les IH premires sesD on ferit ei X
int min@A { vetor`intb t@IHHDHAY GGn tleu de IHH ses vlnt toutes H emplir f@HAY generte@tFegin@AD tFegin@ACIHD fAY GGyn pplique f ux IH premires ses generte@tFend@AESD tFend@AD fAY GGit ux S dernires } return HY

lutt symp non c in fitD 9est une proprit importnte des lgorithmesD ils s9utilisent toujours sur une plge d9lments situs entre deux itrteursF

Application aux autres conteneurs


eutre vntge de l9utilistion des itrteurs X ils existent pour tous les onteneursF yn peut don utiliser les lgorithmes sur tous les types de onteneurs ou presqueF sl existe qund mme quelques restritions selon que les itrteurs sont ltoires ou idiretionnels omme on l9 vu u hpitre prdentF r exempleD nous pouvons tout fit utiliser notre fonteur sur un set<int>F
int min@A { set`intb tY GGn ensemle d9entiers GGuelques mnipultions pour rer des lmentsFFF

SWW

CHAPITRE 36.

LA PUISSANCE DES ALGORITHMES

emplir f@HAY generte@tFegin@AD tFend@AD fAY GGyn pplique f ux lments de l9ensemle } return HY

v syntxe est stritement identique 3 sl su0t don de omprendre une fois le fontionE nement de tout ei pour pouvoir e'etuer des mnipultions omplexes sur n9importe quel type de onteneur 3
Il faut quand mme que le foncteur corresponde au type contenu. On ne peut bien sr pas utiliser un foncteur manipulant des string sur une deque de nombres virgule. Il faut rester raisonnable. Le compilateur gnre parfois des erreurs trs diciles interprter quand on se trompe avec la STL. Soyez donc vigilants.

Compter, chercher, trier


fonD plongeonsEnous un peu plus en vnt dns l doumenttion de l9enEtte algorithmF gommenons pr quelques fontions de omptgeF

Compter des lments


gompter des lments est une oprtion trs file rliserF tiliser l v peut nouveu vous semler super)uD moi je trouve que el rend le ode plus lir et peutEtre mme plus optimis dns ertins sF our ompter le nomre d9lments gux une vleur donneD on utilise l9lgorithme count F our ompter le nomre d9lments gux u nomre PD 9est trs simple X
1

int nomre a ount@tFegin@AD tFend@AD PAY

it ien srD tab est le onteneur de votre hoixF it voilD vous svez tout 3 in tout s pour et lgorithmeF F F evnt d9ller plus loinD fisons un petit exerie pour rpituler tout e que nous svons sur les fonteursD generate() et count()F issyez d9rire un progrmme qui gnre un tleu de IHH nomres ltoires entre H et W puis qui ompte le nomre de S gnrsF out ei en utilisnt u mximum l v ien sr 3 vos lviers 3 ous vez russi c oii une solution possile X
1. Oui, tre anglophone aide beaucoup en programmation. Mais je crois que vous l'avez compris !

THH

COMPTER, CHERCHER, TRIER

5inlude `iostremb 5inlude `stdlib GGpour rnd@A 5inlude `timeb GGpour time@A 5inlude `vetorb 5inlude `lgorithmb using nmespe stdY lss qenerer { puliX int opertor@A@A onst { return rnd@A 7 IHY } }Y int min@A { srnd@time@HAAY vetor`intb t@IHHDEIAY GGn tleu de IHH ses generte@tFegin@AD tFend@AD qenerer@AAY ltoires GGyn gnre les nomres

GGyn renvoie un nomre entre H et W

int onst ompteur a ount@tFegin@AD tFend@AD SAY GGit on ompte les ourrenes du S out `` 4sl y 4 `` ompteur `` 4 elements vlnt SF4 `` endlY } return HY

ersonnellementD je trouve e ode trs lirF yn voit rpidement e qui se psseF outes les oules nessires sont hes dns les fontions de l vF s esoin de s9ennuyer devoir tout rire soiEmmeF

Le retour des prdicats


i vous pensiez que vous pourriez vous en sortir sns es drles de fonteursD vous vous trompiez 3 te vous vis dit u hpitre prdent que l9on utilisit des prdits pour tester une proprit des lmentsF yn pourrit don utiliser un prdit pour ne ompter que les lments qui pssent un ertin testF it si je vous en prleD 9est qu9un tel lgorithme existeF sl s9ppelle count_if()F v di'rene ve count() est que le troisime rgument n9est ps une vleur mis un prditF eu hpitre prdentD nous vions rit un prdit qui testit si une hne de rE tres ontenit des voyelles ou nonF issyonsEle 3 THI

CHAPITRE 36.

LA PUISSANCE DES ALGORITHMES

5inlude `lgorithmb 5inlude `stringb 5inlude `vetorb using nmespe stdY lss estoyelles { puliX ool opertor@A@string onst8 hineA onst { for@int i@HAY i`hineFsize@AY CCiA { swith @hineiA GGyn teste les lettres une une { se 99X GGi 9est une voyelle se 9e9X se 9i9X se 9o9X se 9u9X se 9y9X return trueY GGyn renvoie 9true9 defultX rekY GGinonD on ontinue } } return flseY GGi on rrive lD 9est qu9il n9y vit ps de voyelle du tout } }Y int min@A { vetor`stringb tleuY GGFFF yn remplit le tleu en lisnt un fihierD pr exempleF int onst ompteur a ountif@tleuFegin@AD tleuFend@AD estoyelles@A AY GGFFF it on fit quelque hose ve 9ompteur9 } return HY

oil qui est vriment puissnt 3 ve prdit TestVoyelles s9tive sur hun des lments du tleu et count_if indique omien de fois le prdit renvoy  vri F yn sit insi omien il y de hnes ontennt des voyelles dns le tleuF THP

COMPTER, CHERCHER, TRIER

Chercher
gherher un lment dns un tleu est ussi trs fileF yn utilise l9lgorithme find() ou find_if()F sls s9utilisent extement omme les lgorithmes de omptgeD l seule di'rene est leur type de retour X ils renvoient un itrteur sur l9lment trouv ou sur end() si l9ojet herh n9 ps t trouvF our herher l lettre a dns une deque de charD on fer quelque hose omme X
5inlude `dequeb 5inlude `lgorithmb 5inlude `iostremb using nmespe stdY int min@A { deque`hrb lettresY GGyn remplit l dequeFFF ve generte@A pr exemple 3 deque`hrbXXitertor trouve a find@lettresFegin@AD lettresFend@AD 99AY if@trouve aa lettresFend@AA out `` 4v lettre 99 n9 ps ete trouvee4 `` endlY else out `` 4v lettre 99 ete trouvee4 `` endlY } return HY

it je ne vous fis ps l9'ront de vous montrer l version qui utilise un prditF te suis onvinu que vous surez vous drouillerF uisque l9on prle de reherhe d9lmentsD je vous signle juste l9existene des fontions min_element() et max_element() qui herhent l9lment le plus petit ou le plus grndF

Trier !
sl rrive souvent que l9on doive trier une srie d9lments et e n9est ps une mine 'ireF in tout sD 9est un prolme vn d9lgorithmique @l siene des lgoE rithmesAF te vous ssure qu9rire une fontion de tri optimise est une the qui n9est ps l porte de euoup de mondeF reureusementD l v propose une fontion pour el et je peux vous ssurer qu9elle est trs e0e et ien odeF on nom est simplement sort()D e qui signi(e trier en nglis @u s o je devris le priserAF yn lui fournit deux itrteurs et l fontion trie dns l9ordre roissnt tout e qui se trouve entre es deux lmentsF rions don le tleu de nomres ltoires utilis prdemmentF THQ

CHAPITRE 36.

LA PUISSANCE DES ALGORITHMES

int min@A { srnd@time@HAAY vetor`intb t@IHHDEIAY GGn tleu de IHH ses generte@tFegin@AD tFend@AD qenerer@AAY GGyn gnre les nomres ltoires sort@tFegin@AD tFend@AAY GGyn trie le tleu

for@vetor`intbXXitertor itatFegin@AY it3atFend@AY CCitA out `` Bit `` endlY GGyn ffihe le tleu tri } return HY

nouveuD rien de ien sorierF


La fonction sort() ne peut tre utilise qu'avec des conteneurs proposant des random access iterators, c'est--dire les vector et les deque uniquement. De toute faon, trier une map a peu de sens puisque ces conteneurs stockent directement leurs lments dans le bon ordre.

r dfutD l fontion sort() utilise l9oprteur < pour omprer les lments vnt de les trierF wis il existe glement une utre version de ette fontion qui prend un troisime rgument X un fonteur omprnt deux lmentsF xous vons dj renontr un tel fonteur u hpitre prdentD pour hnger le omportement d9une tle ssoE itiveF g9est extement le mme prinipe ii X si l9on souhite rer un tri spi(queD on doit fournir un fonteur expliqunt sort() omment trierF our trier des hnes de rtres selon leur longueurD nous pouvons rutiliser notre fonteur X
lss gomprisonvongueur { puliX ool opertor@A@onst string8 D onst string8 A { return Flength@A ` Flength@AY } }Y int min@A { vetor`stringb tleuY GGFFF yn remplit le tleu en lisnt un fihier pr exempleF

THR

ENCORE PLUS D'ALGOS

sort@tleuFegin@AD tleuFend@AD gomprisonvongueur@AAY GGve tleu est mintennt tri pr longueur de hne } return HY

uissntD simple et e0eF ue demnder de mieux c

Encore plus d'algos


xe nous rrtons ps en si on heminF yn est enore loin d9voir fit le tour de tout e qui existeF hns l9exemple du triD j90his le ontenu du vector via une oule forF imployer pour el un lgorithme serit plus lgntF gonrtementD 0her les lments revient les psser en rgument une fontion @ou un fonteurA qui les 0heF rire un fonteur qui 0he l9rgument reu ne devrit ps vous poser de prolmes e stde du oursF
lss effiher { puliX void opertor@A@int A onst { out `` `` endlY } }Y

sl ne nous reste plus qu9 ppliquer e fonteur sur tous les lmentsF v9lgorithme permettnt el s9ppelle for_each()D e qui signi(e  pour tout F
int min@A { srnd@time@HAAY vetor`intb t@IHHD EIAY generte@tFegin@AD tFend@AD qenerer@AAY GGyn gnre des nomres ltoires sort@tFegin@AD tFend@AAY foreh@tFegin@AD tFend@AD effiher@AAY } return HY GGit on ffihe les lments

ve ode enore t rouriF sl existe une utre mnire d9envoyer des vleurs dns un )ux mis il fudr ttendre enore un peuF g9est le sujet du prohin hpitreF THS

CHAPITRE 36.

LA PUISSANCE DES ALGORITHMES

prtir de et lgorithmeD on peut fire normment de hosesF n des premiers s qui me vient l9esprit est le lul de l somme des lments d9un onteneurF ous voyez omment c gomme for_each() ppelle le fonteur sur tous les lments de l plge spi(eD on peut demnder u fonteur d9dditionner les lments dns un de ses ttriutsF
lss ommer { puliX ommer@A Xmsomme@HA {} void opertor@A@int nA { msomme Ca nY } int resultt@A onst { return msommeY } privteX int msommeY }Y

v9oprteur () joute simplement l vleur de l9lment ournt l9ttriut m_sommeF eprs l9ppel l9lgorithmeD on peut onsulter l vleur de m_somme en utilisnt l mthode resultat()F
int min@A { srnd@time@HAAY vetor`intb t@IHHD EIAY generte@tFegin@AD tFend@AD qenerer@AAY GGyn gnre des nomres ltoires ommer sommeY foreh@tFegin@AD tFend@AD sommeAY GGit on ffihe les lments

out `` 4v somme des elements generes est X 4 `` sommeFresultt@A `` endlY } return HY

i vous voulez un exerieD je peux vous proposer de rrire l fontion qui lulit l moyenne d9un tleu de notesF xous vions vu e prolme u tout dut de e ours THT

ENCORE PLUS D'ALGOS

@pge IQRAF n petit fonteur pour le lul de l moyenneD un for_each() et le tour est jouF

Utiliser deux sries la fois


erminons ette ourte prsenttion pr un dernier lgorithme ien prtique pour triter deux onteneurs l foisF smginons que nous voulions luler l somme des lments de deux tleux et stoker le rsultt dns un troisime vectorF our elD il v nous flloir un fonteur qui e'etue l9dditionF wis elD on l9 dj vuD existe dns l9enEtte functionalF our le resteD il nous fut prourir en prllle deux tleux et rire les rsultts dns un troisimeF g9est e que fit l fontion transform()F ille prend inq rguments X le dut et l (n du premier tleuD le dut du deuximeD le dut de elui o seront stoks les rsultts et ien sr le fonteurF
5inlude `vetorb 5inlude `lgorithmb 5inlude `funtionlb using nmespe stdY int min@A { vetor`douleb @SHD HFAY vetor`douleb @SHD HFAY vetor`douleb @SHD HFAY

GGrois tleux de SH nomres virgule

GGemplissge des vetors 99 et 99FFFF trnsform@Fegin@AD Fend@AD Fegin@AD Fegin@AD plus`douleb@AAY GG prtir d9ii les ses de 99 ontiennent l somme des ses de 99 et 99 } return HY

Il faut tout de mme que les tableaux b et c soient assez grands. S'ils ont moins de 50 cases (la taille de a), ce code plantera lors de l'excution puisque l'algorithme va tenter de remplir des cases inexistantes.

errtonsEnous l pour e hpitreF te vous i prl des lgorithmes les plus utiliss et je pense que vous vez ompris omment tout el fontionnitF ous ommenez voir une onne expriene du lnggeF

En rsum
! ves lgorithmes de l v permettent d9e'etuer des tritements sur des donnesF THU

CHAPITRE 36.

LA PUISSANCE DES ALGORITHMES

! yn les utilise en spi(nt les lments modi(er gre deux itrteursF ! gertins lgorithmes utilisent des fonteursD pr exemple pour les ppliquer tous les lments du onteneur ou pour herher un lment orrespondnt un ritre donnF

THV

Chapitre

37
Dicult :

Utiliser les itrateurs sur les ux

i l'on retourne au tout dbut de votre apprentissage du C++, on dcouvre que le premier objet que vous avez manipul (sans le savoir !) est l'objet cout. Avec son acolyte habituel cin, vous avez pu interagir avec les utilisateurs de la console. Mais que savez-vous rellement sur ces objets ? Que peut-on faire d'autre qu'utiliser les chevrons et la fonction getline() ? Il est enn temps d'aller plus loin et de dcouvrir la vraie nature des ux. Dans ce chapitre, nous allons apprendre utiliser des itrateurs sur les ux. nouveau, cela va nous ouvrir grand les portes du monde des algorithmes et nous allons pouvoir utiliser tout ce que nous savons dj sur les ux, par exemple pour simplier l'criture d'un vector dans la console ou dans un chier. Finalement, nous verrons qu'il existe aussi des ux sur les string. Encore une nouvelle dcouverte sur ce type vraiment particulier !

THW

CHAPITRE 37.

UTILISER LES ITRATEURS SUR LES FLUX

Les itrateurs de ux


eu hpitre sur les itrteursD je vous vis prsent deux tgories d9itrteurs X ! les random access iteratorsD qui permettent d9der diretement n9importe quelle se d9un tleu Y ! les bidirectional iterators quiD euxD ne peuvent vner et reuler que d9une se l fois sns pouvoir ller diretement une position donneF in rlitD j9vis simpli( les hosesF sl existe enore deux utres tgories d9itrteursF it si je vous en prleD 9est que nous llons en voir esoin dns e hpitreF ne des proprits importntes des )ux est qu9ils ne peuvent tre lus et modi(s que dns un seul sensF yn ne peut ps lire un (hier l9envers ou rire une phrse dns l onsole en sens inverseF ves itrteurs sur les )ux ont don l proprit de ne pouvoir qu9vnerF r onsquentD ils ne possdent que l9oprteur ++ et ps le -- omme eux que nous vons renontrs jusqueElF in plus de ette importnte restritionD les itrteurs sur les )ux entrnts @cinD les (hiers ifstreamDF F F A ne peuvent ps modi(er les lments sur lesquels ils pointentF g9est norml X on ne peut que lire dns cinD ps y rireF ves itrteurs respetent ette logiqueF he mmeD les itrteurs sur les )ux sortnts @coutD les (hiers ofstreamDF F F A ne peuvent ps lire l vleur des lmentsD seulement y rireF

Dclarer un itrateur sur un ux sortant


gomme toujoursD l premire question qui se pose est elle du (hier d9enEtte ontennt e que l9on herheF ves itrteurs de )ux @et plus gnrlement tous les itrteursA sont dlrs dns l9enEtte iterator de l vF our une foisD 9est un nom file retenir 3 hlrons pour ommener un itrteur sur le )ux sortnt coutF
5inlude `iostremb 5inlude `itertorb using nmespe stdY int min@A { ostremitertor`douleb it@outAY } return HY

ge ode dlre un itrteur sur le )ux sortnt coutD permettnt d9rire des doubleF ous remrquerez deux hoses di'rentes de e qu9on vu jusqu9 mintennt X ! on n9utilise ps l syntxe conteneur::iterator Y ! il fut indiquer entre les hevrons le type des lments envoys dns le )uxF wisD prt elD tout fontionne omme d9hitudeF yn peut utiliser l9itrteur via son oprteur *D e qui ur pour e'et d9rire dns l onsole X TIH

LES ITRATEURS DE FLUX

5inlude `iostremb 5inlude `itertorb using nmespe stdY int min@A { ostremitertor`douleb it@outAY Bit a QFIRY Bit a PFUIY } return HY

estez e odeD vous devriez otenir ei X


QFIRPFUI

ves deux nomres ont ien t ritsF ve seul prolmeD 9est que nous n9vons ps insr d9espe entre euxF g9est l qu9intervient le deuxime rgument du onstruteur de l9itrteurF yn peut spi(er e qu9on ppelle un dlimiteurD 9estEEdire le ou les symoles qui seront insrs entre hque riture fite via l9oprteur *F issyons de mettre une virgule et un espe pour voirF
5inlude `iostremb 5inlude `itertorb using nmespe stdY int min@A { ostremitertor`douleb it@outD 4D 4AY Bit a QFIRY Bit a PFUIY } return HY

ge qui donne X
QFIRD PFUID

rfit 3 tuste e que l9on voulitF


Pour obtenir un retour la ligne entre chaque criture, il faut spcier le dlimiteur \n.

TII

CHAPITRE 37.

UTILISER LES ITRATEURS SUR LES FLUX

te vous proposeD omme exerieD de reprendre le tout premier ode gCCD le fmeux  rello orld 3 F issyez de le rrire en utilisnt un itrteur de )ux sur coutD permettnt d9rire des hnes de rtres spres pr des espesF

Dclarer un itrateur sur un ux entrant


ves itrteurs sur les )ux entrnts s9utilisent extement de l mme mnireF yn dlre l9itrteur en spi(nt entre les hevrons le type d9ojet et en pssnt en rgument du onstruteur le )ux lireF our lire depuis un (hierD on urit insi l dlrtion suivnte X
ifstrem fihier@4gXGxnoGdtFtxt4AY istremitertor`douleb it@fihierAY GGn itrteur lisnt des doules depuis le fihier

v di'rene ve les ostream_iterator est qu9il fut expliitement les fire vner prs hque letureF it ien srD el se fit gre l9oprteur ++F
5inlude `fstremb 5inlude `itertorb using nmespe stdY int min@A { ifstrem fihier@4gXGxnoGdtFtxt4AY istremitertor`douleb it@fihierAY doule DY a BitY GGyn lit le premier nomre du fihier CCitY GGyn psse u suivnt a BitY GGyn lit le deuxime nomre } return HY

frefD e n9est ps trs omplexeF sl fut ependnt svoir s9rrter l (n du (hierF reureusementD les onepteurs de l v ont pens tout 3 our les onteneursD il y vit l mthode end() qui nous renvoyit un itrteur indiqunt l (n du onteneurF sl existe un mnisme similire iiF i l9on dlre un istream_iterator sns lui psser d9rgument l onstrutionD lors il pointe diretement vers e qu9on ppelle un end-of-stream iteratorD une sorte de signl de (n de )uxF yn peut insi utiliser e signl omme limite pour l letureF our lire un (hier du dut l (n et l90her dns l onsole on proder insi X
5inlude `fstremb 5inlude `itertorb 5inlude `iostremb

TIP

LE RETOUR DES ALGORITHMES

using nmespe stdY int min@A { ifstrem fihier@4dtFtxt4AY istremitertor`douleb it@fihierAY GGn itrteur sur le fihier istremitertor`douleb endY GGve signl de fin while@it 3a endA GGnt qu9on ps tteint l fin { out `` Bit `` endlY GGyn lit CCitY GGit on vne } return HY

iensD el me donne une ideF lutt que d9utiliser diretement cout pour 0her les vleurs luesD essyez de rrire e ode ve un itrteur sur un )ux sortnt 3

Le retour des algorithmes


fonD jusque lD utiliser es nouveux itrteurs n9 rien men de vriment intressntF prt pour frimer dns les disussions de progrmmeursD tout el est un peu inutileF g9est pre que nous n9vons ps enore ppris utiliser les lgorithmes 3 gomme nous vons des itrteursD il ne nous reste qu9 les utiliser on esient 3
Tous les algorithmes ne sont pas utilisables. Par exemple, ceux qui ncessitent des accs alatoires comme sort ne peuvent pas tre employs.

L'algorithme copy
gommenons ve l9lgorithme qui est trs ertinement le plus utilis dns e ontexte X copy()F sl rrive trs souvent que l9on doive lire des vleurs depuis un (hier pour les stoker dns un vector pr exempleF sl s9git simplement de lire les lments depuis le )ux et de les insrer dns le tleu r u prlleF v fontion copy() reoit trois rgumentsF ves deux premiers orrespondent u dut et l (n de l zone lire et le troisime est un itrteur sur le dut de l zone rireF our opier depuis un (hier vers un vectorD on ferit don ei X
5inlude `lgorithmb 5inlude `vetorb 5inlude `itertorb

TIQ

CHAPITRE 37.

UTILISER LES ITRATEURS SUR LES FLUX

5inlude `fstremb using nmespe stdY int min@A { vetor`intb t@IHHDHAY ifstrem fihier@4gXGxnoGdtFtxt4AY istremitertor`intb it@fihierAY istremitertor`intb finY opy@itD finD tFegin@AAY GGyn opie le ontenu du fihier du deut l fin dns le vetor } return HY

Il faut absolument que votre vector soit assez grand pour contenir tous les nombres lus.

yn peut ien sr utiliser copy() pour rire dns un (hier ou dns l onsoleF yn peut don reprendre les exemples des hpitres prdents et rempler l oule d90hge des vleurs pr un ppel copy()D omme ei X
int min@A { srnd@time@HAAY vetor`intb t@IHHDEIAY GGn tleu de IHH ses GGyn gnre les nomres ltoires generte@tFegin@AD tFend@AD qenerer@AAY GGyn trie le tleu sort@tFegin@AD tFend@AAY GGit on l9ffihe opy@tFegin@AD tFend@AD ostremitertor`intb@outD 4n4AY return HY

g9est simple et e0eF yn ne s9emte plus ve des oulesF out est h derrire des noms de fontions qui drivent ien e qui se psseF ve ode est insi devenu plus lisile et omprhensileD et il n9 ien sr rien perdu en e0itF

Le problme de la taille
vorsqu9on lit des donnes dns un (hier pour les insrer dns un tleuD il y un prolme qui survient ssez souvent X elui de l tille donner u tleuF yn ne sit ps formentD vnt de lire le (hierD omien de vleurs il ontientF it e serit domE mge de le lire deux fois simplement pour otenir ette informtion 3 sl serit judiieux TIR

LE RETOUR DES ALGORITHMES

d9voir des itrteurs un peu plus volus permettnt de fire grndir le vectorD l list ou l deque hque letureF g9est e qu9on ppelle des back_insertersF our dlrer un de es itrteurs sur un vectorD on rit ei X
vetor`stringb tleuY GGn tleu vide de hnes de rtres kinserter it@tleuAY GGn itrteur ple de fire grndir le tleu

get itrteur s9utilise lors omme n9importe quel utre itrteurF v seule di'rene se ressent u moment de l9ppel l9oprteur *F eu lieu de modi(er une seD l9itrteur en joute une nouvelle l (n du tleuF xous pouvons don reprendre le ode qui opiit un (hier dns un tleu pour l9mliorer X
5inlude `lgorithmb 5inlude `vetorb 5inlude `itertorb 5inlude `fstremb using nmespe stdY int min@A { vetor`intb tY GGn tleu vide ifstrem fihier@4gXGxnoGdtFtxt4AY istremitertor`intb it@fihierAY istremitertor`intb finY GGv9lgorithme joute les ses nessires u tleu opy@itD finD kinserter@tAAY } return HY

our vous exererD je vous propose d9essyer de refire le tout premier X le tirge u sort d9un mot dns le ditionnire devrit mintennt en tre grndement simpli( 3 oyons rpidement quelques utres lgorithmes utilisles ve des (hiersF

D'autres algorithmes
eu hpitre prdentD nous vions vu l9lgorithme count() qui permettit de ompter les ourrenes d9une vleur dns un onteneurF yn peut ussi l9utiliser pour ompter dns les (hiersD ou employer min_element() ou max_element() pour herher l plus petite ou l plus grnde des vleurs ontenuesF gel ne devrit ps tre trop di0ile utiliserF oii pr exemple les lignes permettnt de trouver le minimum des vleurs dns un (hier X
ifstrem fihier@4gXGxnoGdtFtxt4AY out `` Bminelement@istremitertor`intb@fihierAD istremitertor`intb@AA `` endlY

TIS

CHAPITRE 37.

UTILISER LES ITRATEURS SUR LES FLUX

Encore un retour sur les strings !


ves )ux sont un onept tellement puissnt que les rteurs de l v ont did de l9ppliquer glement ux hnes de rtresF tusqu9 mintenntD vous vez ppris modi(er les string via l9oprteur []D mis vous n9vez jmis vu omment insrer un nomre dns une hne de rtresF ves )ux sur les hnes de rtres permettent d9rire un double ou n9importe quel utre type dns un string sous forme de texteF ves )ux sur les string s9ppellent ostringstream et istringstream selon qu9on lit l hne ou qu9on y ritF our rer de tels ojetsD rien de plus simple X il su0t de psser en rgument u onstruteur l hne sur lquelle le )ux v trvillerF yn peut lors ruprer l hne de rtre en utilisnt l mthode str()F euprvntD il futD omme toujoursD inlure le on (hier d9enEtte X sstreamF
5inlude `stringb 5inlude `sstremb 5inlude `iostremb using nmespe stdY int min@A { ostringstrem fluxY flux `` 4lut les4Y flux `` 4 zeros4Y flux `` 4 34Y

GGn flux permettnt d9rire dns une hne GGyn rit dns le flux gre l9oprteur ``

string onst hine a fluxFstr@AY GGyn rupre l hine out `` hine `` endlY return HY GGeffihe 9lut les zeros 39

ne fois que le )ux est dlrD on utilise simplement les hevrons pour rire dns l hneF i vous souhitez insrer un nomre dns un stringD il n9y uune di'reneF out se psse omme si on utilisit cout X
string hine@4ve nomre pi vutX 4AY doule onst pi@QFIRISAY ostringstrem fluxY flux `` hineY flux `` piY out `` fluxFstr@A `` endlY

g9est l fois trs simple et trs puissntF yn omine l simpliit d9utilistion des string l liert sur l9riture des types que donne l9utilistion des )uxF g9est ssez TIT

ENCORE UN RETOUR SUR LES STRINGS !

mgiqueD je trouve 3 g9est ette tehnique que l9on utilise hque fois l9on herhe onvertir un nomre en une hne de rtresF ouvenezEvous de elF yn peut ien sr fire el dns l9utre sensD 9estEEdire extrire des nomres depuis une hne de rtresF sl fudr lors utiliser les )ux de leture istringstreamF wis vous tes dous mintenntD vous pouvez essyer tous seulsF YEA in(nD shez que l9on peut tout fit utiliser les itrteurs sur les ostringstream et istringstream omme sur n9importe quel utre )uxF ous pouvez insi oupler l puissne des itrteurs et lgorithmes tout e que vous svez sur les stringF wis personne ne prode insi X l solution orrete est prsente u prohin hpitre 3

En rsum
! sl existe des itrteurs sur les )uxF ! ges itrteurs ne peuvent qu9vnerF sls ne possdent don que l9oprteur ++ et l9oprteur *F ! yn peut utiliser es itrteurs ve les lgorithmes pour simpli(er nos progrmmesF ! yn peut rire et lire dns les hnes de rtres gre ux istringstream et ostringstreamF gel permet de ominer l puissne des )ux l simpliit des stringF ! yn utilise les stringstream pour onvertir des nomres en hne et vieEversF

TIU

CHAPITRE 37.

UTILISER LES ITRATEURS SUR LES FLUX

TIV

Chapitre

38
Dicult :

Aller plus loin avec la SL

s le premier chapitre sur la SL, je vous ai prvenus que le sujet tait trs vaste et qu'il serait dicile d'en faire le tour. Nous avons tudi les principaux lments repris du langage C puis nous nous sommes concentrs sur la STL et sur les ux. Il faut quand mme que je vous prsente les autres possibilits de la bibliothque standard. Ce chapitre prsente trois domaines dirents o la SL va nous aider amliorer nos programmes. Pour commencer, nous allons reparler des chanes de caractres et voir comment, l aussi, utiliser des itrateurs. Puis, nous reviendrons sur les tableaux statiques. Nous les avions un peu abandonns au prot des autres conteneurs mais il est temps d'en reparler et d'utiliser nos nouveaux meilleurs amis : les itrateurs bien sr ! Enn, la troisime partie sera assez dirente puisque nous y dcouvrirons quelque chose de compltement nouveau : les outils ddis au calcul scientique. Le C++ est en eet trs utilis par les chercheurs en tous genres pour faire des simulations, que ce soit sur un ordinateur classique ou sur un super-calculateur.

TIW

CHAPITRE 38.

ALLER PLUS LOIN AVEC LA SL

Plus loin avec les strings


fonD les stringD on ommene onntre depuis le temps 3 gependntD vous tes enore loin de tout svoirF it puisque nous prlons de l v depuis quelques hpitresD vous vous doutez prolement que nous llons voir 'ire des itrteursF xous vions vu que les string se omportient omme des tleux gre l surhrge de l9oprteur []F wis e n9est ps leur seul point ommun ve les vectorD ils possdent ussi les mthodes begin() et end() renvoynt un itrteur sur le dut et l (n de l hneF
string hine@4lut les zeros34AY GGne hne stringXXitertor it a hineFegin@AY GGn itrteur sur le dut

frefD que des hoses dj ien onnuesF te vous vis prsentD dns le hpitre d9inE trodution l vD les fontions toupper() et tolower() qui permettent de onvertir une minusule en mjusule et vieEversF sl est possile d9utiliser es fontions dns les lgorithmesF siD 9est ien sr l9lgorithme transform() qu9il fut utiliserF sl prourt l hneD pplique l fontion sur hque lment et rit le rsultt u mme endroitF
5inlude `iostremb 5inlude `stringb 5inlude `lgorithmb 5inlude `typeb using nmespe stdY lss gonvertir { puliX hr opertor@A@hr A onst { return toupper@AY } }Y int min@A { string hine@4lut les zeros 34AY trnsform@hineFegin@AD hineFend@AD hineFegin@AD gonvertir@AAY out `` hine `` endlY return HY }

ge ode 0he don le rsultt suivnt X


ev vi iy 3

sl n9y ps grnd hose de plus dire sur le sujetF in fitD vous svez dj presque toutF hez seulement que les string possdent ussi des mthodes insert() et erase() TPH

MANIPULER LES TABLEAUX STATIQUES

qui fontionnent de mnire similire elles de vectorF ous pouvezD gre ellesD insrer et supprimer des lettres u milieu d9une hneF ssons mintennt une utre vieille onnissne X le tleu sttiqueF

Manipuler les tableaux statiques


gommenons pr un ref rppelF n tleu sttique est un tleu dont l tille ne peut pas vrierF sl se dlre en utilisnt les rohets [] entre lesquels on spi(e le nomre de ses dsiresF r exempleD pour un tleu de IH entiers nomm tabD on urit l dlrtion suivnte X
int tIHY

it on peut ien sr rer des tleux de n9importe quel type X doubleD string ou mme Personnage F sl y une seule oligtion X les ojets doivent possder un onstruteur pr dfutF gomme es tleux ne sont ps des ojets @omme vector ou dequeAD ils ne possdent uune mthodeF sl n9est don ps possileD pr exempleD de onntre leur tilleF sl fut toujours stoker l tille du tleu dns une vrile supplmentireF wis elD vous le sviez djF
1

Les itrateurs
ges tleux ont eu ne ps tre des ojetsD on imerit qund mme ien pouvoir utiliser des itrteurs puisque el nous ouvririt l porte des lgorithmesF gependntD il n9existe ps d9itrteur spi(que et ien sr ps de mthode begin() ou end()F te vous vis dit que les itrteurs tient l  version ojet des pointeursD tout omme vector est l  version ojet des tleux sttiquesF it lD je vous sens frmirF i'etivementD nous llons utiliser des pointeurs omme itrteurs sur es tleuxF ue demndeEtEon un itrteur c riniplement de pouvoir vnerD reuler et de nous renvoyer l vleur pointe gre l9oprteur *F ge sont justement des oprtions qui existent pour les pointeursF sl n9y don plus qu9 se jeter l9euF hns l pluprt des sD on esoin d9un itrteur sur le premier lmentF hns notre nouveu lnggeD on dirit qu9on esoin de l9dresse de l premire seF yn pourrit don rire ei pour notre itrteur X
int tIHY GGn tleu de IH entiers intB it@8tHAY GGyn rupre l9dresse de l premire se

ehD je vois que el vous fit peurF ppelezEvous que l9esperluette @&A renvoie l9dresse d9une vrileD ii l premire se du tleuF yn initilise ensuite notre pointeur d9entiers ette vleurF xous vons don un itrteurF
1. La fameuse classe que nous avions cre lorsque nous avions dcouvert la POO !

TPI

CHAPITRE 38.

ALLER PLUS LOIN AVEC LA SL

reureusementD il existe une mnire plus simple d9rire elF sl fut svoir que tab est lui ussiD en rlitD un pointeur 3 ge pointeur pointe sur l premire seD justement e qu9il nous futF yn rit don gnrlement plutt ei X
2

int tIHY GGn tleu de IH entiers intB it@tAY GGn itrteur sur e tleu

L'itrateur de n
gomme toujoursD on esoin de spi(er l (n du tleu via un deuxime itrteurF v solution est de r)hir ux ses qui sont essilesF hns l9exemple prdentD it pointe sur l premire seF honD it+1 pointer sur l deuximeD it+2 sur l troisimeD etF n itrteur pointnt sur l premire se en dehors du tleu serD en suivnt ette logiqueD it+10F i on itre de it it+10 exluD on ur prouru toutes les ses du tleuF in rgle gnrleD on stoke l tille du tleu dns une vrile et on ririt le ode suivnt pour otenir le dut et l (n d9un tleu X
int onst tille@IHAY int ttilleY GGn tleu de IH entiers intB deut@tAY GGn itrteur sur le dut intB fin@tCtilleAY GGn itrteur sur l fin

xous vons insi un quivlent de begin() et un quivlent de end()F sl ne nous reste plus qu9 utiliser les lgorithmesF wis elD vous svez dj le fireF in tout s je l9espreF F F fonD je vous donne qund mme un exempleF our trier un tleu de nomresD on peut rire ei X
5inlude `lgorithmb using nmespe stdY int min@A { int onst tille@IHHHAY doule tleutilleY GGemplissge du tleuFFF douleB deut@tleuAY GGves deux itrteurs douleB fin@tleuCtilleAY sort@deutD finAY } return HY GGit on trie

GGyn dlre un tleu

2. On n'avait jamais eu besoin de cette information jusqu'ici et j'espre que vous ne m'en voudrez pas de ne pas l'avoir dit plus tt.

TPP

FAIRE DU CALCUL SCIENTIFIQUE

Il est possible d'accder directement n'importe quel lment du tableau grce cette technique. Les pointeurs se comportent donc comme des random access iterators.

te rois que vous uriez trouv pr vousEmmesF ous tes devenu des pros de l v depuis le tempsF YEA

Faire du calcul scientique


hns tous les progrmmes sienti(quesD il y D vous vous en doutezD euoup de lulsF ge sont des progrmmes qui mnipulent normment de nomres en tous genresF ous onnissez dj les int et les double insi que les frtions misD dns ertins projetsD on utilise glement des nomres omplexes F
3

Les nombres complexes


gomme 9est une rique de seD l v se devit de fournir un moyen de mnipuler es nomresF g9est pour el qu9il existe l9enEtte complexD dns lequel se trouve l d(nition de l lsse du mme nomF our dlrer un nomre omplexe 2 + 3i et l90herD on utilise le ode suivnt X
5inlude `omplexb 5inlude `iostremb using nmespe stdY int min@A { omplex`douleb @PDQAY out `` `` endlY return HY }

ge ode produit le rsultt suivnt X


@PFD QFA

sl fut spi(er le type des nomres utiliser pour reprsenter l prtie relle et l prtie imginire des nomres omplexesF sl est trs rre d9utiliser pour el utre hose que des doubleD mis on ne sit jmisF F F prtir de lD on peut utiliser les oprteurs usuels pour fire des dditionsD multiplitionsD divisionsD etF ve es nomresF v fore de l surhrge des oprteurs est nouveu visileF in plus des oprtions rithmtiques de seD il existe ussi quelques fontions mthmtiques ien prtiques omme l rine rre ou les fontions trigonomtriquesF
3. Si vous ne savez pas ce que c'est, ce n'est pas grave, vous pouvez simplement sauter cette section pour attaquer celle parlant des valarray.

TPQ

CHAPITRE 38.

ALLER PLUS LOIN AVEC LA SL

omplex`douleb @IFD PFAD @EPD RAD Y a sqrt@CAY a os@GA C sin@GAY

frefD tout e qui est nessire pour fire des mths un peu poussesF in(nD il existe des fontions spi(ques ux nomres omplexes omme l norme ou le onjuguF ous trouverez une liste omplte des possiilits dns votre doumenttion prfreF
omplex`douleb @QDRAY out `` norm@onj@AA `` endlY GGeffihe 9S9

outes les fontions ont leur nom hituel en mthsD il n9y don uune di0ultF sl fut juste svoir qu9elles existentD e qui est hose fite mintenntF YEA

Les valarray
v9utre lment que l9on retrouve dns euoup de progrmmes de simultion est ien sr le tleu de nomresF ous en onnissez dj euoup mis il y une forme prtiulirement ien dpte ux luls X les valarrayF sls sont plus restritifs que les vector dns le sens o l9on ne peut ps filement jouter des ses l (n misD omme e n9est ps une oprtion trs ournteD e n9est ps un prolmeF v grnde fore des valarray est l possiilit d9e'etuer des oprtions mthmtiques diretement ve l9ensemle du tleuF yn peut pr exemple luler l somme de deux tleux lment pr lment simplement en utilisnt l9oprteur +F
5inlude`vlrryb using nmespe stdY int min@A { vlrry`intb @IHD SAY vlrry`intb @VD SAY vlrry`intb a C Y return HY

GGS lments vlnt IH GGS lments vlnt V GGghque lment de vut IV

yn n9 insi ps esoin d9rire des oules pour e'etuer es oprtions de seF emrquez u pssge que le onstruteur des valarray prend ses rguments dns l9ordre inverse des vectorF sl fut d9ord indiquer l vleur que l9on souhite puis le nomre de sesF pites ttentionD on se trompe souvent 3 ous les oprteurs usuels sont surhrgs de sorte qu9ils trvillent sur tous les lE ments sprmentF r exempleD l9oprteur == ompre un pr un tous les lments du tleu et renvoie un tleu de boolF yn peut lors svoir quels sont les lments identiques et eux qui sont di'rents en lisnt l se orrespondnte de e tleuF TPR

FAIRE DU CALCUL SCIENTIFIQUE

in(nD on peut ussi utiliser l mthode apply() pour ppliquer un fonteur ux lE ments du tleuF yn s9onomise insi l9utilistion d9un lgorithme et des itrteursF g9est un onfort de nottion supplmentireF our luler le osinus de tous les lE ments d9un valarrayD on ririt ei X
5inlude`vlrryb 5inlude`mthb using nmespe stdY lss gosinus GGn fonteur pour le lul du osinus { puliX doule opertor@A@doule xA onst { return os@xAY } }Y int min@A { vlrry`douleb @IHAY

GGIH lments

GGemplissge du tleuFFF Fpply@gosinusAY GGghque se ontient mintennt le osinus de son nienne vleur } return HY

nouveuD fites un tour dns votre doumenttion fvorite pour douvrir toutes les fontionnlits de es tleuxF sls sont vriment prtiquesF
La SL ne propose pas de fonctionnalits pour faire du calcul matriciel, mme si c'est trs courant. On doit alors se tourner vers des bibliothques externes comme lapack, MTL ou blas.

En rsum
! ves string proposent eux ussi des itrteursF yn peut don utiliser les lgorithmes glement sur les hnes de rtresF ! ves tleux sttiques ne possdent ps d9itrteurs mis on utilise pour les rempler les pointeursF ! v v propose quelques outils pour le lul sienti(queD notmment une lsse de nomres omplexes et des tleux optimiss pour e'etuer des oprtions mthE mtiquesF TPS

CHAPITRE 38.

ALLER PLUS LOIN AVEC LA SL

TPT

Cinquime partie

Notions avances

TPU

Chapitre

39
Dicult :

La gestion des erreurs avec les exceptions

usqu'ici , nous avons toujours suppos que tout se droulait bien dans nos programmes. Mais ce n'est pas toujours le cas, des problmes peuvent survenir. Pensez par exemple aux cas suivants : un chier qui ne peut pas tre ouvert, la mmoire qui est sature, un tableau trop petit pour ce que l'on souhaite y stocker, etc. Les exceptions sont un moyen de grer ecacement les erreurs qui pourraient survenir dans votre programme ; on peut alors tenter de traiter ces erreurs, remettre le programme dans un tat normal et reprendre l'excution du programme. Dans ce chapitre, je vais vous apprendre crer des exceptions, les traiter et scuriser vos programmes en les rendant plus robustes.

TPW

CHAPITRE 39.

LA GESTION DES ERREURS AVEC LES EXCEPTIONS

Un problme bien ennuyeux


in progrmmtionD quel que soit le lngge utilis @et don en gCCAD il existe plusieurs types d9erreurs pouvnt survenirF rmi les erreurs possilesD on onnt dj les erreurs de syntxe qui surviennent lorsque l9on fit une fute dns le ode soureD pr exemple si l9on oulie un pointEvirgule l (n d9une ligneF ges erreurs sont files orriger r le ompilteur peut les signlerF n utre type de prolme peut survenir si le progrmme est rit orretement mis qu9il exute une tion interditeF yn peut iter omme exemple le s o l9on essye de lire l IHe se d9un tleu de V lments ou enore le lul de l rine rre d9un nomre ngtifF yn ppelle es erreurs les erreurs d'implmentationF v gestion des exeptions permetD si elle est rlise orretementD de triter les erreurs d9implmenttion en les prvoynt l9vneF gel n9est ps toujours rlisle de mnire exhustive r il fudrit penser toutes les erreurs suseptiles de survenirD mis on peut filement en viter une grnde prtieF our omprendre le ut de l gestion des exeptions Dle plus simple est de prendre un exemple onretF

Exemple d'erreur d'implmentation


get exemple n9est ps trs originl mis 9est ertinement pre que 9est un des s les plus simplesF smginons que vous yez did de rliser une lultrieF ous uriez pr exemple pu oder l division de deux nomres entiers de ette mnire X
1

int division@int Dint A GG glule divis pr F { return GY } int min@A { int DY out `` 4leur pour X 4Y in bb Y out `` 4leur pour X 4Y in bb Y out `` `` 4 G 4 `` `` 4 a 4 `` division@DA `` endlY } return HY

ge ode est tout fit orret et fontionne prfitementD suf dns un s X si b vut HF in e'etD l division pr H n9est ps une oprtion rithmtique vlideF i on lne le progrmme ve b=0D on otient une erreur et le messge suivnt s90he X
1. On le trouve dans presque tous les livres !

TQH

UN PROBLME BIEN ENNUYEUX

leur pour X Q leur pour X H ixeption en point flottnt @ore dumpedA

sl fudrit don viter de rliser le lul si b vut HD mis que fire l ple c

Quelques solutions inadquates


ne premire possiilit serit de renvoyerD l ple du rsulttD un nomre prd(niF gel donnerit pr exemple X
int division@int Dint A GG glule divis pr F { if@3aHA GG i ne vut ps HF return GY else GG inonF return iiY }

sl fudrit spi(er une vleur prise pour ERREURF wis el pose un nouveu proE lme X quelle vleur hoisir pour ERREUR c yn ne peut ps renvoyer un nomre puisqueD dns un s normlD tous les nomres sont suseptiles d9tre renvoys pr l fontionF ge n9est don ps une onne solutionF ne utre ide que l9on renontre souvent onsiste 0her un messge d9erreurD e qui donnerit quelque hose omme X
int division@int Dint A GG glule divis pr F { if@ 3aHA GG i ne vut ps HF return GY else GG inonF out `` 4ii X hivision pr H 34 `` endlY }

wis el pose deux nouveux prolmes X non seulement l fontion ne renvoie uune vleur en s d9erreur misD de surrotD elle gnre lors sur un e'et de ordF sl fut omprendre que l fontion division n9est ps forment ense utiliser coutD surtout siD pr exempleD on rlis un progrmme ve une qs omme tF v troisime et dernire solutionD que l9on renontre prfois dns ertines ilioE thquesD onsiste modi(er l signture et le type de retour de l fontion de l mnire suivnte X
2

2.

Graphical User Interface

TQI

CHAPITRE 39.

LA GESTION DES ERREURS AVEC LES EXCEPTIONS

ool division@int Dint D int8 resulttA { if@3aHA GG i est diffrent de HF { resultt a GY GG yn effetue le lul et on met le rsultt dns l vrile psse en rgumentF return trueY GG yn renvoie vri pour montrer que tout s9est ien pssF } else GG inon return flseY GG yn renvoie flse pour montrer qu9une erreur s9est produiteF }

gette solution est l meilleure des Q proposes @eux qui onnissent le g sont hitus es hosesAD mis elle sou're d9un gros prolme X son utilistion n9est ps du tout videnteF sl est en prtiulier impossile de rliser le lul a/(b / c) de mnire simple et intuitiveF
Ces 3 solutions proposes sont prsentes titre d'illustration de ce qu'il ne faut pas faire. La solution correcte est prsente dans la suite.

La gestion des exceptions


oyons omment rsoudre e prolme de mnire lgnte en gCCF

Principe gnral
ve prinipe gnrl des exeptions est le suivnt X ! on re des zones o l9ordinteur v essayer le ode en shnt qu9une erreur peut survenir Y ! si une erreur survientD on l signle en lanant un objet qui ontient des informtions sur l9erreur Y ! l9endroit o l9on souhite grer les erreurs survenuesD on attrape l9ojet et on gre l9erreurF g9est un peu omme si vous tiez oins sur une le dserteF ous lneriez l mer une outeille ontennt ve des informtions qui permettent de vous retrouverF sl n9y urit lors plus qu9 esprer que quelqu9un ttrpe votre outeille F g9est l mme hose iiD on lne un ojet en esprnt qu9un utre out de ode le rttrperD sinon le progrmme plnterF ves motEls du gCC qui orrespondent es tions sont les suivnts X
3

3. Sinon vous mourrez de faim.

TQP

LA GESTION DES EXCEPTIONS

try{ ... } @en frnis essaye A signle une portion de ode o une erreur peut survenir Y ! throw @en frnis lance A signle l9erreur en lnnt un ojet Y ! catch(...){...} @en frnis attrape A introduit l portion de ode qui rupre l9ojet et gre l9erreurF oyons el plus en dtilF

Les trois mot-cls en dtail


gommenons pr tryD il est trs simple d9utilistionF sl permet d9introduire un lo senE sile ux exeptionsD 9estEEdire qu9on indique u ompilteur qu9une ertine portion du ode soure pourrit lner un ojet @l outeille l merAF yn l9utilise omme ei X
GG hu ode sns risqueF try { GG hu ode qui pourrit rer une erreurF }

intre les oldes du lo try on peut trouver n'importe quelle instruction C++D notmment un utre lo tryF ve motEl throw est lui ussi trs simple d9utilistionF g9est gre lui qu9on lne l outeille l merF v syntxe est l suivnte X throw expression yn peut lner n9importe quoi omme ojetD pr exemple un int qui orrespond u numro de l9erreur ou un string ontennt le texte de l9erreurF yn verr plus loin un type d9ojet prtiulirement utile pour les erreursF
throw IPQY GG yn lne l9entier IPQD pr exemple si l9erreur IPQ est survenue throw string@4irreur ftleF gonttez un dministrteur4AY GG yn peut lner un stringF throw ersonngeY GG yn peut tout fit lner une instne d9une lsseF throw QFIR B SFIPY GG yu mme le rsultt d9un lul

throw peut se trouver n'importe o dans le code mais, s'il n'est pas dans bloc try, l'erreur ne pourra pas tre rattrape et le programme plantera.

un

erminons ve le motEl catchF sl permet de rer un lo de gestion d9une exeption survenueF sl fut rer un lo catch pr type d9ojet lnF ghque lo try doit TQQ

CHAPITRE 39.

LA GESTION DES ERREURS AVEC LES EXCEPTIONS

oligtoirement tre suivi d9un lo catchF snversementD tout lo prd d9un lo try ou d9un utre lo catchF v syntxe est l suivnte X catch (type const& e){}

catch

doit tre

On attrape les exceptions par rfrence constante (d'o la prsence du &) et pas par valeur, ceci an d'viter une copie et de prserver le polymorphisme de l'objet reu. Souvenez-vous des ingrdients du polymorphisme : une rfrence ou un pointeur sont ncessaires. Comme l'objet lanc pourrait avoir des fonctions virtuelles, on l'attrape via une rfrence, de sorte que les deux ingrdients soient runis.

gel donne pr exemple X


try { GG ve lo sensile ux erreursF } th@int eA GGyn rttrpe les entiers lns @pour les entiersD une rfrene n9 ps de sensA { GGyn gre l9erreur } th@string onst8 eA GGyn rttrpe les strings lns { GG yn gre l9erreur } th@ersonnge onst8 eA GGyn rttrpe les personnges { GGyn gre l9erreur }

Vous pouvez mettre autant de blocs catch que vous voulez. Il en faut au moins un par type d'objet pouvant tre lanc. Qu'est-ce que cela va changer durant l'excution du programme ?

l9exutionD le progrmme se droule normlement omme si les instrutions try et les los catch n9tient ps lF r ontreD u moment o l9ordinteur rrive sur une instrution throwD il sute toutes les instrutions suivntes et ppelle le destruteur de tous les ojets dlrs l9intrieur du lo tryF sl herhe le lo catch orrespondnt l9ojet lnF erriv u lo catchD il exute e qui se trouve dns le lo et reprend l9exution du progrmme aprs le lo catchF TQR

LA GESTION DES EXCEPTIONS

Je me rpte mais c'est une erreur courante : l'excution reprend aprs le bloc catch et pas l'endroit o se trouve le throw.

ve mieux pour omprendre le fontionnement est enore de reprendre l9exemple de l lultrie et de l division pr HF

La bonne solution
eprenons don notre fontion de lultrieF
int division@int D int A { return GY }

xous svons qu9une erreur peut survenir si b vut HD il fut don lner une exepE tion dns e sF t9i hoisiD ritrirementD de lner une hne de rtresF g9est nnmoins un hoix intressntD puisque l9on peut insi drire le prolme survenuF
int division@int Dint A { if@ aa HA throw string@4ii X hivision pr zro 34AY else return GY }

ouvenezEvousD un throw doit toujours se trouver dns un lo try qui doit luiEmme tre suivi d9un lo catchF gel donne l struture suivnte X
int division@int Dint A { try { if@ aa HA throw string@4hivision pr zro 34AY else return GY } th@string onst8 hineA { GG yn gre l9exeptionF } }

sl ne reste plus lors qu9 grer l9erreurD 9estEEdire pr exemple 0her un messge d9erreurF TQS

CHAPITRE 39.

LA GESTION DES ERREURS AVEC LES EXCEPTIONS

int division@int Dint A { try { if@ aa HA throw string@4hivision pr zro 34AY else return GY } th@string onst8 hineA { err `` hine `` endlY } }

gel donne le rsultt suivnt X


leur pour X Q leur pour X H ii X hivision pr zro 3

Plutt que cout, on utilise dans le cas des erreurs le ux standard d'erreur nomm cerr. Il s'utilise exactement de la mme manire que cout. On peut ainsi sparer les informations qui doivent s'acher dans la console et les informations qui sont dues des erreurs.

gette mnire de fire est orreteF gependntD el ressemle un peu u muvis exemple numro P iEdessusF in e'etD l fontion est suseptile d9rire dns l onsole lors que e n9est ps son rleF he plusD le progrmme ontinue lors qu9une erreur est survenueF ve mieux fire serit lors de lner l9exeption dns l fontion et de ruprer l9erreurD si elle se produitD dns le mainF he ette mnireD elui qui ppelle l fontion onsiene qu9une erreur s9est produiteF
int division@int Dint A GG glule divis pr F { if@aaHA throw string@4ii X hivision pr zro 34AY else return GY } int min@A { int DY out `` 4leur pour X 4Y in bb Y out `` 4leur pour X 4Y

TQT

LES EXCEPTIONS STANDARD

in bb Y try {

out `` `` 4 G 4 `` `` 4 a 4 `` division@DA `` endlY } th@string onst8 hineA { err `` hine `` endlY } return HY

ous pouvez remrquer que le throw ne se trouve ps diretement l9intrieur du lo try mis qu9il se trouve l9intrieur d9une fontion qui est ppeleD elleD dns un lo tryF
Le else dans la fonction division n'est pas ncessaire puisque si l'exception est leve, le reste du code jusqu'au catch n'est pas excut.

gette foisD le progrmme ne plnte plus et l fontion n9 plus d9e'et de ordF g9est l meilleure solutionF

Les exceptions standard


wintennt que l9on sit grer les exeptionsD l question priniple est de svoir quel type d9ojet lnerF te vous i prsent uprvnt l possiilit de lner des exeptions de type entier ou stringF yn peut ussiD pr exempleD lner un ojet qui ontiendrit plusieurs ttriuts omme X ! une phrse drivnt l9erreur Y ! le numro de l9erreur Y ! le niveu de l9erreur @erreur ftleD erreur mineureF F FA Y ! l9heure lquelle l9erreur est survenue Y ! etF n on moyen de rliser ei est de driver l lsse exception de l iliothque stndrd du gCCF ih ouiD l ussi l v vient notre seoursF
On parle d'exception et pas d'erreur puisque, si on la traite, ce n'est plus une erreur.

TQU

CHAPITRE 39.

LA GESTION DES ERREURS AVEC LES EXCEPTIONS

La classe exception
v lsse exception est l lsse de se de toutes les exeptions lnes pr l ilioE thque stndrdF ille est ussi spilement pense pour qu9on puisse l driver (n de rliser notre propre type d9exeptionF v d(nition de ette lsse est X
lss exeption { puliX exeption@A throw@A{ } GGgonstruteurF virtul ~exeption@A throw@AY GGhestruteurF virtul onst hrB wht@A onst throw@AY GGenvoie une hne 4 l g4 ontennt des infos sur l9erreurF }Y

our l9utiliserD il fut inlure le (hier d9enEtte orrespondnt soitD iiD le (hier exceptionF
Vous pouvez remarquer que la classe possde des fonctions virtuelles et donc galement un destructeur virtuel. C'est un bon exemple de polymorphisme. Les mthodes de la classe sont suivies du mot-cl throw. Cela sert indiquer que ces mthodes ne vont pas lancer d'exceptions. . . ce qui est plutt judicieux parce que, si la classe exception commence lancer des exceptions, on n'est pas sorti de l'auberge. Indiquer qu'une mthode ne lance pas d'exception est un mcanisme du C++ trs rarement utilis. En fait, cette classe est peu prs le seul endroit o vous verrez cela.

yn peut lors rer s propre lsse d9exeption en l drivnt gre un hritgeF gel donnerit pr exemple X
5inlude `exeptionb using nmespe stdY lss irreurX puli exeption { puliX irreur@int numeroaHD string onst8 phrsea44D int niveuaHA throw@A Xmnumero@numeroADmphrse@phrseADmniveu@niveuA {} virtul onst hrB wht@A onst throw@A { return mphrseFstr@AY }

TQV

LES EXCEPTIONS STANDARD

int getxiveu@A onst throw@A { return mniveuY } virtul ~irreur@A throw@A {} privteX int mnumeroY string mphrseY int mniveuY }Y GGxumro de l9erreur GGhesription de l9erreur GGxiveu de l9erreur

yn pourrit lors rrire l fontion de division de P entiers de l mnire suivnte X


int division@int Dint A GG glule divis pr F { if@aaHA throw irreur@ID4hivision pr zro4DPAY else return GY } int min@A { int DY out `` 4leur pour X 4Y in bb Y out `` 4leur pour X 4Y in bb Y try {

out `` `` 4 G 4 `` `` 4 a 4 `` division@DA `` endlY } th@stdXXexeption onst8 eA { err `` 4ii X 4 `` eFwht@A `` endlY } } return HY

gel donne l9exution X


leur pour X Q leur pour X H ii X hivision pr zro

TQW

CHAPITRE 39.

LA GESTION DES ERREURS AVEC LES EXCEPTIONS

Quel est l'intrt de driver la classe exception alors qu'on pourrait faire sa propre classe sans aucun hritage ?

ixellente questionF sl fut svoir que vous n9tes ps les seuls lner des exeptionsF gertines fontions stndrd lnent elles ussi des exeptionsF outes les exeptions lnes pr les fontions stndrd drivent de l lsse exception e qui permetD ve un ode gnriqueD de rttrper toutes les erreurs qui pourrient rriverF ge ode gE nrique est le suivnt X
th@stdXXexeption onst8 eA { err `` 4ii X 4 `` eFwht@A `` endlY }

gette possiilit rsulte du polymorphismeF yn ttrpe un ojet de type exception misD gre ux fontions virtuelles et l rfrene @les deux ingrdients 3AD 9est l mthode what() de l lsse (lle qui ser ppeleD e qui est justement e que l9on souhiteF v iliothque stndrd peut lner S types d9exeptions di'rents rsums dns le tleu suivnt X
Nom de la classe
bad_alloc bad_cast bad_exception bad_typeid ios_base::failure

Description

vne s9il se produit une erreur en mmoireF vne s9il se produit une erreur lors d9un dynamic_castF vne si uun catch ne orrespond un ojet lnF vne s9il se produit une erreur lors d9un typeidF vne s9il se produit une erreur ve un )uxF

yn peut pr exemple oserver un exemple de bad_alloc ve le ode suivnt X


5inlude `iostremb 5inlude `vetorb using nmespe stdY int min@A { try { vetor`intb @IHHHHHHHHHDIAY GGn tleu ien trop grnd } th@exeption onst8 eA GGyn rttrpe les exeptions stndrd de tous types { err `` 4ii X 4 `` eFwht@A `` endlY GGyn ffihe l desription de l9erreur }

TRH

LES EXCEPTIONS STANDARD

return HY

gel donne le rsultt suivnt dns l onsole X


ii X stdXXdllo

Si l'on avait attrap l'exception par valeur et pas par rfrence (c'est--dire sans le &), le message aurait t std::exception car le polymorphisme n'est pas conserv. C'est pour cela que l'on attrape toujours les exceptions par rfrence. Il est fort quand mme ce polymorphisme !

Le travail pr-mch
i omme moi @et euoup de progrmmeursA vous tes des finnts et que vous n9vez ps envie de rer votre propre lsse d9exeptionD shez qu9il existe un (hier stndrd qui ontient des lsses d9exeption pour les s les plus ourntsF ve (hier stdexcept ontient W lsses d9exeptions spres en P tgoriesD les exeptions  loE giques @logic errors en nglisA et les exeptions  d9exution @runtime errors en nglisAF outes les exeptions prsentes drivent de l lsse exception et possdent un onstruteur prennt en rgument une hne de rtres qui drit le prolmeF
Nom de la classe Catgorie Description
domain_error invalid_argument length_error out_of_range logic_error range_error overflow_error underflow_error

runtimeerror

logique logique logique logique logique exution exution exution exution

irreur de domine mthmtiqueF ergument invlide pss une fontionF ille invlideF irreur d9indie de tleuF eutre prolme de logiqueF irreur de domineF irreur d9overowF irreur d9underowF eutre type d9erreurF

i vous ne svez ps quoi hoisirD prenez simplement runtime_errorD el n9 de toute fon que peu d9importneF
Et comment les utilise-t-on ?

eprenons une dernire fois notre exemple de divisionF xous vons une erreur de doE mine mthmtique si l9rgument b est nulF ghoisissons don de lner une domain_ errorF TRI

CHAPITRE 39.

LA GESTION DES ERREURS AVEC LES EXCEPTIONS

int division@int Dint A GG glule divis pr F { if@aaHA throw dominerror@4hivision pr zro4AY else return GY }

e_error.

On aurait trs bien pu choisir une argument_error ou encore une runtim Cela n'a que peu d'importance puisque, en gnral, on attrape les exceptions par la mthode indique plus haut.

Les exceptions de vector


te vous i dit dns l9introdution qu9une erreur possile @et ournte 3A tit le s o un utilisteur herhe der l IHe se d9un vector de V lmentsF eder ux ojets stoks dns un tleuD vous svez le fire depuis longtemps X on utilise ien sr les rohets []F yr es rohets ne font uun testF i vous fournissez un index invlideD le progrmme v plnter et 9est toutF it prs e hpitreD on pourrit se demnder si 9est vriment une onne ideF tiliser une exeption en s d9erreur d9index vous prt peutEtre une onne ideF F F et ux onepteurs de l v ussi 3 g9est pour el que les vector @et les dequeA proposent une mthode ppele at() qui fit extement l mme hose que les rohets mis qui lne une exeption en s d9indie erronF
5inlude `vetorb 5inlude `iostremb using nmespe stdY int min@A { vetor`douleb t@SD QFIRAY try {

GGn tleu de S nomres virgule

tFt@VA a RFY GGyn essye de modifier l Vme se } th@exeption onst8 eA { err `` 4ii X 4 `` eFwht@A `` endlY } return HY

gel nous donne X


ii X vetorXXwrngehek

TRP

LES ASSERTIONS

inore un nouveu type d9exeption 3 yuiD ouiD mis e n9est ps grve rD omme je vous l9i ditD tous les types d9exeptions utiliss drivent de l lsse exception et notre catch  stndrd est don su0sntF r onsquentD il n9y qu9une seule syntxe pprendreF lutt symp non c
En pratique, on utilise trs rarement, voire mme jamais la mthode at(). On considre plutt que c'est l'utilisateur de vector d'utiliser le tableau correctement.

erminons ve un point qui pourrit vous suver l vie lors de l leture de odes soures osursF

Relancer une exception


sl est possile de relner une exeption reue pr un lo catch (n de l triter une deuxime foisD plus loin dns le odeF our e fireD il fut utiliser le motEl throw sns expression derrireF
th@exeption onst8 eA GG ttrpe toutes les exeptions { GGyn trite une premire fois l9exeption err `` 4iiX 4 `` eFwht@A `` endlY throwY GG it on relne l9exeption reue pour l retriter GG dns un utre lo th plus loin dns le odeF

Les assertions
ves exeptions 9est ien mis il y des s o mettre en ple tous es los try G catch est fstidieuxF ge n9est ps pour rien que vector propose les [] pour der ux lmentsF yn n9 ps toujours envie d9voir triter les exeptionsF sl existe un utre mnisme de dtetion et de gestion qui vient du lngge g X les ssertionsF

Claquer une assertion


our utiliser les ssertionsD il fut inlure le (hier d9enEtte cassertF it 9est ertiE nement l9tpe l plus di0ileF ne ssertion permet de tester si une expression est vrie ou nonF i 9est vriD rien ne se psse et le progrmme ontinueF r ontreD si le test est ngtifD le progrmme s9rrte rutlement et un messge d9erreur s90he dns le terminlF
5inlude `ssertb using nmespe stdY

TRQ

CHAPITRE 39.

LA GESTION DES ERREURS AVEC LES EXCEPTIONS

int min@A { int @SAY int @SAY ssert@ aa A Y GGyn vrifie que et sont gux GGreste du progrmme return HY

vors de l9exutionD rien ne se psseF xormlD les deux vriles sont glesF r ontreD si vous modi(ez l vleur de bD le messge suivnt s90he lors l9exution X
monrogX minFppXWX int min@AX essertion aa 9 filedF endon

g9est super X le messge d9erreur indique le (hier o se situe l9erreurD le nom de l fontion et mme l ligne 3 eve elD impossile de ne ps trouver l use d9erreurF te vous vis ien dit que 9tit simple 3
Mais pourquoi utiliser des exceptions si les assertions sont mieux ?

ettentionD je n9i ps dit que les ssertions tient mieux 3 ves deux mthodes de gestion des erreurs ont leur domine d9pplitionF i vous lquez une ssertionD le progrmme s9rrte rutlementF sl n9y uun moyen de rprer l9erreur et tenter de ontinuerF i vous vez un progrmme de chat et qu9il n9rrive ps se onneter u serveurD 9est une erreurF ous imeriez ien que votre progrmme ressye de se onneter plusieurs foisF sl fut don utiliser une exeption pour tenter de rprer l9erreurF ne ssertion urit ompltement tu le progrmmeF ge n9est lirement ps l onne solution dns e s 3 vous de hoisir e dont vous vez esoin u s pr sF

Dsactiver les assertions


n utre point fort des ssertions est l possiilit de les dsactiver totalementF hns e sD le ompilteur ignore simplement les lignes assert(...) et n9e'etue ps le test qui se trouve entre les prenthsesF einsiD le ode ser @lgrementA plus rpideD mis uun test ne ser e'etuF sl fut don hoisirF our dstiver les ssertionsD il fut jouter l9option -DNDEBUG l ligne de ompilE tionF i vous utilisez gode: :floksD el se fit via le menu project b build optionsF hns l fentre qui s9ouvreD sletionnez l9onglet Compiler settings puisD dns le hmp TRR

LES ASSERTIONS

Other optionsD

joutez simplement -DNDEBUG omme l (gure QWFIF

Figure QWFI ! hstiver les ssertions

eve ette option tiveD le ode d9exemple prdent s9exute sns prolme mme si a est di'rent de bF v ligne de test simplement t ignore pr le ompilteurF
Les assertions sont souvent utilises durant la phase de cration d'un programme pour tester si tout se passe bien. Une fois que l'on sait que le programme fonctionne, on les dsactive, on compile et on vend le programme au client. Ce dernier ne veut pas de message d'erreur et il veut un programme rapide. Si par contre il dcouvre un bug, on ractive les assertions et on cherche l'erreur. C'est vraiment un outil destin aux dveloppeurs, au contraire des exceptions.

En rsum
! hns tous les progrmmesD des erreurs peuvent survenirF ves exeptions servent rprer es erreursF ! ves exeptions sont lnes gre u motEl throwD pl dns un lo tryD et rttrpes pr un lo catchF ! v iliothque stndrd propose l lsse exception omme se pour rer ses exeptions personnlisesF ! ves ssertions permettent ux dveloppeurs de trouver filement les erreurs en fiE snt des tests lors de l phse de rtion d9un progrmmeF TRS

CHAPITRE 39.

LA GESTION DES ERREURS AVEC LES EXCEPTIONS

TRT

Chapitre

40
Dicult :

Crer des templates

e but de la programmation, en tout cas l'origine, est de simplier les tches rptitives en les faisant s'excuter sur votre ordinateur plutt que devoir faire tous les calculs la main. On veut donc s'viter du travail la chane. Nous allons voir comment faire s'excuter un mme code pour dirents types de variables ou classes. Cela nous permettra d'viter la tche rptitive de rcriture de portions de code semblables pour dirents types. Pensez la classe vector : quel que soit le type d'objets que l'on y stocke, le tableau aura le mme comportement et permettra d'ajouter et supprimer des lments, de renvoyer sa taille, etc. Finalement, peu importe que ce soit un tableau d'entiers ou de nombres rels. La force des templates est d'autoriser une fonction ou une classe utiliser des types dirents. Leur marque de fabrique est la prsence des chevrons < et > et, vous l'aurez remarqu, la STL utilise normment ce concept.

TRU

CHAPITRE 40.

CRER DES TEMPLATES

L'utilisation des templates est un sujet trs vaste. Il y a mme des livres entiers qui y sont consacrs tellement cela peut devenir complexe. Ce chapitre n'est qu'une brve introduction au domaine.

Les fonctions templates


Ce que l'on aimerait faire
sl rrive souvent qu9on it esoin d9oprtions mthmtiques dns un progrmmeF ne oprtion toute simple est elle qui onsiste trouver le plus grnd de deux nomresF hns le s des nomres entiersD on pourrit rire une fontion omme suit X
int mximum@int Dint A { if@bA return Y else return Y }

Une telle fonction existe bien sr dans la SL. Elle se trouve dans l'en-tte algorithm et s'appelle max()

gette fontion est trs ien et elle n9 ps de prolmeF gependntD si un utilisteur de votre fontion imerit utiliser des double l ple des intD il risque d9voir un prolmeF sl fudrit don fournir glement une version de ette fontion utilisnt des nomres relsF gel ne devrit ps vous poser de prolme e stde du oursF our tre rigoureuxD il fudrit glement fournir une fontion de e type pour les charD les unsigned intD les nomres rtionnelsD etF yn se rend vite ompte que l the est trs rptitiveF gependntD il y un point ommun toutes es fontions X le corps de la fonction est strictement identiqueF uel que soit le typeD le tritement que l9on e'etue est le mmeF yn se rend ompte que l9lgorithme utilis dns l fontion est gnriqueF sl serit don intressnt de pouvoir rire une seule fois l fontion en disnt u ompilteur X  gette fontion est l mme pour tous les typesD fis le sle oulot de reopie du ode toiEmmeF ih ienD el tome ien pre que 9est e que permettent les templates en gCC et 9est e que nous llons pprendre utiliser dns l suiteF
Le terme franais pour template est modle. Le nom est bien choisi car il dcrit prcisment ce que nous allons faire. Nous allons crire un modle de fonction et le compilateur va utiliser ce modle dans les dirents cas qui nous intressent.

TRV

LES FONCTIONS TEMPLATES

Une premire fonction template


our indiquer u ompilteur que l9on veut fire une fontion gnriqueD on dlre un  type vrile qui peut reprsenter n9importe quel utre typeF yn prle de type gnriqueF gel se fit de l mnire suivnte X
templte`typenme b

ous pouvez remrquer qutre hoses importntes X IF out d9ordD le motEl template prvient le ompilteur que l prohine hose dont on v lui prler ser gnrique Y PF insuiteD les symoles  < et  > D que vous vez ertinement dj perus dns le hpitre sur les vector et sur l vD onstituent l mrque de frique des templtes Y QF uis le motEl typename indique u ompilteur que T ser le nom que l9on v utiliser pour notre  type spil qui remple n9importe quoi Y RF in(nD il n9y e de pointEvirgule l (n de l ligneF v ligne de ode prdente indique u ompilteur que dns l suiteD T ser un type gnrique pouvnt reprsenter n9importe quel utre typeF yn pourr don utiliser e T dns notre fontion omme type pour les rguments et pour le type de retourF
templte `typenme b mximum@onst 8 D onst 8 A { if@bA return Y else return Y }

und il voit elD le ompilteur gnre utomtiquement une srie de fontions maximum() pour tous les types dont vous vez esoinF gel veut dire que si vous vez esoin de ette fontion pour des entiersD le ompilteur re l fontion X
int mximum@onst int8 Donst int8 A { if@bA return Y else return Y }

F F F et de mme pour les doubleD charD etF g9est le ompilteur qui se frit le trvil de reopie 3 rfitD on peut ller fire l sieste pendnt e tempsF XEA yn peut rire un petit progrmme de test X TRW

CHAPITRE 40.

CRER DES TEMPLATES

5inlude `iostremb using nmespe stdY templte `typenme b mximum@onst 8 Donst 8 A { if@bA return Y else return Y } int min@A { doule pi@QFIRAY doule e@PFUIAY out `` mximum`douleb@piDeA `` endlY GGtilise l 4version doule4 de l fontion int ve@EIAY int dernieritge@IPAY out `` mximum`intb@veDdernieritgeA `` endlY GGtilise l 4version int4 de l fontion unsigned int @RQAY unsigned int @VUAY out `` mximum`unsigned intb@DA `` endlY GGtilise l 4version unsigned int4 de l fontionF } return HY

it tout el se psse sns que l9on it esoin d9rire plus de odeF sl fut juste indiquer entre des hevrons quelle  version de l fontion on souhite utiliserD omme pour les vector en somme X on devit indiquer quelle  version du tleu on souhitit utiliserF sl n9est ps toujours utile d9indiquer entre hevrons quel type on souhite utiliser pour les fontions templtesF ve ompilteur est ssez intelligent pour deviner e que vous souhitez fireF wis dns des s ompliqus ou s9il y plusieurs rguments de types di'rentsD lors il devient nessire de spi(er l versionF
int min@A { doule pi@QFIRAY doule e@PFUIAY

TSH

DES FONCTIONS PLUS COMPLIQUES

<