2009-11-09 11 views
0

Je me demandais quelle est la meilleure pratique re. passant (une autre classe) parmi deux instances de la même classe (appelons cela 'Primaire'). Donc, essentiellement dans le constructeur pour le premier, je peux initialiser l'instance externe (appelons ceci 'Shared') - et ensuite la définir sur une valeur particulière pendant que je traite cette classe dans main().Passant une autre classe parmi les instances

Donc 'Partagé', peut être un int, disons 999 maintenant.

Maintenant, que se passe-t-il si je crée une autre instance de la classe principale 'Primary'? quel est le meilleur moyen d'accéder à l'instance externe déjà initialisée de 'Shared' - parce que si je ne gère pas cela correctement, le constructeur de 'Primary', lorsqu'il est appelé à nouveau, va simplement créer une instance de 'Shared', et ainsi je perds la valeur 999 .. je peux penser à quelques solutions désordonnées impliquant des pointeurs dynamiques et si des déclarations (juste) mais j'ai l'impression qu'il pourrait y avoir une solution plus simple et plus propre?

+0

difficile à suivre ... pouvez-vous élaborer avec du code peut-être? – fretje

+1

Votre question est source de confusion. Les classes ne sont pas initialisées; les instances font. Pourriez-vous réviser votre question pour utiliser plus précisément les termes «classe» et «instance»? –

+0

Et essayez d'éviter les termes tels que «cette classe». Je ne peux pas dire si vous voulez dire la classe extérieure ou l'autre instance de la classe (quels qu'ils soient). –

Répondre

3

Comme je le comprends:

  • Vous avez une classe A
  • Vous avez une classe B
  • Pour tous les membres de la classe A il y a une seule instance de la classe B

Vous n'avez pas mentionné si des paramètres du constructeur A sont utilisés pour initialiser B!
Qu'arrive-t-il aux paramètres du second A utilisés pour B?
Nous supposerons donc que B est construit par défaut.
Nous supposerons également que vous avez besoin de l'instance de B pour être évaluée paresseusement sinon vous utiliseriez simplement un membre statique.

class A 
{ 
    B& bRef; 
    public: 
     A() 
      :bRef(getLazyB())  // Get a reference to the only B for your object. 
     {}      

    private: 
     static B& getLazyB() 
     { 
      static B instance; // Created on first use 
      return instance; // returned to all users. 
     } 
}; 
+0

merci l'homme! awesome :) – oneAday

+0

Cependant, cela introduit un singleton qui aura des problèmes avec le threading et le test. De même, vous ne pouvez pas envoyer de paramètres à son constructeur. Cela dépend des détails de ce dont vous avez besoin – Mark

+0

@Mark: Oui, cette démo simpliste absolue introduit un singelton. Mais dans un environnement tdd, c'est simpicity lui-même de transformer getLazyB() en usine pour générer l'objet approprié. Mais je trouve qu'il est généralement préférable de répondre à une question à la fois. Ne pas essayer et expliquer l'ensemble du C++ en un seul coup. –

2

Faites en sorte que le constructeur prenne un pointeur ou une référence à la classe partagée. Il est plus facile de construire à l'extérieur.

class Shared; 

class Same 
{ 
    shared& shared_; 

    Same(Shared& s) { shared_ = s; } 
} 

Avec manipulé correctement const et d'autres constructeurs, etc.

+2

Une chose qui doit être résolue si vous allez avoir des références à une instance partagée d'une classe est la propriété - qui est responsable du nettoyage de l'instance d'objet 'Shared'? Est-ce l'une des instances «Same» ou quelque chose d'autre? Il n'y a pas de bonne réponse - mais c'est quelque chose qui doit être considéré dans la façon dont le partage est conçu. –

+0

Re-propriété. – Mark

0

Cela dépend de la sémantique de vos classes. Si la classe extérieure n'est pas vraiment à l'extérieur mais quelques détails d'implémentation obscurs qui se trouvent partagés entre les instances, passez la première instance au constructeur de la deuxième instance et obtenez une référence à l'instance externe.

Si la classe externe est vraiment une classe externe avec une signification en elle-même, créez-la à l'extérieur et transmettez-la au constructeur comme Mark l'a suggéré.

Si non seulement deux instances spécifiques mais toutes les instances partagent la même instance de la classe externe, pensez à en faire un membre statique de la classe, comme l'a suggéré Martin York.

Questions connexes