J'ai été l'enseignement d'une programmation en C++ de la classe depuis de nombreuses années maintenant et l'un des plus délicats de choses à expliquer à des élèves est const surcharge. J'ai souvent l'exemple d'un vecteur comme la classe et de ses operator[]
fonction de:
template <typename T> class Vector {
public:
T& operator[] (size_t index);
const T& operator[] (size_t index) const;
};
J'ai peu de mal à expliquer pourquoi il est que les deux versions de l' operator[]
fonction sont nécessaires, mais en essayant d'expliquer comment unifier les deux implémentations ensemble, je me retrouve souvent à perdre beaucoup de temps avec les arcanes de la langue. Le problème est que le seul moyen fiable et que je sais comment mettre en œuvre l'une de ces fonctions dans les termes de l'autre, est à l' const_cast
/static_cast
truc:
template <typename T> const T& Vector<T>::operator[] (size_t index) const {
/* ... your implementation here ... */
}
template <typename T> T& Vector<T>::operator[] (size_t index) {
return const_cast<T&>(static_cast<const Vector&>(*this)[index]);
}
Le problème de cette configuration est qu'elle est extrêmement difficile à expliquer et pas du tout intuitivement évident. Lorsque vous l'expliquer comme le "cast de const, puis d'appeler le const version, puis la bande constness" c'est un peu plus facile à comprendre, mais la syntaxe est effrayant. Expliquant ce qu' const_cast
est, pourquoi il est approprié ici, et pourquoi il est presque universellement inapproprié ailleurs généralement me prend cinq à dix minutes de temps d'enseignement, et de donner un sens à cette expression nécessite souvent plus d'efforts que la différence entre const T*
et T* const
. J'ai l'impression que les élèves ont besoin de savoir à propos de const-surcharge et comment le faire sans inutilement dupliquer le code dans les deux fonctions, mais cette astuce semble un peu excessif dans un cours d'introduction à la programmation en C++ cours.
Ma question est-ce - est-il un moyen plus simple à mettre en oeuvre const
-fonctions surchargées en termes de l'un à l'autre? Ou est-il un moyen plus simple d'expliquer ce truc pour les étudiants?