question de newbie: c++ const non-const de conversion

Je suis vraiment agacé par const mot-clé de ces jours, que je ne suis pas assez familier avec elle. J'ai eu un vecteur qui stocke toutes les pointeurs const comme vector<const BoxT<T> *> *Q_exclude, et dans le constructeur d'une autre classe, j'ai besoin d'un élément dans cette file d'attente pour être transmis en tant que paramètre et l'attribuer à un non-const membre. Ma question est:

Comment assigner une variable const à un non-const variable? Je sais que ce n'est pas logique parce que, après tout, const est un const, et ne doit pas être modifié par n'importe quel moyen. Mais ce gênant variable membre doit VRAIMENT être modifiées au cours du processus! Je pourrais aussi modifier le type de données dans le vecteur d'être non-const, mais ce serait trop de travail. Ou personne ne sait comment éviter ce genre de situation?

  • Pourquoi avez-vous stocker des pointeurs vers les const, si vous souhaitez modifier les objets qu'ils point?
  • Peut-être poster un peu de code... mais comme RMF dit, cela ressemble à des malheureux de la conception.
  • "Mais qu'ennuyeux variable membre doit VRAIMENT être modifiées au cours du processus!" Alors, pourquoi avez-vous en faire un const variable de membre? Si vous vous trouvez avoir besoin de modifier quelque chose qui est const, alors cela indique un problème de conception. Soit vous ne devez pas modifier, ou vous devez repenser si c'est vraiment const à tous.
  • Il y a peut-être un peu d'un problème avec C++: vous pourriez voulez que les données soient const dans certaines fonctions et non-const dans d'autres. Cependant, avec vector c'est soit tout ou rien. - De toute façon, vous n'avez pas besoin de faire tout ce que vous pouvez const. IMO, si vous pouvez passer const références (pour la performance), c'est assez.
  • Magasin de non-const éléments, puis passer l'ensemble de vecteurs d' const dans les contextes où l'accès à l'élément ne doit pas être sujette au changement. Simples!
  • pas tout à fait, car un const vector<T*> encore vous permet de modifier les referands de ses éléments. L'appelant peut accepter de signer une convention avec vous, qu'un const vecteur de pointeurs signifie "ne pas modifier le referands soit", mais le type de système n'est pas dans le deal. Vous pouvez utiliser un adaptateur pour le but (si vous passez plages d'itérateur paires, plutôt que de passer l'ensemble du vecteur, c'est pas que beaucoup de travail pour écrire l'adaptateur).
  • Ah, oui, parce que vous obtenez un T* const. Je suis avec vous maintenant. Eh bien, ce n'est pas tellement un défaut de conception comme un fait d'indirection que certaines personnes n'aiment pas l'accepter. 🙂 D'ailleurs, stocke des pointeurs dans un vector est faible.
  • Ce que je voulais dire par "tout ou rien" est ce que vous avez suggéré. Que faire si je veux une fonction pour être en mesure de modifier le conteneur, mais pas les éléments existants? - Je crois que cela ne peut pas être vraiment atteint, donc vers le bas avec const. C'est pratique si le langage permet de bien, mais d'autres langues sont bien sans const, donc vous serez très bien sans aussi.
  • Vous pouvez stocker T const* (ce qui n'est pas le même que T* const). Mais oui, vous pouvez ne jamais modifier des éléments existants. Franchement je pense que ce "tout ou rien"ness fait sens, plutôt que d'être "un peu d'un problème avec C++"; il devrait être en place pour le conteneur de décider de la mutabilité des choses à l'intérieur, pas une fonction arbitraire qui veut l'utiliser.

InformationsquelleAutor Shang Wang | 2011-09-05