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> | ||