У меня есть следующая проблема.Указатели элементов или ссылочные аргументы?
У меня есть класс PluginLoader
, который контролирует загрузку плагинов. Он делит подэтапы работы на другие классы, такие как Plugin
. Plugin
выполняет функции PluginLoader
при обработке. Назовем эту функцию AddData
. Здесь PluginLoader
должен проверить, являются ли получаемые данные дублирующими. Для этого он использует класс ConflictResolver
. Теперь моя проблема заключается в том, как сделать объект ConflictResolver
доступным для PluginLoader
. Есть три варианта, которые я вижу из этого.
- Используйте
ConflictResolverFactory
класс и создать объектConflictResolver
дляPluginLoader
. - Пройдите построенный
ConflictResolver*
вPluginLoader
через его конструктор или функцию-членSetConflictResolver
и сохраните его в переменной-члене и используйте его позже. Оба пути имеют недостатки. Если я передам его в конструкторе, мне придется бросать, если указательNULL
. И я не могу использовать исключения, поскольку это обычай здесь. Если я передам его черезSetConflictResolver
, я не могу гарантировать, что эта функция будет фактически вызвана пользователем. Или мне нужно будет проверить, является ли членConflictResolver*
NULL
везде, где я его использую. - Передайте
ConflictResolver &
вPluginLoader
sLoad
метод, где все работы будут выполнены. В свою очередь,Plugin
s Метод загрузки должен принять такжеConflictResolver &
(хотя он ему не нужен) и передать это обратно наAddData
, гдеPluginLoader
сможет его использовать.
Третий способ безопаснее по сравнению со вторым. Тем не менее, я должен передать ссылку, даже если она не используется.
Если первый метод не может быть использован, что это лучший способ сделать это?
Извинения за стеной: wq!
Будут ли разные типы 'ConflictResolver'? –
Это то, что какой-то код верхнего уровня вызывает 'PluginLoader :: Load()', который вызывает 'Plugin :: Load()', который вызывает 'PluginLoader :: AddData()', который вызывает некоторый метод в 'ConflictResolver'? –
yes to both above :) – nakiya