11
votes

Est l'opérateur-> "chaîné" pour les pointeurs?

Duplicaté possible: strong>

Opérateur de surcharge -> P>

salut, p>

J'ai vu que opérateur -> () code> est chaîné (réappliqué) après son évaluation, par exemple: P>

int main()
{
  string s = "Hello world";
  auto_ptr<string> ptr1(&s);
  auto_ptr<auto_ptr<string> > ptr2(&ptr1);
  cout << ptr1->c_str() << endl; // fine
  cout << ptr2->c_str() << endl; // breaks compilation
}


5 commentaires

Duplicata de opérateur de surcharge -> [La réponse de Andreyt explique le comportement de opérateur -> et Comment le "chaînage" se produit.]


@James, je préférerais garder cette ouverture puisque le libellé de la question est différent. Cela peut aider les autres personnes à trouver cette réponse.


@Judge: une question fermée n'est pas automatiquement supprimée et une question bien posée comme celle-ci ne sera pas supprimée; La question va toujours exister et être consultable.


Merci! Et puis, il ne semble pas être possible de remplacer l'opérateur-> pour le pointeur, rien ne peut être fait avec une deuxième question. Droit?


Il convient de noter que l'utilisation de auto_ptr de cette manière entraînera toutes sortes de choses horribles lorsque les variables sont détruites à la fin de la fonction.


3 Réponses :


0
votes

Non, il n'est pas possible de travailler. Si vous pouviez surcharger opérateur -> pour chaîne * vous pouvez le faire fonctionner. Mais opérateur -> a déjà une définition pour tous les types de pointeur. Donc, comme vous ne pouvez pas surcharger + pour les types numériques primitifs, vous ne pouvez pas surcharger opérateur -> pour n'importe quel type de pointeur.

Et même si vous le pouviez, comment le compilateur pourrait-il savoir quand la récursion devrait se terminer?


0 commentaires

3
votes

La raison pour laquelle votre premier exemple fonctionne est que vous avez renvoyé une référence au lieu d'un pointeur. Cet opérateur serait normalement invalide sauf dans le cas où il est surchargé. Par conséquent, le compilateur doit exécuter les fonctions surchargées dans la chaîne. Cependant, dans le cas de auto_ptr , vous êtes réellement renvoyé un vrai pointeur et l'opérateur défaut -> est invoqué pour des pointeurs réguliers.

S'il vous plaît voir le Opérateur de surcharge -> Question pour plus de détails.


1 commentaires

Merci de votre réponse. Je cherchais une approche pour simplifier le code pour itération de vecteur > et des choses similaires. Semble que la seule option consiste à spécialiser le vecteur (tout conteneur) itérateur pour Shared_PTR (quelques autres PTR intelligents), qui n'est pas acceptable.



22
votes

C ++ 98 standard §13.5.6 / 1 "Accès membre de la classe":

Une expression x-> m est interprétée comme (x.opérateur -> ()) -> m pour un objet de classe x de type t si t :: opérateur -> existe et si l'opérateur est sélectionné à la meilleure fonction de correspondance par le mécanisme de résolution de surcharge (13.3).

Qu'est-ce que cela signifie en pratique est que lorsque x est un pointeur, vous n'obtenez pas de chaînage; Vous venez d'obtenir l'opérateur intégré -> (c.-à-d. x-> m avec x un pointeur traduit par (* x ) .m ).

mais quand x est un objet de type t , vous pouvez obtenir l'effet de chaînage. Parce que l'interprétation comme (x.opérateur -> ()) -> m peut être que (x.opérateur -> ()) est un objet de certaines catégories , Dites Classe u . D'où la seconde -> peut être résolue comme u :: opérateur -> , etc., si le résultat de celui-ci est à nouveau un objet de type de classe ...

Comme, dans votre cas, foo :: opérateur -> produit (une référence à) un objet de classe bar , qui définit un opérateur > .

mais quand opérateur -> renvoie un pointeur, comme par exemple. std :: auto_ptr :: opérateur -> fait, alors c'est juste l'opérateur intégré -> utilisé.

en passant, le chaînage peut être utilisé pour empêcher pratiquement une personne d'utiliser Supprimer de manière inappropriée. std :: auto_ptr ne fait pas cela. Et je ne l'ai jamais vu fait.

Mais il y avait une fois un fil de discussion longuement dans [Comp.lang.c ++. Modérée] sur la manière d'empêcher tout inadvertance Supprimer du pointeur brut géré par un pointeur intelligent, et c'était une possibilité d'une possibilité. qui a été discuté.

acclamations et hth.


0 commentaires