热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

ImdesigningaFactorythatcreatesdifferenttypesofFooandImtryingtousesmartpointers.我正

I'm designing a Factory that creates different types of Foo and I'm trying to use smart pointers.

我正在设计一个工厂,它创建不同类型的Foo,我正在尝试使用智能指针。

Most seems to be working well, but I am missing some important features (namely nullptr) because of compiler limitations.

大多数似乎运行良好,但由于编译器的限制,我缺少一些重要的功能(即nullptr)。

I have this method:

我有这个方法:

std::unique_ptr createFoo(const std::string &fooType) {
    auto it = _registeredFoo.find(fooType); // _registeredFoo is a map
    if(it != _registeredFoo.end())
       return std::unique_ptr(it->second());
    return std::unique_ptr(NULL);
}

When I test this method, it never returns a NULL-like pointer.

当我测试这个方法时,它永远不会返回类似NULL的指针。

This is how I test my method.

这就是我测试方法的方法。

std::unique_ptr _foo = FooFactory::getInstance()->createFoo("FOO"); //FOO is registered
if(_foo) {
  std::cout <<"Hello, World!" < _bar = FooFactory::getInstance()->createFoo("BAR"); // BAR is unregisered
if(_bar) {
  std::cout <<"Hello, World!" <

I always see "Hello, World!"

我总是看到“你好,世界!”

This leads me to believe that my use of std::unique_ptr's constructor is a bit abusive. Can anyone give me a recommendation for how to approach this without emulating nullptr myself?

这让我相信我使用std :: unique_ptr的构造函数有点滥用。任何人都可以给我一个如何处理这个问题的建议,而不是自己模仿nullptr吗?

I'm using gcc 4.4.6.

我正在使用gcc 4.4.6。

3 个解决方案

#1


6  

I think that what you want is an empty unique_ptr:

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

return std::unique_ptr();

It seems that you are looking for a pointer that points to no object (and is false when converted to bool).

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

#2


6  

You can use the default constructor of std::unique_ptr.

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

std::unique_ptr a1();
std::unique_ptr a2(nullptr);

a1 and a2 are unique pointers initialised empty (owns nothing).

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

you can verify the emptiness of the pointers with the operator bool provided by the unique_ptr class:

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

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

#3


5  

What you want is

你想要的是什么

return {};

the {} return a default constructed object of whatever (class) type1, and can be read "nothing". It works with smart pointers, optional, and most everything.

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

If your compiler lacks this

如果你的编译器没有这个

return std::unique_ptr();

will do it. Passing NULL to std::unique_ptr is not legal in C++11 anyhow (the constructor is ambiguous).

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

You don't have a C++11 compiler. Any use of C++11 in your code is going to be error-prone.

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


1 The proper wording is complicated. For a scalar (like int), this zero-initializes the value (which, in practice, sets the value to 0/null/0.0/'\0' etc).

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


推荐阅读
author-avatar
基基蛋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有