OVH Cloud OVH Cloud

STL - liste de string et const

11 réponses
Avatar
Brieuc Jeunhomme
Bonjour,

je cherche à réaliser une classe contenant une liste de chaînes
constantes, j'écris donc différentes implémentations, dont pas une
seule ne compile :)

En enlevant tous les const, l'interface est assez simple :

class foo {

public:

list < string > :: iterator begin() { return elements_.begin(); }

list < string > :: iterator end() { return elements_.end(); }

private:

list < string > elements_;

};


Par contre, si je veux déclarer begin et end comme méthodes const, comme
ceci :

list < string > :: iterator end() const { return elements_.end(); }

j'obtiens une erreur de compilation dûe à des conversions de type sur
les arguments 2 et 3 du template d'itération de liste. Y a-t-il une
solution ?

D'autre part, comme les chaînes qui sont placées dans cette classe ne
sont pas censées être modifiées, je préférerais utiliser des
list < const string >, mais dès que j'essaie d'insérer un élément dans
une telle liste, j'obtiens une erreur de compilation :

list < const string > liste;
const string foo( "foo" );
liste.push_back( foo );

Ne passe pas. À la réflexion, ça me paraît normal puisque push_back doit
quelque part appeler l'opérateur d'affectation, ce qui ne devrait
jamais avoir lieu dans le cas d'un objet déclaré constant. Cependant,
j'aimerais empêcher la modification des chaînes contenues dans la
liste. Y a-t-il une autre solution qu'encapsuler ces chaînes dans une
classe ne disposant pas de l'opération de modification ?

--
BBP

1 réponse

1 2
Avatar
Alexandre
Le manque de destructeur est dangereux quand on risque de detruire
l'objet a partir d'une classe de base. Quand la classe de
Dans le cas present ou il s'agit de faire un conteneur avec des
contraintes, il me semble evident que si l'heritage est utilise
(personnellement, j'aurais tendance a plutot utiliser la delegation
que l'heritage) c'est un heritage prive ou protege (sinon les
contraintes sont trop facilement contournables). Dans ce cas, d'un
heritage prive, les risques qu'on detruise l'objet a partir de la base
sont minimes (surtout quand la base n'a aucun membres virtuels).


tout à fait.
Et dans mon cas, c'était surtout pour un TD, utiliser un exemple d'héritage
privé (les étudiants ont tendance à mettre public pour de l'héritage
systématiquement...)

1 2