空指针与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; }
是的,声明一个全局静态空指针。