空指针与boost :: shared_ptr?

什么是相当于以下内容:

std::vector<Foo*> vec; vec.push_back(NULL); 

当处理boost::shared_ptr ? 它是下面的代码?

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

注意:我可能推回很多这样的对象。 我应该在哪里声明一个全局静态的nullPtr对象? 那样只有其中一个必须被修build:

 boost::shared_ptr<Foo> nullPtr; 

你的build议(不带参数地调用shared_ptr<T>构造函数)是正确的。 (调用值为0的构造函数是等价的。)我不认为这会vec.push_back()存在的shared_ptr<T>调用vec.push_back()慢,因为在这两种情况下都需要构造build设或复制build设)。

但是,如果你想“更好”的语法,你可以尝试下面的代码:

 class { public: template<typename T> operator shared_ptr<T>() { return shared_ptr<T>(); } } nullPtr; 

这声明了一个单一的全局对象nullPtr ,它启用以下自然语法:

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

请注意,如果您在多个翻译单元(源文件)中使用它,则需要为该类提供一个名称(例如_shared_null_ptr_type ),将nullPtr对象的定义移动到单独的.cpp文件中,并将extern声明添加到头文件的类定义。

那么,这是合法的:

 shared_ptr<Foo> foo; /* don't assign */ 

而在这种状态下,它并没有指向任何东西。 你甚至可以testing这个属性:

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

那么为什么不这样做:

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

在C ++ 0x中,您可以简单地从nullptr转换为std::shared_ptr

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

你可以为shared_ptr<Foo>声明一个全局的nullPtr 。 但是如果你污染了全局的命名空间,你会为shared_ptr<Bar>调用全局的nullPtr

通常,我将空ptr声明为指针类中的静态。

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

这样每个类都有一个静态的Null。

这是我认为是更简单,工作得很好的东西

(记住typedef是你的朋友):

 #include <cstdlib> #include <vector> #include <iostream> #include <boost/shared_ptr.hpp> typedef boost::shared_ptr< std::vector<char> > CharVecHandle; inline CharVecHandle newCharVec(std::vector<char>::size_type size) { return CharVecHandle(new std::vector<char>(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; } 

是的,声明一个全局静态空指针。