2008-10-05 4 views
4

Après avoir implémenté le modèle de stratégie, j'ai voulu créer un tableau de type interface, auquel je peux ensuite ajouter n'importe quel type de béton.Modèle de conception de stratégie C++, création d'un tableau d'interface

Pour ceux qui ne connaissent pas le modèle de stratégie: http://en.wikipedia.org/wiki/Strategy_pattern Dans cet exemple particulier, je voudrais faire un tableau de StrategyInterface, que je peux ensuite remplir avec un de type concret, B et C. Cependant, parce que c'est une classe abstraite, je ne peux pas le faire. Y a-t-il un moyen de le faire, ou est-ce complètement impossible, sans enlever la méthode abstraite?

+0

Même si vous pouviez créer un tableau/vecteur de l'interface, vous souffriez du problème du découpage d'objet. Donc, une autre raison d'utiliser des pointeurs. –

Répondre

2

stocker des pointeurs pas des objets ..... utilisez boost :: shared_ptr si vous voulez stocker des objets.

6

Faire les pointeurs de magasin de tableau pour le type d'interface:

typedef std::vector<Interface *> Array; 
Array myArray; 
myArray.push_back(new A()); 

De plus, vous pouvez utiliser ptr_vector qui gère la mémoire pour vous:

typedef boost::ptr_vector<Interface> Array; 
// the rest is the same 
1

errr, par exemple ... std: : vecteur < boost :: shared_ptr < AbstractStrategy>>

+0

Vous pouvez modifier votre propre réponse originale - il suffit de cliquer sur le "modifier" lien –

+0

excellent, c'est beaucoup plus cool :) –

1

Que diriez-vous d'utiliser un boost?

Voici un exemple de ce qu'il ressemblerait

#include <list> 
#include <boost/any.hpp> 

using boost::any_cast; 
typedef std::list<boost::any> many; 

void append_int(many & values, int value) 
{ 
    boost::any to_append = value; 
    values.push_back(to_append); 
} 

void append_string(many & values, const std::string & value) 
{ 
    values.push_back(value); 
} 

void append_char_ptr(many & values, const char * value) 
{ 
    values.push_back(value); 
} 

void append_any(many & values, const boost::any & value) 
{ 
    values.push_back(value); 
} 

void append_nothing(many & values) 
{ 
    values.push_back(boost::any()); 
} 

Semble agréable et élégant, plus vous obtenez le code bien testé et peut traiter vos valeurs comme des objets au lieu des pointeurs

Note: Ces noms de fonction sont informatifs, mais vous pouvez utiliser overriding pour avoir une seule interface.

+0

Ceci est une option raisonnable, mais vous devriez entrer dans plus de détails –

+0

Merci 1800. J'aurais probablement ajouté un exemple pour le rendre clair pourquoi stimuler tout serait bon. Alors maintenant je l'ai fait. –

Questions connexes