J'ai une classe appelée maintenant, je veux écrire du code comme celui-ci: p> Cependant, l'opérateur de comparaison existant ne prend en charge que p> Si je omettons cet astérisque, le compilateur est malheureux. p> existe un moyen de permettre à l'opérateur de comparaison de comparer astring code>. Il est assez basique:
* astring code > avec
const char * code>? p> p>
5 Réponses :
[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
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 code> à un type non primitif, donc je dirais que cela tient pour tous les opérateurs.
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") code>? P>
Je pense que ce que vous voulez, c'est tort car il obscurcit le système de type de C ++. mystring code> est em> a le pointeur em> à un
astring code> et non un
astring code>. 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! P>
bool operator==(const char* pSetString);
Non, il n'y a pas. P>
sur surcharger opérateur == code>, vous devez fournir un type défini par l'utilisateur en tant que l'un des opérandes et un pointeur (
astring * code> ou
const-char * code>) 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 == code>, il ne faut donc pas envisager de convertir l'un des arguments à un type de classe. P>
Cette question a déjà été soulevée avant: ici
Pourquoi allouez-vous de manière dynamique
mystring code>? Pourquoi n'est-ce pas
opérateur == code> A
membre code>? 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 == () code> ê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.