2010-10-20 3 views
0

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.

  1. Utilisez une classe ConflictResolverFactory et créer un objet de ConflictResolver pour PluginLoader.
  2. Transmettre un ConflictResolver* construit au PluginLoader via son constructeur ou une fonction membre SetConflictResolver 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 est NULL. Et je ne peux pas utiliser les exceptions comme c'est la coutume ici. Si je le passe par SetConflictResolver, 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 membre ConflictResolver* est NULL partout où je l'utilise.
  3. Passez une ConflictResolver & à PluginLoader s Load méthode où tout le travail sera fait. À son tour, Plugin s méthode de chargement doit également accepter un ConflictResolver & (bien qu'il n'a aucune utilité pour cela) et le transmettre à AddDataPluginLoader 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!

+0

Y aura-t-il différents types de 'ConflictResolver'? –

+0

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'? –

+0

oui pour les deux ci-dessus :) – nakiya

Répondre

1

Vous pouvez transmettre un ConflictResolver & au constructeur PluginLoader. Vous pouvez maintenant garantir que l'objet n'est pas nul.

+0

: S. Et stocker son pointeur? : S: S: S: S: S – nakiya

+1

Non, stocker la référence. Vous pouvez déclarer des variables membres comme références. –

Questions connexes