所以我已经解决了这个问题,但如果我所做的是最佳实践,我需要你的意见。
一个简单的类包含 unique_ptrs
的 vector 订购元素。我会解释成员变量null_unique
以下。
class order_collection {
typedef std::unique_ptr<order> ord_ptr;
typedef std::vector<ord_ptr> ord_ptr_vec;
ord_ptr_vec orders;
ord_ptr null_unique;
public:
...
const ord_ptr & find_order(std::string);
....
所以我需要这个类的用户来访问订单unique_ptr
如果找到。但是我不会将对象移出 vector ,所以我要返回 unique_ptr
作为常量引用。我执行的 find_order
方法:
const order_collection::ord_ptr & order_collection::find_order(std::string id) {
auto it = std::find_if(orders.begin(),orders.end(),
[&](const order_collection::ord_ptr & sptr) {
return sptr->getId() == id;
});
if (it == orders.end())
return null_unique; // can't return nullptr here
return *it;
}
由于我是通过引用返回的,所以我不能返回 nullptr。如果我尝试这样做,我会得到 warning : returning reference to a temporary
.如果什么也没找到,程序就会崩溃。所以我加了一个 unique_ptr<order>
名为 null_unique
的成员变量当 find 找不到订单时,我会返回。这解决了问题并且警告消失并且在找不到订单时不会崩溃。
但是我怀疑我的解决方案,因为它让我的类(class)变得丑陋。这是处理这种情况的最佳做法吗?
最佳答案
只有在您关心智能指针的所有权语义时,您才应该返回并接受智能指针。如果您只关心它们指向的内容,则应该返回一个引用 或一个原始指针。
由于您要返回一个虚拟的 null_unique
,很明显该方法的调用者不关心所有权语义。您还可以有一个空状态:因此您应该返回一个原始指针:
order* order_collection::find_order(std::string id) {
auto it = std::find_if(orders.begin(),orders.end(),
[&](const order_collection::ord_ptr & sptr) {
return sptr->getId() == id;
});
if (it == orders.end())
return nullptr;
return it->get();
}
关于c++ - 通过引用返回一个 unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43400850/