Je vais essayer de garder mon code d'échantillon très simple, mais il peut y avoir des erreurs car je le saisis sur place.Composition C++ avec itérateur
J'ai une classe appelée Téléphone.
class Phone
{
public:
Phone(std::string manufacturer, std::string model, std::vector<Feature> features);
private:
std::vector<Features> features;
std::string model;
std::string manufacturer;
};
J'ai une structure nommée Feature. Comme vous pouvez le voir, un téléphone a une liste (vecteur) de caractéristiques: ie. Bluetooth, GPS, radio, etc, qui ont une catégorie: mise en réseau, navigation, multimédia.
Désormais, les informations sur les téléphones et les fonctionnalités sont stockées dans une base de données sqlite3. J'ai une fonction d'assistance qui récupérera un modèle de téléphone particulier de la base de données et retournera un objet de téléphone rempli. J'ai également une fonction qui prend en charge un objet Téléphone et écrit le téléphone dans la base de données.
Le problème est que je dois fournir au client un moyen d'itérer sur la liste des fonctionnalités d'un téléphone. Pour commencer, l'assistant de base de données doit connaître les fonctionnalités pour pouvoir les écrire dans la base de données. Deuxièmement, le client peut avoir besoin de récupérer un téléphone de la base de données et ensuite afficher la liste des fonctionnalités à l'utilisateur.
Une solution est d'ajouter les fonctions suivantes en classe Téléphone
std::vector<Feature>::iterator begin()
std::vector<Feature>::iterator end()
Ce n'est pas une solution idéale pour moi parce que le code client ne regardera pas intuitive - il apparaîtra comme si le client est itérez une Téléphone, quand ils sont en train d'itéter sur les fonctionnalités.
Une autre solution est discutée dans un article au http://accu.org/index.php/journals/1527 qui traite de l'utilisation d'une technique nommée "memberspaces" pour exposer les itérateurs au code client. Il en résulterait un code client plus lisible, mais la mise en œuvre est un peu désordonnée à mon avis.
Y a-t-il une meilleure solution au problème de l'itérateur, ou peut-être y a-t-il un motif de conception plus approprié que je pourrais utiliser.
Tous les commentaires seraient grandement appréciés.
L'article sur les espaces membres et leur utilisation pour exposer les itérateurs est très intéressant, merci pour le lien! –
Je pense qu'il me manque quelque chose. Y at-il une mauvaise partie à propos de l'itération de 'Phone :: features'? – SingleNegationElimination