begin process at 2012 05 30 14:59:10
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

mercredi 14 octobre 2009 à 21:39:30 | Récupération automatique de classes?...

hakimus

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!
mercredi 14 octobre 2009 à 22:54:52 | Re : Récupération automatique de classes?...

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !
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.

Code C/C++ :
#include <iostream>
#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<Animation*>::iterator iter;
  typedef std::vector<Animation*>::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<Animation*> _list;
};

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

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

  return 0;
}
mercredi 14 octobre 2009 à 23:22:28 | Re : Récupération automatique de classes?...

Lucky92

Réponse acceptée !
Salut,

C'est rigolo, j'ai presque la même solution que CptPingu !
Les différences :

    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.


Code C/C++ :
/*__________________________________________________________
*/
#include <iostream>
#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<Anim*> container ;
	typedef std::list<Anim*>::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
}/*__________________________________________________________
*/
vendredi 16 octobre 2009 à 00:09:38 | Re : Récupération automatique de classes?...

hakimus

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


Cette discussion est classée dans : problème, récupération, crée, classes, automatique


Répondre à ce message

Sujets en rapport avec ce message

Problème "général" avec Direct3D, HELP ! [ par ProGamer ] J'ai commencé une application Direct3D. Elle était constituée d'une classe principale qui contenait l'objet LPDIRECT3D8. Tout marchait bien. Ensuite, problème espace mémoire [ par borgeomi ] borgeomibonjouuuuuuur !!!!!encore une question stupide d'un programmeur cobol MVSsous VISUAL C ++ 6J'ai crée une classe Personne du stylePersonne Tab problème de récupération d'un CString [ par anubis52100 ] Bonjour je souhaite récupétrer un text d'une éditeBox a partir d'une autre fenetreces à dir que j'ai une classe (fenetre dlg) ou il y a une zone de te Problème avec les classes [ par NAVIE ] Bonjour, j'écris ce message pour vous demander de l'aide au sujet d'un programme que j'ai conçu. Après avoir crée une classe, que j'ai appellé Bouto Problème d'opérateurs sur des classes filles [ par pcmanprogrammeur ] Bonjour,Je vous expose mes classes :- class Complexe- class Cartesien:public Complexe- class Polaire:public ComplexeComme vous pouvez le constater, j' Problème récupération de donnée INI [ par shub85 ] Bonjour, J'ai un problème lors de la relecture de mes fichiers INI.Mon fichier est structurée comme ceci:[1]003032033021[2]001002004001...Pour relire Problème de récupération de donnéesd'une base DAO [ par neorion ] Bonjour.Mon problème est le suivant : j'ai réussit à créer une base de données DAO, j'arrive à inserer des informations sans problème, mais je n'arriv problème de classes [ par mohdaef ] Bonjour à tous Voici mon problème, je dispose de classes une classe jeu et une classe communication. La classe jeu gère toute les actions du jeu et l Problème d'égalité avec OleDateTime [ par palmipede ] Bonjour à tous ! Depuis assez longtemps, j'ai un soucis avec l'opérateur d'égalité (==) des OleDateTime qui donne parfois un résultat erroné. Le prob [ URGENT ] Problème d'inclusion récursifs pour classes interdépendantes ( Fils<->Pere ) [ par beepmaster ] J'ai un petit problème d'include en C++, j'espère que vous pourrez m'éclairer. J'ai passé pas mal de temps dans le VB et le JAVA où ces problèmes d'in


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,920 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales