12 votes

Hériter et remplacer les fonctions d'une chaîne std::string ?

Depuis std::string est en fait un typedef d'une classe modèle, comment puis-je la remplacer ? Je veux créer un fichier UTF-8 std::string qui renverra la longueur correcte, entre autres choses.

19voto

larsmans Points 167484

Si vous doit définir votre propre type de chaîne de caractères, alors n'héritez pas de std::string mais définissez votre propre Traits de caractère et faire quelque chose comme

typedef std::basic_string<unsigned char, utf8_traits> utf8string;

Voir aussi Site web d'Herb Sutter .

16voto

Armen Tsirunyan Points 59548

NE DÉRIVENT PAS DE LA CHAÎNE

std::string, c'est-à-dire l'ensemble du modèle basic_string, n'est pas conçu pour être dérivé. Il existe déjà des millions d'articles à ce sujet. Il n'a pas de fonctions virtuelles, il n'y a donc rien à surcharger. Le mieux que vous puissiez faire est de cacher quelque chose. Le mieux est d'utiliser la composition/agrégation ! C'est-à-dire qu'il suffit de garder un membre de type string dans votre classe et de transférer les appels ! Encore une fois, juste pour être sûr

NE DÉRIVENT PAS DE LA CHAÎNE

4voto

Daniel Lidström Points 2970

En C++, il est généralement considéré comme une erreur de dériver d'un conteneur de la bibliothèque standard. Cependant, la fonctionnalité que vous recherchez a déjà été implémentée. Jetez un coup d'œil à Glib::ustring .

J'espère que cela vous aidera !

1voto

bmargulies Points 49855
  1. Avez-vous regardé l'ICU ?

  2. Un typedef est juste une étiquette pratique.

    class foo : public bar {} ;

fonctionne très bien lorsque bar est un typedef d'un PT.

Ce n'est peut-être pas une bonne idée dans ce cas, mais la langue le permet.

1voto

Nemanja Trifunovic Points 17239

Assurez-vous d'abord de savoir ce que vous faites. Quelle est exactement la "longueur correcte" que vous souhaitez obtenir de vos objets chaîne ? Le nombre de points de code ? Cela ne correspond pas toujours au nombre de caractères tel que perçu par l'utilisateur.

Quoi qu'il en soit, jetez un coup d'œil à la utf8-cpp pour voir une approche alternative à la dérivation à partir de std::string.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X