【发布时间】:2014-05-31 11:41:56
【问题描述】:
假设我有一个库,它有一个 Document 类。 Document 的一个实例可以拥有多个Field 实例。 Field 有多个子类(例如IntegerField 和StringField),甚至API 用户也可以对其进行子类化,并将子类实例提供给Document(假设用户可以开发自定义类型的数据来存储在字段中)。
我想通过 API 公开Document 拥有的Field 实例,以便用户可以与它们交互,但不转移所有权。
这样做的正确方法是什么?
我想过:
- 暴露
const std::unique_ptr<Field>&引用 - 这感觉很丑 - 暴露一个普通的
Field*指针 - 这感觉不对,因为用户可能不确定是否应该删除该实例 - 改用
std::shared_ptr- 这感觉很糟糕,因为所有权并未真正共享
例如,
class Document {
private:
std::map<std::string, std::unique_ptr<Field> > fields;
// ...
public:
// ...
// How is this done properly?
const std::unique_ptr<Field> &field(const std::string &name) {
return fields[name];
}
}
期待您的建议。
(我也欢迎有关 @Fulvio 建议的替代方法的建议。)
【问题讨论】:
-
为什么不简单地
Bar&并抛出缺少的名字? -
您忘记了一个替代方案:将所有权归还给调用者的
getBar,以及将所有权归还给Foo的releaseBar。它要求您的Foo类的用户在完成后始终释放其所有权。 -
@Joacim - 我没有忘记,但我在问题中说我想在不转移所有权的情况下这样做。 :)
标签: c++ c++11 unique-ptr ownership