Récupération automatique de classes?... [Résolu]

Messages postés
25
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
8 juillet 2010
- - Dernière réponse : cs_hakimus
Messages postés
25
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
8 juillet 2010
- 16 oct. 2009 à 00:09
Bonjour @ tous/toutes,

J'ai un peu d'expérience en C++ mais je bute depuis quelques temps sur un problème qui nécessitera surement les connaissances de spécialistes...

Mettons que je crée une classe virtuelle pure, dont héritent un certain nombre de sous-classes. Mon problème est simple : comment faire en sorte de récupérer automatiquement une et une seule instance de toutes les sous-classes disponibles?

Exemple :
Je crée une classe Animation, dont héritent les sous-classes Anim1, Anim2, Anim3 etc... mais je ne sais pas combien de sous-classes existent, l'idée étant qu'on puisse en rajouter ou en enlever sans rien changer au code.
Comment faire en sorte que par exemple, au lancement de l'appli, la liste des animations dispo s'affiche, tout bêtement ?

Là seule idée que j'ai eue pour l'instant serait un fichier XML à charger à l'initialisation... mais ça ne me semble pas très élégant, et je ne vois même pas quoi mettre dedans.

Y aurait t-il une autre façon de procéder, là, toute prête, bien connue de tous sauf de moi?

Merci d'avance!
Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
3800
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
14 novembre 2019
90
3
Merci
Ce que tu demandes est techniquement impossible (où alors je demande vraiment vraiment à voir !). En effet, il n'est pas possible pour un compilateur de deviner à partir d'une classe qu'elles sont toutes les classes qui en héritent. De plus, dire qu'il faut instancier un objet de chaque n'est pas magique. C'est un cas fonctionnelle qui ne se devine pas.

Néanmoins voici une solution, que je te propose:
On réunit dans une classe Group, toutes les animations. La seule chose à tenir à jour est le constructeur, où on doit lister les classes désirées.

#include 
#include <vector>

class Animation
{
public:
  virtual void display() const = 0;
  Animation() {}
  ~Animation() {}
};

class Anim1 : public Animation
{
public:
  void display() const
  {
    std::cout << "kikoo Anim1" << std::endl;
  }
  Anim1() {}
  ~Anim1() {}
};

class Anim2 : public Animation
{
public:
  void display() const
  {
    std::cout << "kikoo Anim2" << std::endl;
  }
  Anim2() {}
  ~Anim2() {}
};

class Anim3 : public Animation
{
public:
  void display() const
  {
    std::cout << "kikoo Anim3" << std::endl;
  }
  Anim3() {}
  ~Anim3() {}
};

class GroupAnim
{
  typedef std::vector::iterator iter;
  typedef std::vector::const_iterator const_iter;

public:
  GroupAnim()
  {
    /*
      Il faut tenir cette liste à jour
     */
    _list.push_back(new Anim1);
    _list.push_back(new Anim2);
    _list.push_back(new Anim3);
  }

  int size() const
  {
    return _list.size();
  }

  void display() const
  {
    for (const_iter it = _list.begin(); it != _list.end(); ++it)
      (*it)->display();
  }

  ~GroupAnim()
  {
    for (iter it = _list.begin(); it != _list.end(); ++it)
      delete *it;
  }
private:
  std::vector _list;
};

int main()
{
  GroupAnim group; // Can be a singleton

  std::cout << "Size: " << group.size() << std::endl;
  group.display();

  return 0;
}

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 219 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
3
Merci
Salut,

C'est rigolo, j'ai presque la même solution que CptPingu !
Les différences :
[list]
Les constructeurs/destructeurs des produits sont privés, afin que le "builder" soit l'unique
responsable de la vie et la mort des objets.

Le "builder" est d'ailleurs un "singleton".

Je gère la collection avec une liste au lieu d'un vector, mais a posterio, c'est vrai que
le vector est plus performant.

Le builder fournit seulement une méthode qui renvoie une référence sur la liste constante.
/list

/*__________________________________________________________
*/
#include 
#include <list>
/*__________________________________________________________
*/
class Anim
{
public:
virtual void do_something() = 0 ;
};
/*__________________________________________________________
*/
class Anim1 : public Anim 
{ 
friend class builder ;
private:
Anim1(){}
virtual ~Anim1(){}

public:
void do_something() 
{
std::cout << "Anim1::do_something()" << std::endl ;
}
};
/*__________________________________________________________
*/
class Anim2 : public Anim 
{ 
friend class builder ;
private:
Anim2(){}
virtual ~Anim2(){}

public:
void do_something() 
{
std::cout << "Anim2::do_something()" << std::endl ;
}
};
/*__________________________________________________________
*/
class Anim3 : public Anim 
{ 
friend class builder ;
private:
Anim3(){}
virtual ~Anim3(){}

public:
void do_something() 
{
std::cout << "Anim3::do_something()" << std::endl ;
}
};
/*__________________________________________________________
*/
class builder
{
public:
typedef std::list container ;
typedef std::list::const_iterator const_iterator ;

private:
container _li ;

private:
builder()
{
_li.push_back( new Anim1() ) ;
_li.push_back( new Anim1() ) ;
_li.push_back( new Anim2() ) ;
_li.push_back( new Anim2() ) ;
_li.push_back( new Anim3() ) ;
_li.push_back( new Anim3() ) ;
}
virtual ~builder()
{
while( !_li.empty() )
{
delete _li.front() ;
_li.pop_front() ;
}
}

public:
static builder & instance()
{
static builder instance ;
return instance ;
}

const container & get_products() const { return _li ; }
};
/*__________________________________________________________
*/
int main()
{
//appel
const builder::container & cont = builder::instance().get_products() ;

//utilisation
builder::const_iterator it ;
for ( it = cont.begin() ; it != cont.end() ; ++it )
{
(*it)->do_something() ;
}

//destruction automatique
}/*__________________________________________________________
*/

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 219 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Lucky92
Messages postés
25
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
8 juillet 2010
0
Merci
Ah oui, c'est pas bête du tout ça!
Un genre de classe "réservoir", qui gère l'ensemble des animations...

C'est pas exactement ce que j'ai demandé, mais ça limite grandement les modifications en cas d'ajout ou de retrait de classe, et c'est tout ce dont j'ai besoin!

Merci à tous les deux
Commenter la réponse de cs_hakimus