J'ai le problème suivant.Pointeurs de membres ou arguments de référence?
J'ai obtenu une classe PluginLoader
qui supervise le chargement des plugins. Il divise les sous-étapes de travail à d'autres classes comme Plugin
. Plugin
appelle les fonctions de PluginLoader
dans son traitement. Appelons cette fonction AddData
. Ici, PluginLoader
doit vérifier si les données qu'il reçoit sont en double. Pour cela, il utilise une classe ConflictResolver
. Maintenant, mon problème est de savoir comment rendre un objet de ConflictResolver
disponible à PluginLoader
. Il y a 3 façons de voir ça.
- Utilisez une classe
ConflictResolverFactory
et créer un objet deConflictResolver
pourPluginLoader
. - Transmettre un
ConflictResolver*
construit auPluginLoader
via son constructeur ou une fonction membreSetConflictResolver
et le stocker dans une variable membre et l'utiliser plus tard. Les deux façons ont des inconvénients. Si je le passe dans le constructeur, je devrai lancer si le pointeur estNULL
. Et je ne peux pas utiliser les exceptions comme c'est la coutume ici. Si je le passe parSetConflictResolver
, il n'y a aucun moyen que je puisse garantir que cette fonction sera effectivement appelée par l'utilisateur. Ou je vais devoir vérifier si le membreConflictResolver*
estNULL
partout où je l'utilise. - Passez une
ConflictResolver &
àPluginLoader
sLoad
méthode où tout le travail sera fait. À son tour,Plugin
s méthode de chargement doit également accepter unConflictResolver &
(bien qu'il n'a aucune utilité pour cela) et le transmettre àAddData
oùPluginLoader
sera en mesure de l'utiliser.
La troisième méthode est plus sûre comparée à la seconde. Cependant, je dois passer une référence même quand elle n'est pas utilisée.
Si la première méthode ne peut pas être utilisée, quelle est la meilleure façon de procéder?
Toutes mes excuses pour le mur: wq!
Y aura-t-il différents types de 'ConflictResolver'? –
Est-ce que le code de niveau supérieur appelle 'PluginLoader :: Load()', qui appelle 'Plugin :: Load()', qui appelle 'PluginLoader :: AddData()', qui appelle une méthode dans 'ConflictResolver'? –
oui pour les deux ci-dessus :) – nakiya