2010-10-20 3 views
0

У меня есть следующая проблема.Указатели элементов или ссылочные аргументы?

У меня есть класс PluginLoader, который контролирует загрузку плагинов. Он делит подэтапы работы на другие классы, такие как Plugin. Plugin выполняет функции PluginLoader при обработке. Назовем эту функцию AddData. Здесь PluginLoader должен проверить, являются ли получаемые данные дублирующими. Для этого он использует класс ConflictResolver. Теперь моя проблема заключается в том, как сделать объект ConflictResolver доступным для PluginLoader. Есть три варианта, которые я вижу из этого.

  1. Используйте ConflictResolverFactory класс и создать объект ConflictResolver для PluginLoader.
  2. Пройдите построенный ConflictResolver* в PluginLoader через его конструктор или функцию-член SetConflictResolver и сохраните его в переменной-члене и используйте его позже. Оба пути имеют недостатки. Если я передам его в конструкторе, мне придется бросать, если указатель NULL. И я не могу использовать исключения, поскольку это обычай здесь. Если я передам его через SetConflictResolver, я не могу гарантировать, что эта функция будет фактически вызвана пользователем. Или мне нужно будет проверить, является ли член ConflictResolver*NULL везде, где я его использую.
  3. Передайте ConflictResolver & в PluginLoader s Load метод, где все работы будут выполнены. В свою очередь, Plugin s Метод загрузки должен принять также ConflictResolver & (хотя он ему не нужен) и передать это обратно на AddData, где PluginLoader сможет его использовать.

Третий способ безопаснее по сравнению со вторым. Тем не менее, я должен передать ссылку, даже если она не используется.

Если первый метод не может быть использован, что это лучший способ сделать это?

Извинения за стеной: wq!

+0

Будут ли разные типы 'ConflictResolver'? –

+0

Это то, что какой-то код верхнего уровня вызывает 'PluginLoader :: Load()', который вызывает 'Plugin :: Load()', который вызывает 'PluginLoader :: AddData()', который вызывает некоторый метод в 'ConflictResolver'? –

+0

yes to both above :) – nakiya

ответ

1

Вы можете передать ConflictResolver & в конструктор PluginLoader. Теперь вы можете гарантировать, что объект не является нулевым.

+0

: S. И сохранить его указатель? : S: S: S: S: S – nakiya

+1

Нет, сохраните ссылку. Вы можете объявлять переменные-члены как ссылки. –

Смежные вопросы