Скажем, у меня есть библиотека, которая имеет класс Document
. Экземпляр Document
может иметь несколько экземпляров Field
. Field
имеет несколько подклассов (например, IntegerField
и StringField
), и даже пользователь API может подклассифицировать его и предоставить экземпляры подкласса на Document
(допустим, пользователю разрешено создавать пользовательский тип данных для хранения в поле).
Я хотел бы предоставить экземпляры Field
, принадлежащие Document
, через API таким образом, чтобы пользователи могли взаимодействовать с ними, но без передачи права собственности.
Каков правильный способ сделать это?
Я думал о:
- Предоставление ссылки
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.)