Скажем, у меня есть библиотека, которая имеет класс 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.)