假设我有一个图书馆,里面有Document
班级。一个实例Document
可以拥有多个实例Field
. Field
有多个子类(例如IntegerField
and StringField
),甚至 API 用户也可以对其进行子类化并提供子类实例Document
(假设用户可以开发自定义类型的数据来存储在字段中)。
我想曝光的是Field
拥有的实例Document
通过 API 以用户可以与其交互的方式,但是不转移所有权.
这样做的正确方法是什么?
我想:
- 暴露一个
const std::unique_ptr<Field>&
参考-这感觉很丑
- 暴露出一个平淡的样子
Field*
指针 - 这感觉不对,因为用户可能不确定是否应该删除该实例
- Using
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&
(也许有一个const
).
用户需要了解,如果从地图中删除该元素,则引用将失效 - 但由于单一所有权模型,无论您做什么,都会出现这种情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)