Question

Je vais utiliser l'interface suivante (trivial) comme exemple:

struct IObject
{
  virtual ~IObject() {}

  virtual std::string GetName() const = 0;
  virtual void ChangeState() = 0;
};

La logique veut que GetName doit être une fonction membre de const alors que ChangeState ne devrait pas.

Tout le code que je l'ai vu jusqu'à présent ne suit pas cette logique, cependant. Autrement dit, GetName dans l'exemple ci-dessus ne serait pas marqué en fonction de membre de const.

Est-ce la paresse / négligence ou est-il une raison légitime pour cela? Quels sont les principaux inconvénients de mes clients me force à mettre en œuvre les fonctions membres de const quand ils sont logiquement appelés pour?


EDIT: Merci pour vos réponses tout le monde. Je pense qu'il est à peu près unanime: la paresse / ignorance est la raison de ce que je vois

.
Était-ce utile?

La solution

Je pense qu'il est la paresse / insouciance. GetName() ne devrait avoir aucun effet sur l'état de l'objet, et le contrat de IObject doit indiquer ce fait explicitement.

Si la classe héritant a été en quelque sorte forcé de faire GetName() ont (cachés!) Des effets secondaires, ils peuvent toujours déclarer les champs correspondants comme mutable.

Autres conseils

  

Est-ce la paresse / négligence ou est-il une raison légitime pour cela?

L'ancien. Si vous avez vraiment pas vu tout code qui fait ce droit, obtenir un nouvel emploi immédiatement .

  

Quels sont les principaux inconvénients de me forcer mes clients à mettre en œuvre des fonctions de constmember quand ils sont logiquement appelés pour?

Il permet au compilateur de découvrir les bugs communs à la compilation . (Rien de mieux que les erreurs découvertes lors de la compilation. Tout ce qui échoue sur votre bureau, ne manquera pas sur le site du client.)


Il y a plus de dix ans, peu de temps après avoir rejoint une nouvelle société et a obtenu au piratage à l'un de leurs projets, je l'ai trouvé qu'une méthode qui aurait dû être const était pas, ce qui empêche une partie de mon code const correcte pour compiler . Je considérais que mon casting const loin et obtenir, mais je ne pouvais pas me résoudre à le faire.
Je fis donc la méthode const - juste pour découvrir qu'il appelle d'autres méthodes, qui auraient dû être const aussi, mais étaient pas non plus. Je les ai donc changé aussi bien - juste pour découvrir ...
En fin de compte, j'ai passé plusieurs jours de chasse à travers tout le projet, ajoutant const gauche et à droite.
Collègues se moquaient de moi - jusqu'à ce que je leur ai montré quelques-uns des bogues du compilateur avait découvert en raison de me ajouter const. Fait intéressant, quelques bugs depuis longtemps personne ne l'avait jamais pris le temps d'étudier à fond plus ne sont pas reproductibles soit, après.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top