Je voudrais savoir quel sens vous mettez derriere le mot clé "const", ou
plutot quel contrat une fonction qui a des parametres const doit remplir.
Pour être plus clair, voici le cas qui m'interesse plus particulierement :
nous avons une classe "iterator" qui me permet d'itérer sur une structure de
donnée. Un "iterator" a de bonnes raisons (qui ne sont pas discutables :))
d'être un peu lourd à copier. Maintenant imaginons une fonction
"nbElementsAfter" qui fait ca :
int nbElementsAfter(iterator& it)
{
int nb = 0;
while(it.next()) nb++;
for(int i=0; i<nb; i++) it.prev();
return nb;
}
Est-ce que cette fonction doit prendre un iterator& ou un const iterator& ?
Lequel de ces contrats vous semble le plus sensé pour une fonction qui prend
un const iterator& : "je ne modifierai pas l'iterateur" ou "l'iterateur
pointera au même endroit avant et apres l'appel" (ou encore autre chose ?) ?
Le problème, c'est que l'opérateur lui aussi a un nom très explicit. On sait bien ce que c'est l'addition en C++ ; c'est aussi défini que le mot « add ».
L'addition n'est pas définie sur des types abstraits que tu créés toi-même... Ça pourrait être une chose comme ça pourrait en être une autre. Tant qu'elle est pas définie, on sait pas ce que c'est.
Bien sûr, on sort des cas triviaux comme ta classe Decimal.
Le problème, c'est que l'opérateur lui aussi a un nom très
explicit. On sait bien ce que c'est l'addition en C++ ; c'est
aussi défini que le mot « add ».
L'addition n'est pas définie sur des types abstraits que tu créés
toi-même...
Ça pourrait être une chose comme ça pourrait en être une autre.
Tant qu'elle est pas définie, on sait pas ce que c'est.
Bien sûr, on sort des cas triviaux comme ta classe Decimal.
Le problème, c'est que l'opérateur lui aussi a un nom très explicit. On sait bien ce que c'est l'addition en C++ ; c'est aussi défini que le mot « add ».
L'addition n'est pas définie sur des types abstraits que tu créés toi-même... Ça pourrait être une chose comme ça pourrait en être une autre. Tant qu'elle est pas définie, on sait pas ce que c'est.
Bien sûr, on sort des cas triviaux comme ta classe Decimal.
loufoque
la signification de « removal » n'a rien à voir avec sa signification habituelle en anglais.
Ça me semble pourtant parfaitement correspondre. std::remove enlève les éléments d'un itérateur (elle les filtre) et list<>::erase efface les éléments de la liste.
C'est subtil dans le sens où certains gens ne voient pas la différence entre enlever et effacer.
la
signification de « removal » n'a rien à voir avec sa
signification habituelle en anglais.
Ça me semble pourtant parfaitement correspondre.
std::remove enlève les éléments d'un itérateur (elle les filtre) et
list<>::erase efface les éléments de la liste.
C'est subtil dans le sens où certains gens ne voient pas la différence
entre enlever et effacer.
la signification de « removal » n'a rien à voir avec sa signification habituelle en anglais.
Ça me semble pourtant parfaitement correspondre. std::remove enlève les éléments d'un itérateur (elle les filtre) et list<>::erase efface les éléments de la liste.
C'est subtil dans le sens où certains gens ne voient pas la différence entre enlever et effacer.
kanze
loufoque wrote:
la signification de « removal » n'a rien à voir avec sa signification habituelle en anglais.
Ça me semble pourtant parfaitement correspondre. std::remove enlève les éléments d'un itérateur (elle les filtre) et list<>::erase efface les éléments de la liste.
Est-ce que tu pourrais me l'expliquer ? list<>::erase enlève bien des éléments d'une liste, de même que list<>::remove ; la seule différence que je vois, c'est sur le critère de choix des éléments. std::remove tout court n'enlève rien de nulle part, à ce que je vois.
C'est subtil dans le sens où certains gens ne voient pas la différence entre enlever et effacer.
Qui est ?
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
loufoque wrote:
la signification de « removal » n'a rien à voir avec sa
signification habituelle en anglais.
Ça me semble pourtant parfaitement correspondre. std::remove
enlève les éléments d'un itérateur (elle les filtre) et
list<>::erase efface les éléments de la liste.
Est-ce que tu pourrais me l'expliquer ? list<>::erase enlève
bien des éléments d'une liste, de même que list<>::remove ; la
seule différence que je vois, c'est sur le critère de choix des
éléments. std::remove tout court n'enlève rien de nulle part, à
ce que je vois.
C'est subtil dans le sens où certains gens ne voient pas la
différence entre enlever et effacer.
Qui est ?
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
la signification de « removal » n'a rien à voir avec sa signification habituelle en anglais.
Ça me semble pourtant parfaitement correspondre. std::remove enlève les éléments d'un itérateur (elle les filtre) et list<>::erase efface les éléments de la liste.
Est-ce que tu pourrais me l'expliquer ? list<>::erase enlève bien des éléments d'une liste, de même que list<>::remove ; la seule différence que je vois, c'est sur le critère de choix des éléments. std::remove tout court n'enlève rien de nulle part, à ce que je vois.
C'est subtil dans le sens où certains gens ne voient pas la différence entre enlever et effacer.
Qui est ?
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
kanze
loufoque wrote:
Le problème, c'est que l'opérateur lui aussi a un nom très explicit. On sait bien ce que c'est l'addition en C++ ; c'est aussi défini que le mot « add ».
L'addition n'est pas définie sur des types abstraits que tu créés toi-même...
Au moins que je le définisse.
L'« addition » (ou le mot « add ») ont une signification propre. On s'en sert comme nom de fonction quand la fonction effectue une opération qui s'apparente à la signification du mot.
L'opérateur + en C++ a une signification propre. On s'en sert quand l'opération s'apparente à cette signification. On ne fait pas n'importe quoi, au moins que le but soit l'obfuscation.
Ça pourrait être une chose comme ça pourrait en être une autre.
Si on tient à l'obfuscation, oui. Si on tient à la lisibilité, on respecte la sémantique des noms. Que ces noms soient des noms de fonction classiques, ou des opérateurs surchargés.
Tant qu'elle est pas définie, on sait pas ce que c'est.
Bien sûr, on sort des cas triviaux comme ta classe Decimal.
Si ce n'ets pas un cas trivial, peut-être que le surcharge ne convient pas ?
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
loufoque wrote:
Le problème, c'est que l'opérateur lui aussi a un nom très
explicit. On sait bien ce que c'est l'addition en C++ ;
c'est aussi défini que le mot « add ».
L'addition n'est pas définie sur des types abstraits que tu
créés toi-même...
Au moins que je le définisse.
L'« addition » (ou le mot « add ») ont une signification propre.
On s'en sert comme nom de fonction quand la fonction effectue
une opération qui s'apparente à la signification du mot.
L'opérateur + en C++ a une signification propre. On s'en sert
quand l'opération s'apparente à cette signification. On ne fait
pas n'importe quoi, au moins que le but soit l'obfuscation.
Ça pourrait être une chose comme ça pourrait en être une
autre.
Si on tient à l'obfuscation, oui. Si on tient à la lisibilité,
on respecte la sémantique des noms. Que ces noms soient des noms
de fonction classiques, ou des opérateurs surchargés.
Tant qu'elle est pas définie, on sait pas ce que c'est.
Bien sûr, on sort des cas triviaux comme ta classe Decimal.
Si ce n'ets pas un cas trivial, peut-être que le surcharge ne
convient pas ?
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Le problème, c'est que l'opérateur lui aussi a un nom très explicit. On sait bien ce que c'est l'addition en C++ ; c'est aussi défini que le mot « add ».
L'addition n'est pas définie sur des types abstraits que tu créés toi-même...
Au moins que je le définisse.
L'« addition » (ou le mot « add ») ont une signification propre. On s'en sert comme nom de fonction quand la fonction effectue une opération qui s'apparente à la signification du mot.
L'opérateur + en C++ a une signification propre. On s'en sert quand l'opération s'apparente à cette signification. On ne fait pas n'importe quoi, au moins que le but soit l'obfuscation.
Ça pourrait être une chose comme ça pourrait en être une autre.
Si on tient à l'obfuscation, oui. Si on tient à la lisibilité, on respecte la sémantique des noms. Que ces noms soient des noms de fonction classiques, ou des opérateurs surchargés.
Tant qu'elle est pas définie, on sait pas ce que c'est.
Bien sûr, on sort des cas triviaux comme ta classe Decimal.
Si ce n'ets pas un cas trivial, peut-être que le surcharge ne convient pas ?
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Yoxoman
C'est subtil dans le sens où certains gens ne voient pas la différence entre enlever et effacer.
Qui est ?
On ne peut pas les employer dans le même contexte :
- On enlève ses chaussures, on enlève les doigts de son nez, etc. L'objet existe toujours, il est déplacé, mis de côté.
- On efface un tableau, on efface la mémoire, etc. L'objet n'existe plus.
-- "Yo!" Martin Heidegger
C'est subtil dans le sens où certains gens ne voient pas la
différence entre enlever et effacer.
Qui est ?
On ne peut pas les employer dans le même contexte :
- On enlève ses chaussures, on enlève les doigts de son nez, etc.
L'objet existe toujours, il est déplacé, mis de côté.
- On efface un tableau, on efface la mémoire, etc. L'objet n'existe
plus.
- On efface un tableau, on efface la mémoire, etc. L'objet n'existe plus.
Moi, quand j'efface un tableau, le tableau est toujours là après... ;-)
Tu as de la chance.
Je dois appuyer trop fort.
-- "Yo!" Martin Heidegger
kanze
Yoxoman wrote:
C'est subtil dans le sens où certains gens ne voient pas la différence entre enlever et effacer.
Qui est ?
On ne peut pas les employer dans le même contexte :
Oui, mais... Pourquoi ? Ce qui m'intéresse, c'est comment tu expliques cette différence à partir d'une différence sémantique.
- On enlève ses chaussures, on enlève les doigts de son nez, etc. L'objet existe toujours, il est déplacé, mis de côté.
D'accord. Encore que je ne suis pas sûr qu'il n'y a pas de contre-exemples : enlever les poussières d'en dessous le lit, par exemple.
- On efface un tableau, on efface la mémoire, etc. L'objet n'existe plus.
Le tableau ou la mémoire n'existe plus ?
Je crois que c'est plutôt un sens d'enlever quelque chose de son support, ou de remettre à blanc le support. En tout cas, dans l'anglais « erase », il y a bien l'idée d'un support qui est en fait l'objet de l'action. En programmation, sans doute pour des raisons historiques, on a tendance à utiliser « clear » dans ce sens, plutôt qu'« erase » (alors qu'on dirait jamais « clear the blackboard ».) Appliquer litéralement à un élément d'une collection, « erase » signifierait « remettre l'élément à zér o, sans l'enlever de la collection ».
Mais ce n'est pas là mon propos. Je n'ai rien contre l'utilisation de « erase » dans ce contexte, même si ce n'est pas le mot que j'aurais choisi moi-même. Où j'ai un problème, c'est cette distinction entre « erase » et « remove ». Parce qu'en fin de compte, list<>::erase() et list<>::remove font exactement la même chose -- la seule différence, c'est dans leur manière de choisir l'élément ou les éléments à enlever.
Et évidemment, le fait que std::remove() n'enlève rien.
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Yoxoman wrote:
C'est subtil dans le sens où certains gens ne voient pas la
différence entre enlever et effacer.
Qui est ?
On ne peut pas les employer dans le même contexte :
Oui, mais... Pourquoi ? Ce qui m'intéresse, c'est comment tu
expliques cette différence à partir d'une différence sémantique.
- On enlève ses chaussures, on enlève les doigts de son nez,
etc. L'objet existe toujours, il est déplacé, mis de côté.
D'accord. Encore que je ne suis pas sûr qu'il n'y a pas de
contre-exemples : enlever les poussières d'en dessous le lit,
par exemple.
- On efface un tableau, on efface la mémoire, etc. L'objet
n'existe plus.
Le tableau ou la mémoire n'existe plus ?
Je crois que c'est plutôt un sens d'enlever quelque chose de son
support, ou de remettre à blanc le support. En tout cas, dans
l'anglais « erase », il y a bien l'idée d'un support qui est en
fait l'objet de l'action. En programmation, sans doute pour des
raisons historiques, on a tendance à utiliser « clear » dans ce
sens, plutôt qu'« erase » (alors qu'on dirait jamais « clear the
blackboard ».) Appliquer litéralement à un élément d'une
collection, « erase » signifierait « remettre l'élément à zér o,
sans l'enlever de la collection ».
Mais ce n'est pas là mon propos. Je n'ai rien contre
l'utilisation de « erase » dans ce contexte, même si ce n'est
pas le mot que j'aurais choisi moi-même. Où j'ai un problème,
c'est cette distinction entre « erase » et « remove ». Parce
qu'en fin de compte, list<>::erase() et list<>::remove font
exactement la même chose -- la seule différence, c'est dans leur
manière de choisir l'élément ou les éléments à enlever.
Et évidemment, le fait que std::remove() n'enlève rien.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
C'est subtil dans le sens où certains gens ne voient pas la différence entre enlever et effacer.
Qui est ?
On ne peut pas les employer dans le même contexte :
Oui, mais... Pourquoi ? Ce qui m'intéresse, c'est comment tu expliques cette différence à partir d'une différence sémantique.
- On enlève ses chaussures, on enlève les doigts de son nez, etc. L'objet existe toujours, il est déplacé, mis de côté.
D'accord. Encore que je ne suis pas sûr qu'il n'y a pas de contre-exemples : enlever les poussières d'en dessous le lit, par exemple.
- On efface un tableau, on efface la mémoire, etc. L'objet n'existe plus.
Le tableau ou la mémoire n'existe plus ?
Je crois que c'est plutôt un sens d'enlever quelque chose de son support, ou de remettre à blanc le support. En tout cas, dans l'anglais « erase », il y a bien l'idée d'un support qui est en fait l'objet de l'action. En programmation, sans doute pour des raisons historiques, on a tendance à utiliser « clear » dans ce sens, plutôt qu'« erase » (alors qu'on dirait jamais « clear the blackboard ».) Appliquer litéralement à un élément d'une collection, « erase » signifierait « remettre l'élément à zér o, sans l'enlever de la collection ».
Mais ce n'est pas là mon propos. Je n'ai rien contre l'utilisation de « erase » dans ce contexte, même si ce n'est pas le mot que j'aurais choisi moi-même. Où j'ai un problème, c'est cette distinction entre « erase » et « remove ». Parce qu'en fin de compte, list<>::erase() et list<>::remove font exactement la même chose -- la seule différence, c'est dans leur manière de choisir l'élément ou les éléments à enlever.
Et évidemment, le fait que std::remove() n'enlève rien.
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Falk Tannhäuser
kanze wrote:
Yoxoman wrote:
- On enlève ses chaussures, on enlève les doigts de son nez, etc. L'objet existe toujours, il est déplacé, mis de côté.
D'accord. Encore que je ne suis pas sûr qu'il n'y a pas de contre-exemples : enlever les poussières d'en dessous le lit, par exemple.
D'après <http://www.rijeka.com/phun/general/murphy.htm>, il ne s'agirait pas d'un contre-exemple :
"IMBESI'S LAW OF THE CONSERVATION OF FILTH: In order for something to become clean, something else must become dirty. FREEMAN'S EXTENSION: ...but you can get everything dirty without getting anything clean."
SNCR, Falk
kanze wrote:
Yoxoman wrote:
- On enlève ses chaussures, on enlève les doigts de son nez,
etc. L'objet existe toujours, il est déplacé, mis de côté.
D'accord. Encore que je ne suis pas sûr qu'il n'y a pas de
contre-exemples : enlever les poussières d'en dessous le lit,
par exemple.
D'après <http://www.rijeka.com/phun/general/murphy.htm>,
il ne s'agirait pas d'un contre-exemple :
"IMBESI'S LAW OF THE CONSERVATION OF FILTH:
In order for something to become clean, something
else must become dirty.
FREEMAN'S EXTENSION:
...but you can get everything dirty without getting
anything clean."
- On enlève ses chaussures, on enlève les doigts de son nez, etc. L'objet existe toujours, il est déplacé, mis de côté.
D'accord. Encore que je ne suis pas sûr qu'il n'y a pas de contre-exemples : enlever les poussières d'en dessous le lit, par exemple.
D'après <http://www.rijeka.com/phun/general/murphy.htm>, il ne s'agirait pas d'un contre-exemple :
"IMBESI'S LAW OF THE CONSERVATION OF FILTH: In order for something to become clean, something else must become dirty. FREEMAN'S EXTENSION: ...but you can get everything dirty without getting anything clean."
SNCR, Falk
Yoxoman
Où j'ai un problème, c'est cette distinction entre « erase » et « remove ». Parce qu'en fin de compte, list<>::erase() et list<>::remove font exactement la même chose -- la seule différence, c'est dans leur manière de choisir l'élément ou les éléments à enlever.
Ils ne font pas *exactement* la même chose, heureusement. Et cela peut justifier leur différence terminologique : dans leurs actions, erase et remove ne s'appliquent pas à la même structure.
De la même manière qu'on efface *le* tableau et qu'on enlève *quelque chose sur le* tableau, list<>::erase s'applique à la liste elle-même (ou à une de ses parties), tandis que list<>::remove s'applique à ses éléments.
list<>::erase a une sémantique orientée ensemble : on invalide une partie de la liste, en bloc.
list<>::remove a une sémantique orientée élément : on invalide des éléments déterminés de l'ensemble "liste".
Et évidemment, le fait que std::remove() n'enlève rien.
Parce que les algorithmes n'en ont pas le droit. Mais l'action est tout de même comparable à celle de list<>::remove, donc il peut sembler normal d'avoir le même nom.
-- "Yo!" Martin Heidegger
Où j'ai un problème,
c'est cette distinction entre « erase » et « remove ». Parce
qu'en fin de compte, list<>::erase() et list<>::remove font
exactement la même chose -- la seule différence, c'est dans leur
manière de choisir l'élément ou les éléments à enlever.
Ils ne font pas *exactement* la même chose, heureusement. Et cela peut
justifier leur différence terminologique : dans leurs actions, erase et
remove ne s'appliquent pas à la même structure.
De la même manière qu'on efface *le* tableau et qu'on enlève *quelque
chose sur le* tableau, list<>::erase s'applique à la liste elle-même (ou
à une de ses parties), tandis que list<>::remove s'applique à ses
éléments.
list<>::erase a une sémantique orientée ensemble : on invalide une
partie de la liste, en bloc.
list<>::remove a une sémantique orientée élément : on invalide des
éléments déterminés de l'ensemble "liste".
Et évidemment, le fait que std::remove() n'enlève rien.
Parce que les algorithmes n'en ont pas le droit. Mais l'action est tout
de même comparable à celle de list<>::remove, donc il peut sembler
normal d'avoir le même nom.
Où j'ai un problème, c'est cette distinction entre « erase » et « remove ». Parce qu'en fin de compte, list<>::erase() et list<>::remove font exactement la même chose -- la seule différence, c'est dans leur manière de choisir l'élément ou les éléments à enlever.
Ils ne font pas *exactement* la même chose, heureusement. Et cela peut justifier leur différence terminologique : dans leurs actions, erase et remove ne s'appliquent pas à la même structure.
De la même manière qu'on efface *le* tableau et qu'on enlève *quelque chose sur le* tableau, list<>::erase s'applique à la liste elle-même (ou à une de ses parties), tandis que list<>::remove s'applique à ses éléments.
list<>::erase a une sémantique orientée ensemble : on invalide une partie de la liste, en bloc.
list<>::remove a une sémantique orientée élément : on invalide des éléments déterminés de l'ensemble "liste".
Et évidemment, le fait que std::remove() n'enlève rien.
Parce que les algorithmes n'en ont pas le droit. Mais l'action est tout de même comparable à celle de list<>::remove, donc il peut sembler normal d'avoir le même nom.