Les fonctions et interfaces Const en C ++
-
01-10-2019 - |
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
.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
const
member 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.