968Fermer970
Kevin KoflerLe 05/05/2010 à 01:52
Folco (./949) :
Donc je n'ai qu'une envie, repartir au C, avec des trucs comme ça : typedef struct {int bidule, long chose, const char *machin, void (*méthode) (long trucmuche, int chouette)} Objet_chose;

sick

On dirait GTK+…
Voilà, ça garde le concept d'objet que je trouve génial en soi, et ça évite de se perdre dans les méandres et complexités des différentes relations entre classes que je ne maitrise pas.

Tu as tout ces concepts quand-même, tu as juste un langage pas du tout fait pour (il est fait pour programmer en procédural) que tu bidouilles pour le faire sembler objet (des pointeurs de fonction dans une structure sick).

De plus, ton code est moins efficace si tu mets les pointeurs vers les méthodes directement dans ta structure au lieu d'utiliser une vtable partagée. Le code machine que donnerait le C++ est plutôt de type:
// ISO C99 paragraphe 6.3.2.3 §8 (cf. n1256.pdf):
// un pointeur de fonction peut être converti en void (*)(void) et de retour
// mais pas nécessairement en void *!
typedef void (*funcptr)(void);

void Objet_chose_methode(long trucmuche, int chouette);
// ISO C99 paragraphe 6.3.2.1 §4 (cf. n1256.pdf):
// La prise d'adresse est implicite pour une fonction, on peut omettre le &
const funcptr Objet_chose_vtable[] = {(funcptr) Objet_chose_methode};

typedef struct {int bidule, long chose, const char *machin, const funcptr *vtable} Objet_chose;