2009-06-11 7 views
4

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

+0

En fait, ont le même problème. Revenir à ma solution précédente (vecteur de pointeurs bruts avec suppression explicite). Silly, vraiment. – Cookie

+0

@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 –

+0

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

Répondre

0

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> >.

+0

L'adresse de l'itérateur à un ptr_vector changerait et deviendrait invalide s'il y avait une insertion supplémentaire. –

+0

mais le -1 ne vient pas de moi (votre déclaration sur l'utilisation du vecteur de shared_ptrs est logique). –

2

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 comme weak_ptr. Inconvénient pourrait par performance.

+1

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. –

+0

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 –

Questions connexes