Voila je m’interreogeais si en C il n’y avait pas un moyen totu con de simuler de la programmation objet.
En C nous avons les structures. Il ya aussi les pointeurs de fonctions. Supposons maintenant qu’on mette un pointeur de fonction dans cette structure. Cette structure commencerait a se comporter comme une classe: propriétés, fonctions, etc…
naturellement, aucune référence à this en C, donc pour chaque fonction de la structure, il faudrait passer la structure elle même pour connaitre l’objet courant.
Est ce que théoriquement, c’est possible, ou alors ya un truc énorme que j’ai oublié qui empecherait de faire ce genre de choses?
Bien sur que c’est possible, tout est possible, le probleme c’est “a quel point c’est chiant”. En quoi crois tu que certains langages objet ait ete programme, tout au moins dans leur premiere iteration? (Une des etapes du developpement d’un langage etant assez souvent de devenir self host rapidement, c’est a dire de s’autocompiler/generer, mais il faut bien partir de quelque part…). Les techniques pour gerer ce qu’est un objet et les tableaux de pointeurs de fonctions sont geres de maniere un peu plus complexe que ca, mais il faut bien programmer un langage objet a un moment ou a un autre, et donc oui, c’est faisable en C, ou autre chose.
Si tu veux voir une application pratique de ce principe, jettes un oeil aux interfaces C pour DirectX. Oui, ça existe… Enfin ça existait, j’avais écrit un machin en directdraw7 avec ces interfaces pour le fun, j’imagine que ça doit encore pouvoir se trouver pour dx9. Par contre, c’est bien lourd à utiliser Passer ce qui tient lieu de « this » à chaque appel… argh
[quote name=’[PERE]Cil’ date=’ 25 Apr 2005, 07:36’]Voila je m’interreogeais si en C il n’y avait pas un moyen totu con de simuler de la programmation objet.
En C nous avons les structures. Il ya aussi les pointeurs de fonctions. Supposons maintenant qu’on mette un pointeur de fonction dans cette structure. Cette structure commencerait a se comporter comme une classe: propriétés, fonctions, etc…
naturellement, aucune référence à this en C, donc pour chaque fonction de la structure, il faudrait passer la structure elle même pour connaitre l’objet courant.
Est ce que théoriquement, c’est possible, ou alors ya un truc énorme que j’ai oublié qui empecherait de faire ce genre de choses?
[right][post=« 353126 »]<{POST_SNAPBACK}>[/post][/right][/quote]
C’est ce que fait le toolkit graphique GTK+ avec leur Glib, oublie c’est une horreur indescriptible
En vrais, le plus gros des feature du c++ : c’est du preprocessing: creer une table de vecteur pour les fonctions, stoker le type de l’object, transformer les this->DoThat() en DoThat(this), etc… etc…
C’est particulierement voyant si tu regardes le code genere (asm inside).
Donc techniquement, oui, c’est possible : j’en ai deja fait, et vue a gauche a droite. Mais si tu veux supporter le meme feature set que C++ (avec polymorphie, templates, heritage multiple, virtuals, pure virtuals, interface et compagnie) ca devient tres chiant, et ca oblige a ecrire beaucoup de code en plus, donc ca ne vaut pas vraiment le coup.
Ah bah c’était pas pour réinventer la roue, c’était juste une question comme ca, hein, si j’ai besoin de fonctions de classes etc, je sais que j’ai le C++ ou le C# :P.
Nan en fait je me posais cette question parce que je me disais que les très gros projets en C, ca devait être totalement ingérable de tout programmer avec des fonctions sans aucune notion d’objet.
C’est juste parce que tu n’as pas l’habitude de programmer en C, c’est tout. Mais il y a de tres gros projet en C qui sont tres bien geres (genre le noyau linux, meme si je sais pas si on peut dire que c’est bien gerer… Vu le nombre de personnes dessus, ca devrait )
LoneWolf
Programmer en objet, c’est prendre de mauvaises habitudes
[quote name=’[PERE’]Cil, 26 Apr 2005, 10:34]Nan en fait je me posais cette question parce que je me disais que les très gros projets en C, ca devait être totalement ingérable de tout programmer avec des fonctions sans aucune notion d’objet.
[right][post=« 353553 »]<{POST_SNAPBACK}>[/post][/right][/quote]
oui et non.
ca reste gerable si tu as un minimum d organisation et de propretee: ranger les fonctions par theme dans des fichier separe, les prefixer (dsp_ par exemple pour les fonctions d affichage) pour eviter les collisions etc etc.
le kernel de linux est code en C, et vu la taille du projet, ca montre que c est faisable.
apres c est sur que ca doit vraiment manquer quand on est habitue au C++. construteur destructeur heritage templates et polymorphisme c est quand meme super pratique