我正在设计一个工厂,它创建不同类型的Foo,我正在尝试使用智能指针。
大多数似乎运行良好,但由于编译器的限制,我遗漏了一些重要的功能(即nullptr
)。
我有这个方法:
std::unique_ptr<Foo> createFoo(const std::string &fooType) {
auto it = _registeredFoo.find(fooType); // _registeredFoo is a map
if(it != _registeredFoo.end())
return std::unique_ptr<Foo>(it->second());
return std::unique_ptr<Foo>(NULL);
}
当我测试这个方法时,它永远不会返回类似指针的NULL
。
这是我测试方法的方法。
std::unique_ptr<Foo> _foo = FooFactory::getInstance()->createFoo("FOO"); //FOO is registered
if(_foo) {
std::cout << "Hello, World!" << std::endl;
} else {
std::cout << "Goodbye, World!" << std::endl;
}
std::unique_ptr<Foo> _bar = FooFactory::getInstance()->createFoo("BAR"); // BAR is unregisered
if(_bar) {
std::cout << "Hello, World!" << std::endl;
} else {
std::cout << "Goodbye, World!" << std::endl;
}
我总是看到“你好,世界!”
这让我相信我对std::unique_ptr
的构造函数的使用有点滥用。任何人都可以在没有emulating nullptr
myself的情况下向我推荐如何解决这个问题吗?
我正在使用gcc 4.4.6。
答案 0 :(得分:6)
我认为你想要的是一个空的unique_ptr
:
return std::unique_ptr<Foo>();
您似乎正在寻找一个指向无对象的指针(转换为false
时为bool
)。
答案 1 :(得分:6)
您可以使用std::unique_ptr
的默认constructor。
std::unique_ptr<int> a1();
std::unique_ptr<int> a2(nullptr);
a1
和a2
是初始化为空的唯一指针(没有任何东西)。
您可以使用unique_ptr类提供的operator bool来验证指针的空白:
if (!a1) { // the smart pointer is empty
}
答案 2 :(得分:5)
你想要的是
return {};
{}
返回任何(类)类型 1 的默认构造对象,并且可以读作“nothing”。它适用于智能指针,可选,以及大多数内容。
如果您的编译器缺少此
return std::unique_ptr<Foo>();
会做到的。无论如何,将NULL
传递给std::unique_ptr
在C ++ 11中是不合法的(the constructor is ambiguous)。
您没有C ++ 11编译器。在代码中使用C ++ 11会容易出错。
1 正确的措辞是complicated。对于标量(如int
),这会对值进行零初始化(实际上,将值设置为0
/ null / 0.0
/ '\0'
等)。