Pointeur NULL avec boost :: shared_ptr?

Quel est l’équivalent de ce qui suit:

std::vector vec; vec.push_back(NULL); 

en traitant avec boost::shared_ptr ? Est-ce le code suivant?

 std::vector< boost::shared_ptr > vec; vec.push_back(boost::shared_ptr()); 

Note: Je peux repousser beaucoup de ces objects. Dois-je déclarer un object nullPtr statique nullPtr quelque part? De cette façon, un seul d’entre eux devrait être construit:

 boost::shared_ptr nullPtr; 

Votre suggestion (appeler le constructeur shared_ptr sans argument) est correcte. (L’appel du constructeur avec la valeur 0 est équivalent.) Je ne pense pas que cela serait plus lent que d’appeler vec.push_back() avec un shared_ptr préexistant, puisque la construction est requirejse dans les deux cas (soit directe construction ou copie-construction).

Mais si vous voulez une syntaxe “plus agréable”, vous pouvez essayer le code suivant:

 class { public: template operator shared_ptr() { return shared_ptr(); } } nullPtr; 

Cela déclare un object global unique nullPtr , qui active la syntaxe naturelle suivante:

 shared_ptr pi(new int(42)); shared_ptr psat(new SomeArbitraryType("foonly")); ... pi = nullPtr; psat = nullPtr; 

Notez que si vous l’utilisez dans plusieurs unités de traduction (fichiers source), vous devrez donner un nom à la classe (par exemple, _shared_null_ptr_type ), déplacer la définition de l’object nullPtr dans un fichier .cpp distinct et append des déclarations extern dans le fichier. fichier d’en-tête où la classe est définie.

Eh bien, c’est légal:

 shared_ptr foo; /* don't assign */ 

Et dans cet état, il ne pointe rien. Vous pouvez même tester cette propriété:

 if (foo) { // it points to something } else { // no it doesn't } 

Alors pourquoi ne pas faire ça:

 std::vector < shared_ptr > vec; vec.push_back (shared_ptr); // push an unassigned one 

En C ++ 0x, vous pouvez simplement convertir de nullptr en std::shared_ptr :

 std::vector< boost::shared_ptr > vec; vec.push_back(nullptr); 

Vous pouvez déclarer un nullPtr global pour shared_ptr . Mais si vous polluez l’espace de noms global, comment nullPtr vous le nullPtr global pour shared_ptr ?

En général, je déclare le null ptr en tant que statique dans la classe du pointeur.

 #include  class Foo; // forward decl typedef boost::shared_ptr FooPtr; class Foo { public: static FooPtr Null; } ... // define static in cpp file FooPtr Foo::Null; ... // use Foo Null vec.push_back(Foo::Null); 

De cette façon, chaque classe a un Null statique.

Voici quelque chose que je trouve un peu plus simple et qui fonctionne très bien

(rappelez-vous que typedef est votre ami):

 #include  #include  #include  #include  typedef boost::shared_ptr< std::vector > CharVecHandle; inline CharVecHandle newCharVec(std::vector::size_type size) { return CharVecHandle(new std::vector(size)); } inline CharVecHandle newCharVec(void) { return CharVecHandle(); } int main ( void ) { CharVecHandle cvh = newCharVec(); if (cvh == NULL) std::cout << "It's NULL" << std::endl; else std::cout << "It's not NULL" << std::endl; std::vector< CharVecHandle > cvh_vec; cvh_vec.push_back(newCharVec(64)); cvh_vec.push_back(newCharVec()); // or call the NULL constructor directly cvh_vec.push_back(CharVecHandle()); return EXIT_SUCCESS; } 

Oui, déclarez un pointeur null statique global.