12
votes

Des fonctions héritantes et primordiales d'une ficelle STD :: String?

Etant donné que std :: string est en fait un Typedef d'une classe modélisée, comment puis-je le remplacer? Je veux faire un UTF-8 std :: string qui retournera la longueur correcte, entre autres choses.


0 commentaires

8 Réponses :


16
votes

ne dérive pas de chaîne

STD :: String, c'est-à-dire que tout le modèle basical_string n'est pas conçu pour être dérivé. Il y a déjà des zillions d'articles à ce sujet. Il n'a pas de fonctions virtuelles donc il n'y a rien à remplacer. Le mieux que vous puissiez faire est de cacher quelque chose. Le mieux est d'utiliser la composition / l'agrégation! C'est-à-dire, gardez simplement un membre de type chaîne dans votre classe et transmettez les appels! Encore une fois, juste pour vous assurer

ne dérive pas de chaîne


4 commentaires

-1. Les meilleures pratiques pour cette tâche consiste à fournir un objet de traits de caractère et instancier std :: basic_string . Cacher un std :: String Dans ce cas soulève le problème de la signature Char , puisque UTF-8 est un codage multi-meuble 8 bits.


@Larsmans: Aucune objection :) J'étais trop préoccupé par le fait que quelqu'un quelque part a eu la pensée de dériver d'un type non polymorphique :)


-1. Ne répond pas vraiment à la question. La réponse de Larsman donne au moins une bonne idée d'une direction.


-1. Je ne trouve pas cet argument convaincant. Il suppose que les seules classes qui ont une fonction virtuelle peuvent être dérivées. Si le basic_string n'a pas de fonction virtuelle, alors la directive doit être: ne l'utilisez pas polymorphiquement. Il n'y a rien de mal dans l'héritage, si vous l'avez documenté correctement!



1
votes
  1. Avez-vous regardé ICU?

  2. Un typedef est juste une étiquette pratique.

    classe foo: barre publique {};

    fonctionne juste bien lorsque la barre est un typlef d'un PT.

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


0 commentaires

4
votes

Il est généralement considéré comme une erreur en C ++ afin de dériver un conteneur de bibliothèque standard. Cependant, la fonctionnalité que vous recherchez a déjà été mise en œuvre. Regardez Glib :: Ustring .

J'espère que cela vous aidera!


0 commentaires

0
votes

meilleure idée: Créez un conteneur UTF8_String compatible STL sans hériter de STD :: String.


0 commentaires

19
votes

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

Voir aussi Site web de Sutter .


3 commentaires

+1 - Il y a une raison std :: string est un typedef , et ceci est-ce.


D'autre part, je n'utiliserais pas de basic_string pour gérer les séquences UTF-8. Vous ferez plus de mal que de bien chaque fois que vous essayez de le manipuler.


@Matthieu M., qui dépend entièrement de la manière dont vous implémentez les traits de caractère. Je peux voir deux options: les emballez-les comme UTF-8 directement et implémentez le State_Type ou les emballer sous UTF-32 et convertir à la limite. De toute façon, c'est beaucoup de travail, mais il conserve la compatibilité avec les algorithmes stl.



-1
votes

Comme on a déjà été déclaré par d'autres: Ne dérivez pas de std :: string , il n'est tout simplement pas conçu pour cela.

Vous devriez avoir un coup d'œil sur Cet article , qui montre comment créer un cas classe de cordes insensibles comme exemple. Vous verrez que la logique implémentée dans std :: basic_string est indépendante du type de caractères et qui fournissant une personnalisation char_traits devrait faire le tour.


1 commentaires

En fait, je ne recommanderais pas de faire cela. Je l'ai fait il y a quelques années et je devais regretter cette décision. Ce qui va arriver, c'est que vous allez devoir convertir entre ce nouveau type et le type de chaîne standard, sur toute la base de code. Ce n'est pas joli. Un excellent article qui explique en détail est trouvé ici: Lafstern.org/matt/col2_new.pdf . Résumé: L'insensibilité à l'affaire ne concerne pas un objet, il s'agit de la manière dont vous utilisez un objet.



0
votes

Écrire une implémentation unicode conforme et fonctionne correctement dans toutes les circonstances est très difficile à faire. Je vous conseillerais d'utiliser une bibliothèque ou une implémentation existante au lieu de rouler le vôtre. Par exemple, Windows, OSX et QT ont tous des bibliothèques qui prennent en charge UF-16 et autres chaînes codées.


0 commentaires

1
votes

Assurez-vous simplement de savoir ce que vous faites en premier. Quelle est exactement la "longueur correcte" que vous souhaitez revenir de vos objets à chaîne? Nombre de points de code? Cela ne correspond pas toujours au nombre de caractères comme perçu par l'utilisateur.

Quoi qu'il en soit, jetez un coup d'œil sur le bibliothèque UTF8-CPP pour voir une approche alternative pour dériver de STD: : chaîne.


0 commentaires