C ++
我试图“现代化”一些现有的代码。
这很好,但为了“代码化”代码,我认为我应该将变量定义为"std::unique_ptr<Device> device_"
并删除显式调用,这会使代码更安全,更好。
我的问题是这个 -
我可以调用.get来获取每个函数调用中的原始指针。 但是这看起来很丑并且首先浪费了使用unique_ptr的一些原因。
或者我可以更改每个函数,以便不用参数类型“Device *”,而是使用“std :: unique_ptr&”类型的参数。 哪些(对我)有点混淆函数原型,并使其难以阅读。
对此最佳做法是什么? 我错过了其他选择吗?
在现代C ++风格中,有两个关键概念:
所有权关于某个对象/资源的所有者(在这种情况下是Device
一个实例)。 各种std::unique_ptr
, boost::scoped_ptr
或std::shared_ptr
都是关于所有权的。
然而,Nullity更简单:它只是表示给定对象是否可能为空,并不关心其他任何事情,当然也不关心所有权!
如果你的目标是实现一个PIMPL,你可能需要一个带有深层复制语义的智能指针,这是将你的类的实现移向unique_ptr
(一般情况)是正确的。
这清楚地表明,你的班级是唯一对这段记忆负责的人,并且整洁地处理记忆可能以其他方式泄漏的各种方式。
另一方面,这些资源的大多数用户并不在乎它的所有权。
只要函数不保存对象的引用(将其存储在地图或其他地方),那么重要的是对象的生命周期超过函数调用的持续时间。
因此,选择如何传递参数取决于其可能的Nullity:
这真的取决于。 如果函数必须拥有unique_ptr的所有权,那么它的签名应该采用unique_ptr<Device>
bv 值 ,调用者应该std::move
指针。 如果所有权不是问题,那么我会保留原始指针签名并使用get()
传递指针unique_ptr。 如果有问题的功能没有接管所有权,这并不难看。
我会使用std::unique_ptr const&
。 使用非const引用将使被调用的函数可以重置指针。
我认为这是一种很好的方式来表达你的被调用的函数可以使用指针,但没有别的。
所以对我来说,这将使界面更易于阅读。 我知道,我不必用指针传递给我。
上一篇: c++