J'utilise C et struct
s où une structure peut avoir des membres mais pas des fonctions. Supposons par souci de simplicité que je veuille créer une structure pour les chaînes que je nomme str
et que je veux pouvoir faire str.replace(int i, char c)
où i
est l'index de la chaîne et c
est le caractère pour remplacer le caractère à la position i
. Cela ne serait-il jamais possible car les structures ne peuvent pas avoir de fonctions ou existe-t-il encore un moyen d'implémenter ce comportement et d'imiter qu'une structure pourrait avoir une fonction (simple) qui n'est en fait que la structure se copiant dans une nouvelle structure et mettant à jour son domaines, ce qu'il pourrait faire?
Il replace
pourrait donc s'agir d'un troisième membre de la structure qui pointe vers une nouvelle structure qui est mise à jour lors de son accès ou similaire. Cela pourrait-il être fait? Ou y a-t-il quelque chose de intégré ou une théorie ou un paradigme qui empêche mon intention?
L'arrière-plan est que j'écris du code C et je me retrouve à réinventer des fonctions que je connais comme des bibliothèques intégrées dans les langages OOP et que OOP serait un bon moyen de manipuler des chaînes et des commandes.
la source
str.replace(&str, i, c)
quand même. C ++ automatisethis
bien sûr le passage du pointeur.Réponses:
Votre fonction devrait ressembler à ceci.
Cela accepte un pointeur sur l'objet sur lequel opérer comme premier paramètre. En C ++, il s'agit du
this
pointeur et n'a pas besoin d'être déclaré explicitement. (Comparez cela à Python où il le faut.)Pour appeler votre fonction, vous devez également passer ce pointeur explicitement. Fondamentalement, vous échangez la
o.f(…)
syntaxe pour laf(&o, …)
syntaxe. Pas grave.L'histoire devient plus impliquée si vous souhaitez prendre en charge le polymorphisme (aka
virtual
fonctions). Il peut également être émulé en C (je l'ai montré pour cette réponse ) mais ce n'est pas joli à faire à la main.Comme l' a commenté Jan Hudec , vous devez également prendre l'habitude de préfixer le nom de la fonction avec le nom du type (c'est-à-dire
string_replace
) parce que C n'a pas d'espace de nom, il ne peut donc y avoir qu'une seule fonction nomméereplace
.la source
string_replace
, car C n'a pas de surcharge de fonction non plus et vous en aurez probablement une autrereplace
pour un autre type…string_replace
. Les noms commençant parstr
,mem
ouwcs
suivis d'une lettre minuscule sont réservés pour de futures extensions.Les structures peuvent contenir des pointeurs de fonction , mais ceux-ci ne sont vraiment nécessaires que pour les méthodes virtuelles. Les méthodes non virtuelles en C orienté objet sont généralement effectuées en passant la structure comme premier argument à une fonction régulière. Regardez Gobject pour un bon exemple d'un cadre OOP pour C. Il utilise des macros pour gérer une grande partie du passe-partout requis pour l'héritage et le polymorphisme.
C a été créé il y a 44 ans. C'est un langage très populaire pour l'open source. Vous n'êtes pas la première personne à penser que les cordes C standard sont difficiles à utiliser. Faites quelques recherches pour les bibliothèques de chaînes C. Vous n'avez pas à réinventer la roue.
la source
Avec les pointeurs de fonction, vous pouvez faire:
Ceci n'est généralement utile que si l'implémentation peut changer, auquel cas vous devez utiliser une table virtuelle afin que la surcharge ne soit qu'un pointeur par structure:
la source
str
(oumem
ouwcs
) et une lettre minuscule sont réservés par la norme C pour de futures extensions, donc ne l'appelez passtring_replace
.str_replace
c'est bien.Oui, ils le peuvent, en quelque sorte. Vous pouvez utiliser le fait que C permet aux pointeurs de fonctionner en blocs de mémoire, alias pointeurs de fonction et en utilisant cela, vous pouvez créer une interface comme le polymorphisme ainsi que des fonctions virtuelles (même si ce n'est pas si joli).
J'ai écrit un article de blog sur ce sujet, suite à une question d'un de mes étudiants, récemment, relative au code d'interface en C et Go, vous pouvez le lire ici:
Article de blog sur les interfaces non OO
Voyez si cela vous donne des idées.
Vous pouvez également simplement mettre une fonction gratuite dans votre code et utiliser un pointeur "this", ce qui signifie que vous passez un pointeur sur une structure existante pour travailler, comme décrit dans d'autres réponses.
la source