Salut,
En fait, une toute petite modification de ton code suffirait pour que tout rentre dans l'ordre (bon, il faut la répercuter à deux endroits

):
"simplement" ajouter le mot clé const soit avant le terme Position, soit (de préférence) entre le terme position et le caractère "&".
Si je dis qu'il faut le faire deux fois, c'est parce qu'il faut le faire... pour la déclaration de la fonction, et pour... son implémentation.
En effet, le code ... va créer ce que l'on appelle une variable temporaire anonyme:
Temporaire parce que... elle n'existe que pour la durée de l'exécution de... setPosition
Anonyme parce que... on ne dispose d'aucun identifiant nous permettant... d'y accéder en dehors de l'appel de la fonction (comme, en plus, elle n'existe pas en dehors de l'appel de la fonction, c'est à peu près normal

)
Or, les auteurs de la norme ont estimé que, aucun moyen de récupérer, dans la fonction appelante (main, selon ton exemple), les modifications qui pourraient être apportée durant la fonction appelée (setPosition, en l'occurence), il n'y a... aucun avantage à... permettre à la fonction appelée (je parle toujours de setPosition) de modifier une telle variable temporaire anonyme.
Du coup, ils ont décidé que l'on pourrait provoquer la création d'une variable temporaire anonyme en passant une référence sur un objet (il faut, ici, se rappeler qu'une référence est un alias d'un objet, et que, par conséquent, l'objet référencé doit... exister...) uniquement si... la référnce en question est constante.
Ceci étant dit, j'ai personnellement horreur des mutateurs, surtout s'il s'exposent trop ostensiblement à coup de setMachinChose, et que je suis très attentif à la sémantique des différents identifiants utilisés.
Au départ du code que tu nous montre, on peut, effectivement, estimer que:
- la classe C devrait avoir une position de départ... Il serait pas mal d'envisager de mettre RAII en oeuvre
- Une instance de la classe C est, visiblement, susceptible de se déplacer... Peut être faudrait-il se poser la question de la manière dont elle le fait. Est-ce:
- vers des positions "relatives" (à la position actuelle)

- vers des position "absolues"

Selon la réponse que tu donnera à cette deuxième question, peut être serait il intéressant d'envisager l'utilisation d'une fonction move() (même si on ne fait que renommer setPositon), parce qu'elle est plus expressive de ce qui se fait

Partager