Récupération automatique de classes?...

Résolu
cs_hakimus Messages postés 25 Date d'inscription samedi 14 octobre 2006 Statut Membre Dernière intervention 8 juillet 2010 - 14 oct. 2009 à 21:39
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!

3 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
14 oct. 2009 à 22:54
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;
}
3
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
14 oct. 2009 à 23:22
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
}/*__________________________________________________________
*/
3
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
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
0
Rejoignez-nous