2009-11-14 4 views
-1

Je n'ai pas utilisé le C++ depuis longtemps, et je suis devenu trop à l'aise avec la facilité d'utilisation des langages réels. En tout cas, j'essaye d'implémenter le modèle de commande, et j'ai besoin de mapper un certain nombre d'implémentations d'objet de commande aux chaînes de caractères. J'ai une carte STL de la chaîne à la commande, et je voudrais copier la commande.Copier une classe qui hérite d'une classe avec des méthodes virtuelles pures?

Essentiellement,

Command * copiedCommand = new Command(commandImplementation); 

Et je voudrais conserver la fonctionnalité de commandImplementation. Puisque la commande a la fonction virtuelle pure execute, cela ne fonctionne pas. Quelle est la bonne façon de faire cela?

+0

Pouvez-vous afficher plus de code? Je ne vois pas comment la tuile de votre question est liée au corps. ;-) – Achim

+0

Une carte STL de la chaîne aux pointeurs de commande, vous voulez dire? –

+3

Pour de vrai ... Je veux dire venir un! Même si vous n'aimez pas le C++, en disant que ce n'est pas un ** vrai langage ** ... – JRL

Répondre

4

Une façon de le faire serait d'avoir ajouter à votre classe de commande:

public: 
    virtual Command * Clone() const = 0; 

.. . puis dans les différentes sous-classes de commande, mettre en œuvre Clone() pour renvoyer une copie de l'objet:

public: 
    virtual Command * Clone() const {return new MyCommandSubclass(*this);} 

une fois cela fait, vous pouvez faire ce que vous voulez comme ceci:

Command * copiedCommand = commandImplementation->Clone(); 
+0

Je parie que Go rend cela plus élégant. –

+0

YES ce serait une bonne réponse pour Java. –

0

Si Command est une classe abstraite, vous ne pourrez pas appeler le constructeur de copie directement. Au lieu de cela, vous pouvez envisager de créer une méthode clone() qui renvoie une copie complète de l'objet. Cela pourrait aussi être une méthode pure virtuelle qui retourne votre classe de base, tels que:

class Command { 
    public: 
     virtual Command* clone(void) const = 0; 
}; 
1

http://en.wikipedia.org/wiki/Prototype_pattern

Un modèle prototype est un modèle de conception créationnelle utilisé dans le développement logiciel lorsque le type d'objets pour créer est déterminé par un exemple prototypique, qui est cloné pour produire de nouvelles objets. Ce modèle est utilisé pour :

  • Évitez les sous-classes d'un dans l'application client créateur d'objet , comme le modèle usine abstraite fait.
  • éviter le coût inhérent de créer un nouvel objet de la manière standard (par exemple, en utilisant la « nouvelle » mot-clé) quand il est prohibitif coûteux pour une application donnée.

Pour mettre en œuvre le modèle, déclarer une classe de base abstraite qui spécifie une méthode clone virtuel pur (). Toute classe ayant besoin d'une capacité de «constructeur polymorphe» dérive elle-même de la classe de base abstraite et implémente l'opération clone() .

Le client, au lieu d'écrire du code qui invoque l'opérateur « nouveau » sur un nom de classe codés en dur, appelle la méthode clone() sur le prototype, appelle une méthode d'usine avec un paramètre désignant la classe dérivée concrète particulière souhaitée, ou invoque la méthode clone() grâce à un mécanisme fourni par un autre motif de conception.

Questions connexes