- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我编写了一个静态工厂方法,它返回一个从另一个数据对象填充的新 Foobar 对象。我最近沉迷于所有权语义,想知道我是否通过让这个工厂方法返回一个 unique_ptr
来传达正确的信息。
class Foobar {
public:
static unique_ptr<Foobar> factory(DataObject data);
}
我的目的是告诉客户端代码他们拥有指针。如果没有智能指针,我只会返回 Foobar*
。但是,我想强制删除此内存以避免潜在的错误,因此 unique_ptr
似乎是一个合适的解决方案。如果客户端想要延长指针的生命周期,他们只需在获得 unique_ptr
后调用 .release()
。
Foobar* myFoo = Foobar::factory(data).release();
我的问题分为两部分:
unique_ptr
而不是原始指针是一种“坏习惯”吗?最佳答案
返回 std::unique_ptr
from a factory 方法很好,应该是推荐的做法。它传达的信息是 (IMO):您现在是该对象的唯一所有者。此外,为了您的方便,该对象知道如何销毁自己。
我认为这比返回一个原始指针要好得多(客户端必须记住如何以及是否处理该指针)。
但是,我不明白您关于释放指针以延长其生命周期的评论。一般来说,我很少看到有任何理由调用 release
。在智能指针上,因为我认为指针应该始终由某种 RAII 结构管理(我称之为 release
的唯一情况是将指针放在不同的管理数据结构中,例如 unique_ptr
与不同的删除器,在我做了一些保证额外清理的事情之后)。
因此,客户端可以(并且应该)简单地存储 unique_ptr
只要他们需要对象(或 unique_ptr
,如果他们需要指针的多个拷贝)的某个地方(例如另一个 shared_ptr
,它是从返回的一个移动构造的)。所以客户端代码应该看起来更像这样:
std::unique_ptr<FooBar> myFoo = Foobar::factory(data);
//or:
std::shared_ptr<FooBar> myFoo = Foobar::factory(data);
我个人也会添加 typedef
对于返回的指针类型(在本例中为 std::unique_ptr<Foobar>
)和/或使用的删除器(在本例中为 std::default_deleter)到您的工厂对象。如果您稍后决定更改指针的分配,这将变得更容易(因此需要使用不同的方法来销毁指针,这将作为 std::unique_ptr
的第二个模板参数可见)。所以我会做这样的事情:
class Foobar {
public:
typedef std::default_deleter<Foobar> deleter;
typedef std::unique_ptr<Foobar, deleter> unique_ptr;
static unique_ptr factory(DataObject data);
}
Foobar::unique_ptr myFoo = Foobar::factory(data);
//or:
std::shared_ptr<Foobar> myFoo = Foobar::factory(data);
关于c++ - 为原始指针(如所有权语义)返回 unique_ptr 的坏习惯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8719119/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
我目前正在解析一个 token 队列:我没有为每个后续 pop() 检查队列是否为空,而是编写了一个 lambda 抛出异常,如果 queue.begin () == queue.end()。我想知道
目前,我正在通过一个 server.js 文件运行两个(很快会是三个)node.js websocket 应用程序。我正在使用 express 为我的整个页面以及我编写的粒子物理“游戏”提供服务。我也
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
将对象的属性用作映射条目的键是否是一种不好的做法?每次做都感觉不对。 例如: class Foo { String name; String bar; } 然后使用这样的 map : Foo
我是一名优秀的程序员,十分优秀!