This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
in204:tds:sujets:td4:part2 [2020/09/30 06:43] bmonsuez |
in204:tds:sujets:td4:part2 [2022/11/18 10:49] (current) |
||
|---|---|---|---|
| Line 107: | Line 107: | ||
| <hidden Correction Complétion de la classe interval> | <hidden Correction Complétion de la classe interval> | ||
| - | <nodisp 2> | ||
| Nous débutons par compléter la classe ''interval''. La classe ''interval'' doit exposer au moins deux méthodes que sont les méthodes : | Nous débutons par compléter la classe ''interval''. La classe ''interval'' doit exposer au moins deux méthodes que sont les méthodes : | ||
| Line 210: | Line 209: | ||
| \\ | \\ | ||
| - | </nodisp> | ||
| </hidden> | </hidden> | ||
| Line 283: | Line 281: | ||
| } | } | ||
| </code> \\ \\ Il faut désormais implanter les opérateurs d'incrémentation de l'itérateur (ie. pour passer à la valeur suivante). C'est l'opérateur ''++'' qui a est sélectionné, cependant cet opérateur possède deux syntaxes : (1) ''++it'' qui signifie applique l'opération ''++'' à l'objet ''it'' et retourne une référence à cet objet après que l'opération ''++'' a été effectuée; (2) ''it++'' qui signifie fait une copie de l'objet //copy//, applique l'opération à l'objet ''it'' et retourne l'objet //copy// comme résultat de l'opération. L'opérateur ''operator ++()'' correspond à la première synataxe, l'opérateur ''operator ++(int)'' correspond à la seconde syntaxe. Ce qui se traduit par : <code> | </code> \\ \\ Il faut désormais implanter les opérateurs d'incrémentation de l'itérateur (ie. pour passer à la valeur suivante). C'est l'opérateur ''++'' qui a est sélectionné, cependant cet opérateur possède deux syntaxes : (1) ''++it'' qui signifie applique l'opération ''++'' à l'objet ''it'' et retourne une référence à cet objet après que l'opération ''++'' a été effectuée; (2) ''it++'' qui signifie fait une copie de l'objet //copy//, applique l'opération à l'objet ''it'' et retourne l'objet //copy// comme résultat de l'opération. L'opérateur ''operator ++()'' correspond à la première synataxe, l'opérateur ''operator ++(int)'' correspond à la seconde syntaxe. Ce qui se traduit par : <code> | ||
| - | iterator& operator() | + | iterator& operator++() |
| { | { | ||
| // Passe à la valeur suivant si nous ne sommes pas | // Passe à la valeur suivant si nous ne sommes pas | ||
| // déjà à la fin de l'interval. | // déjà à la fin de l'interval. | ||
| - | if(mCurrent < mInterval->maxValue) | + | if(mCurrent <= mInterval->maxValue) |
| mCurrent ++; | mCurrent ++; | ||
| return *this; | return *this; | ||
| } | } | ||
| - | iterator operator() | + | iterator operator++(int) |
| { | { | ||
| - | iterator it(*this); // Crée une copie de l'itérateur. | + | interval_iterator it(*this); // Crée une copie de l'itérateur. |
| ++(*this); // Incrément l'itérateur courant en appellant | ++(*this); // Incrément l'itérateur courant en appellant | ||
| // l'opérateur iterator& operator() | // l'opérateur iterator& operator() | ||
| Line 299: | Line 297: | ||
| } | } | ||
| </code> \\ Il ne reste plus qu'à implanter les opérateurs relatifs à la comparaison. Deux itérateurs sont égaux s'ils font références à la même valeur située dans le même containeur. Dans ce cas, nous devons avoir les champs ''mCurrent'' et ''mInterval'' qui doivent être égaux. <code cpp> | </code> \\ Il ne reste plus qu'à implanter les opérateurs relatifs à la comparaison. Deux itérateurs sont égaux s'ils font références à la même valeur située dans le même containeur. Dans ce cas, nous devons avoir les champs ''mCurrent'' et ''mInterval'' qui doivent être égaux. <code cpp> | ||
| - | bool operator ==(const iterator& anotherIterator) const | + | bool operator ==(const interval_iterator& anotherIterator) const |
| { | { | ||
| return mCurrent == anotherIterator.mCurrent && | return mCurrent == anotherIterator.mCurrent && | ||
| *mInterval == *anotherIterator.mInterval; | *mInterval == *anotherIterator.mInterval; | ||
| } | } | ||
| - | bool operator !=(const iterator& anotherIterator) const | + | bool operator !=(const interval_iterator& anotherIterator) const |
| { | { | ||
| return mCurrent != anotherIterator.mCurrent || | return mCurrent != anotherIterator.mCurrent || | ||
| Line 321: | Line 319: | ||
| // l'itérateur courant fait référence au même élément que l'itérateur | // l'itérateur courant fait référence au même élément que l'itérateur | ||
| // passé en argument. | // passé en argument. | ||
| - | iterator operator=(const interval_iterator& anotherIterator) | + | interval_iterator& operator=(const interval_iterator& anotherIterator) |
| { | { | ||
| mCurrent = anotherIterator.mCurrent; | mCurrent = anotherIterator.mCurrent; | ||
| mInterval = anotherIterator.mInterval; | mInterval = anotherIterator.mInterval; | ||
| + | return *this; | ||
| } | } | ||
| // Opération de permutation. | // Opération de permutation. | ||
| Line 334: | Line 333: | ||
| void swap(interval_iterator& anotherIterator) | void swap(interval_iterator& anotherIterator) | ||
| { | { | ||
| - | std::swap(mCurrent, anotherInterator.mCurrent); | + | std::swap(mCurrent, anotherIterator.mCurrent); |
| - | std::swpa(mInterval, anotherIterator.mInterval); | + | std::swap(mInterval, anotherIterator.mInterval); |
| } | } | ||
| </code> \\ Et normalement l'ensemble des éléments ont été définis pour à la classe ''interval_iterator'' pour que ce dernier puisse répondre aux exigences auxquelles un itérateur de type [[https://en.cppreference.com/w/cpp/named_req/ForwardIterator|forward iterator]] doit répondre. | </code> \\ Et normalement l'ensemble des éléments ont été définis pour à la classe ''interval_iterator'' pour que ce dernier puisse répondre aux exigences auxquelles un itérateur de type [[https://en.cppreference.com/w/cpp/named_req/ForwardIterator|forward iterator]] doit répondre. | ||
| - | </nodisp> | + | |
| </hidden> | </hidden> | ||