9
votes

Comment surcharger l'opérateur == () pour un pointeur à la classe?

J'ai une classe appelée astring . Il est assez basique: xxx

maintenant, je veux écrire du code comme celui-ci: xxx

Cependant, l'opérateur de comparaison existant ne prend en charge que xxx

Si je omettons cet astérisque, le compilateur est malheureux.

existe un moyen de permettre à l'opérateur de comparaison de comparer * astring avec const char * ?


6 commentaires

Cette question a déjà été soulevée avant: ici


Pourquoi allouez-vous de manière dynamique mystring ? Pourquoi n'est-ce pas opérateur == A membre ? Ou mieux, pourquoi est-ce un membre du tout? Ou même mieux, pourquoi écrivez-vous votre propre classe de cordes?


(1) Je ne devrais pas. C'était une erreur. (2) Pourriez-vous élaborer à ce sujet? (3) Pourquoi ne serait-ce pas membre? (4) Parce que la plate-forme cible est un système intégré qui n'a pas de classe de cordes native.


2. Si vous ne le faites pas, il ne fonctionnera pas pour la const astring: S, 3. Parce qu'il n'a pas besoin d'être membre et entraînerait une meilleure encapsulation, 4, que voulez-vous dire non "catégorie de cordes natales "? Vous avez STD :: String.


Je ne comprends pas (3). Vous suggérez-vous opérateur == () être une fonction d'ami? Pourquoi est-ce que cette meilleure encapsulation?


Il n'a pas besoin d'être une fonction d'ami. Il devrait être possible de mettre en œuvre à partir de l'interface publique de la classe de cordes.


5 Réponses :


3
votes

[La réponse originale était fausse et donc corrigée ci-dessous]

Comme indiqué par Oli Charlesworth, dans un commentaire ci-dessous, ceci est impossible. p>

Vous auriez besoin de définir un opérateur comme p >

   bool operator==(const AString *as, const char *cs); // Note: C++ will not do that


4 commentaires

Mais cela pourrait conduire à d'autres surprises lors de la comparaison des pointeurs après!


Vous ne pouvez pas surcharger aux opérateurs à moins d'un type non primitif.


... cela devrait dire "opérateurs non membres".


Eh bien, les opérateurs membres ont un paramètre implicite ce à un type non primitif, donc je dirais que cela tient pour tous les opérateurs.



11
votes

Pas à moins que vous ne l'enveloppez pas de classe Smart-Pointer, mais cela rendrait la sémantique bizarre. Quel est le problème avec si (* mystring == "bar") ?


0 commentaires

4
votes

Je pense que ce que vous voulez, c'est tort car il obscurcit le système de type de C ++. mystring est a le pointeur à un astring et non un astring . N'essayez pas de cacher le fait que c'est un pointeur. C'est un point d'entrée pour les bugs laids et si vous codez dans une équipe, tout le monde ne serait rien d'autre que confus!


0 commentaires

3
votes
bool operator==(const char* pSetString);

0 commentaires

11
votes

Non, il n'y a pas.

sur surcharger opérateur == , vous devez fournir un type défini par l'utilisateur en tant que l'un des opérandes et un pointeur ( astring * ou const-char * ) ne se qualifie pas.
Et lors de la comparaison de deux pointeurs, le compilateur a un opérateur intégré de manière très adéquate == , il ne faut donc pas envisager de convertir l'un des arguments à un type de classe.


0 commentaires