Я пытаюсь реализовать очень чистый шаблон команды в библиотеке.
Сейчас у меня есть следующая структура (несколько частей все еще дорабатываются):
- у пользователей (клиент-код) есть некоторый объект, назовите его «Менеджер»
Manager
содержит коллекциюshared_ptr<Foo>
Manager
предоставляет доступ к коллекции, возвращаяshared_ptr<Foo>
- У меня есть абстрактный класс
Command
и иерархия команд для действий, выполняемых наFoo
- Код клиента не должен вызывать
Command::execute()
, толькоManager
должен,Manager::execute(shared_ptr<Command>)
, чтобы он мог обрабатывать отмену/возврат
Я хотел бы следовать следующим правилам:
- у пользователей (клиент-код) есть некоторый объект, назовите его «Менеджер»
Manager
содержит коллекциюshared_ptr<Foo>
Manager
предоставляет доступ к коллекции, возвращаяshared_ptr<const Foo>
- У меня есть абстрактный класс
Command
и иерархия команд для действий, выполняемых наFoo
- Клиентский код не может (без обходных путей) вызывать
Command::execute()
, толькоManager
может,Manager::execute(shared_ptr<Command>)
, чтобы он мог обрабатывать отмену/повтор и получать неконстантные интеллектуальные указатели Manager
должен иметь возможность разрешитьCommand
объектам доступ и изменениеshared_ptr<Foo>
, даже если пользователь инициализируетCommand
objecst с помощьюshared_ptr<const Foo>
.
Я просто пытаюсь найти лучший способ справиться с раздачей shared_ptr<const Foo>
, позволяя работать номерам 5 и 6.
Есть ли какой-нибудь пример/шаблон проектирования, который делает это, из которого я мог бы извлечь уроки? Хорошая ли это идея по сравнению с тем, что у меня уже есть/над чем я работаю?
shared_ptr<const Foo>
, не могли бы вы вместо этого выдать ключ или индекс в контейнере, откуда он пришел? Это избавит от необходимости иметь дело сconst_cast
и его потенциальными ловушками. - person Emile Cormier   schedule 22.04.2011