[C++] Pointeur sur constructeur ou Pointeur sur Classe ?

Pointeur sur constructeur ou Pointeur sur Classe ? [C++] - C++ - Programmation

Marsh Posté le 29-11-2004 à 14:04:54    

Bonjour
 
J'aimerai pouvoir créer des callbacks qui me permettrait d'instancier des objets. J'ai actuellement mis en place une parade en utilisant une méthode statique qui ne fait que faire le même boulot qu'un constructeur, qui peut être facilement pointée
 
Message *(*)(Contact *)
 
Mais ca m'oblige à rajouter pas mal de code, dupliqué assez souvent pour peu de choses. Je cherche un moyen de contourner le problème, sans template. Une solution consisterait à utiliser des pointeurs de constructeur ou des pointeurs de classes qui m'autoriseraient à faire des 'new' dessus. Mais je ne sais même pas si ca existe.
 
Vous avez une idée ?
 
Lelfe

Reply

Marsh Posté le 29-11-2004 à 14:04:54   

Reply

Marsh Posté le 29-11-2004 à 16:14:28    

fais une fonction static factory dans ta classe
 
class Foo
{
public:
static Foo *factory() { return new Foo; }
};
 
Foo (*f)() =  &Foo::factory

Reply

Marsh Posté le 29-11-2004 à 18:16:42    

Taz a écrit :

fais une fonction static factory dans ta classe
 
class Foo
{
public:
static Foo *factory() { return new Foo; }
};
 
Foo (*f)() =  &Foo::factory


 
En fait, c'est exactement ce que j'ai actuellement.
Mais ca m'oblige à rajouter une fonction statique factory() dans toutes les classes qui ont besoin d'être enregistrée. Et justement, c'est ce problème que je voudrai éviter.
 
En gros, j'ai ca :
 

Code :
  1. Class1::Class1() {
  2.   return ;
  3. }
  4. Class1 * Class1::factory() {
  5.   return new Class1();
  6. }
  7. void Class1::register() {
  8.   Registry::add( Class1::CODE, Class1.factory() );
  9. }
  10. ...
  11. //Et ceci, pour N classes : Class1 à ClassN


 
Or, ces classes héritent toutes de la même classe MetaClasse.
Donc, ca m'embête d'avoir à réimplémenter ces 3 méthodes, dans les N classes, alors que seul le constructeur est vraiment utile.
J'aimerai bien factoriser ce code au niveau de la classe MetaClasse, mais sans template, car j'ai besoin d'avoir des pointeurs MetaClasse *, sans avoir à spécifier un template à chaque fois.
 
Donc, j'avais pensé à un pointeur de constructeur, ce qui m'aurai supprimé le besoin de la factory, ou un pointeur de classe, ce qui aurait eu le même effet.
 
Lelfe


Message édité par lelfe le 29-11-2004 à 18:17:26
Reply

Marsh Posté le 29-11-2004 à 18:27:35    

ben tu peux pas. Tu te fous des limitations à la con 'pas de template' alors paie le prix : code tout.
 
 
Sinon t'as le droit faire comme tout le monde un méthode clone/create en virtuelle pure dans ta classe de base

Reply

Marsh Posté le 29-11-2004 à 18:44:36    

Taz a écrit :

ben tu peux pas. Tu te fous des limitations à la con 'pas de template' alors paie le prix : code tout.


 
C'est pas des limitations à la con. J'avais pensé à mettre des templates, mais dans ce cas là, ma classe de base dépend d'un template, et je ne peux plus avoir de pointeur générique dessus. Ou alors, faut éclater le code de la classe mère en 2.
 

Taz a écrit :


Sinon t'as le droit faire comme tout le monde un méthode clone/create en virtuelle pure dans ta classe de base


 
C'est déjà le cas, mais ca oblige toujours à recoder ces fonctions dans les classes filles.
 
Lelfe

Reply

Marsh Posté le 29-11-2004 à 18:45:42    

lelfe a écrit :

C'est pas des limitations à la con. J'avais pensé à mettre des templates, mais dans ce cas là, ma classe de base dépend d'un template, et je ne peux plus avoir de pointeur générique dessus. Ou alors, faut éclater le code de la classe mère en 2.


 
Pardon o_O ?

Reply

Marsh Posté le 29-11-2004 à 19:22:47    

Joel F a écrit :

Pardon o_O ?


 
Dites si je me trompe mais si je fais ca :
 

Code :
  1. template <typename T>
  2. class MetaClass {
  3. };
  4. class Class1 : public Metaclass<Class1> {
  5. };


 
Je pourrai plus faire un  
 
 MetaData *obj = new Class1(); ?

Reply

Marsh Posté le 29-11-2004 à 19:25:37    

Non, mais rien n'empêche de faire dériver toutes les MetaClass<T> d'une MetaClassBase, complètement abstraite.  
 
Certains (dont moi) prennent d'ailleurs l'habitude de faire souvent dériver (enfin, quand c'est nécessaire) leurs classes templates d'une classe abstraite pour séparer le code qui est relatif au template du code qui est "général".

Reply

Marsh Posté le 29-11-2004 à 19:31:00    

ouais :o

Reply

Marsh Posté le 29-11-2004 à 19:40:40    

Ok, merci, je vais essayer de voir comment je m'en sors... :)

Reply

Marsh Posté le 29-11-2004 à 19:40:40   

Reply

Marsh Posté le 30-11-2004 à 10:02:22    

Lam's a écrit :


Certains (dont moi) prennent d'ailleurs l'habitude de faire souvent dériver (enfin, quand c'est nécessaire) leurs classes templates d'une classe abstraite pour séparer le code qui est relatif au template du code qui est "général".


 
On devrait imprimer ça en corps 100 et le punaisez dans ttes les boites de dev :sweat:

Reply

Marsh Posté le 30-11-2004 à 10:22:30    

Joel F a écrit :

On devrait imprimer ça en corps 100 et le punaisez dans ttes les boites de dev :sweat:


Ou alors utiliser des traits. J'ai eu un assez gros projet où le trait me servait effectivement de métaclasse.
 
Pour ceux qui ne voient pas de quoi je parle:
   http://thad.notagoth.org/cpptraits_intro/
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed