假设我有一个库,其中包含一个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&
并在缺少名称时抛出异常呢? - galop1ngetBar
方法将所有权交给调用者,以及一个releaseBar
方法将所有权归还给Foo
。这需要Foo
类的用户在完成后始终释放其所有权。 - Some programmer dude