Je commence juste à utiliser boost::ptr_vector
. J'ai un ptr_vector pctr
en tant que membre d'une classe A et souhaite qu'une autre classe B fasse référence à un élément dans pctr
. Lors de la construction d'un objet de classe B, je veux stocker un pointeur dans pctr
. Puisque les conteneurs de pointeurs ne permettent pas l'accès au pointeur (mais seulement aux références), je dois prendre l'adresse de la référence de pctr
puis la stocker dans l'objet de type B. Mais prendre l'adresse d'une référence semble imprévisible. Y a-t-il une meilleure alternative?Pointeur vers un élément dans le conteneur du pointeur de suralimentation
Répondre
Je pense que prendre l'adresse de l'itérateur déréférencé est la bonne façon de réaliser ce que vous essayez de faire.
iterator it = ...
T *ptr = &*it;
Cependant, cela est dangereux parce que vous pourriez finir avec les pointeurs ballants, si l'Un objet est détruit avant des objets B. C'est pourquoi la fonction release
, qui permet à l'appelant de prendre l'adresse d'un objet, supprime également le pointeur du conteneur.
Si vous pouvez prendre en charge la surcharge, vous pouvez envisager de remplacer le boost::ptr_vector
par un vecteur de pointeurs intelligents, par ex. std::vector<boost::shared_ptr<T> >
.
L'adresse de l'itérateur à un ptr_vector changerait et deviendrait invalide s'il y avait une insertion supplémentaire. –
mais le -1 ne vient pas de moi (votre déclaration sur l'utilisation du vecteur de shared_ptrs est logique). –
Comme vous l'avez découvert, les conteneurs de pointeur de suralimentation protègent bien leurs pointeurs. Bien sûr, vous pouvez le vaincre en prenant l'adresse des références qu'il va céder, mais sachez que vous pouvez diluer la force de la revendication du détenteur de pointage à la propriété faisant autorité en conservant ces pointeurs (tout dépend du reste de votre code vraiment).
alternatives semblent être:
ont la classe B détiennent élément faisant référence itérateurs le conteneur de pointeur d'intérêt (bien sûr les règles habituelles de itérateur invalidation doivent être traitées). Comme A possède les pointeurs et que vous semblez vouloir que B contienne une sorte de référence faible non propriétaire, utilisez un conteneur de
shared_ptr
à la place, et utilisez B commeweak_ptr
. Inconvénient pourrait par performance.
Ya, je suppose que la logique derrière la conception semble être que, puisque la propriété des pointeurs est avec A, B ne devrait pas avoir un pointeur, mais une référence à un élément dans le pctr. En d'autres termes, la déclaration de B doit être basée sur le fait que l'élément au sein du pctr existera toujours. –
Bien que le sucre syntaxique, 'reference_wrapper' pourrait être juste ce que le médecin a prescrit. http://stackoverflow.com/questions/193703/how-is-tr1referencewrapper-useful –
- 1. Pointeur vers un pointeur dans l'objectif-c?
- 2. chaîne Copier pointeur vers pointeur
- 3. Insertion du conteneur du pointeur de surimpression (ptr_list)
- 4. pointeur pointeur C++ Méthodes
- 5. pointeur de déréférencement vers un tableau d'entiers
- 6. Un pointeur vers la classe de base du modèle abstrait?
- 7. Pointeur d'assemblage MIPS à un pointeur?
- 8. Comment appeler un pointeur de fonction membre en utilisant un pointeur vers un objet constant?
- 9. Revenant un pointeur vers une variable automatique
- 10. Le polymorphisme C++ n'est pas pris en charge pour le pointeur vers le pointeur
- 11. Comment travailler avec le pointeur sur le pointeur vers la structure en C?
- 12. Comment lancer un pointeur vers un type de paramètre générique?
- 13. Position du pointeur de fichier
- 14. SÛR pointeur vers un pointeur (bien référence à une référence) en C#
- 15. Pourquoi cette initialisation Pointeur-Pointeur Seg Seg?
- 16. Struct avec un pointeur vers son propre type dans ctypes
- 17. Passe pointeur vers un tableau dans Haskell à C Fonction
- 18. Pourquoi NSError a-t-il besoin d'une double indirection? (Pointeur vers un pointeur)
- 19. pointeur vers un tableau de structs et d'obtenir mémoire
- 20. Comment déclarer un pointeur (octet ^)?
- 21. Faire un pointeur qui pointe vers deux octets
- 22. NSString (pointeur/non pointeur) Affecter ou conserver
- 23. Définir le pointeur sur la main lorsque vous survolez un élément de l'interface utilisateur dans Silverlight
- 24. Retour du pointeur sur une structure locale
- 25. Pointeur vers l'objet COM lorsque l'application ne le renvoie pas
- 26. Coulée entre void * et un pointeur vers la fonction membre
- 27. Pointeur de fonction dans C
- 28. SVG emplacement du pointeur de la souris
- 29. Quelle est la manière correcte de déclarer un pointeur sur un pointeur __far?
- 30. Définition du pointeur d'enregistrement dans un C# DataGridView par programme
En fait, ont le même problème. Revenir à ma solution précédente (vecteur de pointeurs bruts avec suppression explicite). Silly, vraiment. – Cookie
@Cookie en fait, jusqu'à maintenant (2011) J'ai beaucoup utilisé les conteneurs de pointeur. J'utilise un reference_wrapper. Je l'ai expliqué dans le wiki d'un projet sur lequel je travaille: http://sourceforge.net/apps/mediawiki/crackpot/index.php?title=Boost_Pointer_Containers –
Bon point, merci. Si vous vous trouvez avec un peu de temps libre, les comparaisons de performance entre les trois alternatives pourraient être agréables. – Cookie