繁体   English   中英

试图返回用`NULL`构造的`std :: unique_ptr`

[英]Trying to return a `std::unique_ptr` constructed with `NULL`

我正在设计一个工厂,它创建不同类型的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的构造函数有点滥用。 任何人都可以给我一个如何处理这个问题的建议,而不是自己模仿nullptr吗?

我正在使用gcc 4.4.6。

我认为你想要的是一个空的unique_ptr

return std::unique_ptr<Foo>();

看来你正在寻找一个指向没有对象的指针(当转换为bool时它是false )。

您可以使用std::unique_ptr的默认构造函数

std::unique_ptr<int> a1();
std::unique_ptr<int> a2(nullptr);

a1a2是初始化为空的唯一指针(不拥有任何内容)。

您可以使用unique_ptr类提供的运算符bool验证指针的空白:

if (!a1) { // the smart pointer is empty
}

你想要的是什么

return {};

{}返回任何(类)类型1的默认构造对象,并且可以读作“nothing”。 它适用于智能指针,可选,以及大多数一切。

如果你的编译器没有这个

return std::unique_ptr<Foo>();

会做的。 无论如何,将 NULL传递给std::unique_ptr在C ++ 11中是不合法的(构造函数不明确)

您没有C ++ 11编译器。 在代码中使用C ++ 11会容易出错。


1正确的措辞很复杂 对于标量(如int ),这将零值初始化(实际上,它将值设置为0 / null / 0.0 / '\\0'等)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM