La dernière fois, lorsque j'ai créé Bibliothèque de gestion centralisée des ressources
-La structure peut être encapsulée même en C
J'ai écrit.
À ce moment-là, j'ai écrit que ce serait intéressant car il n'y a pas de méthode pour l'instance. Si vous y réfléchissez, vous pouvez ** le réaliser normalement avec un pointeur de fonction **. Alors j'ai fait un échantillon.
4/29 postscript Quand il est réellement pratique à utiliser, c'est [ici](https://qiita.com/developer-kikikaikai/items/47b55456ae6e9c287718#c%E8%A8%80%E8%AA%9E%E3% 81% A7% E3% 81% AE% E3% 82% A4% E3% 83% B3% E3% 82% BF% E3% 83% BC% E3% 83% 95% E3% 82% A7% E3% 82% A4% E3% 82% B9% E3% 82% AF% E3% 83% A9% E3% 82% B9% E8% A1% A8% E7% 8F% BE% E3% 81% AE% E6% 9C% 89% J'ai écrit mes impressions sur E7% 94% A8% E6% 80% A7% E3% 81% AB% E3% 81% A4% E3% 81% 84% E3% 81% A6).
J'ai défini une structure qui ressemble à une classe d'interface comme suit. Utilisez l'interface pour demander à la classe d'implémentation de répondre sur votre culture.
Cette fois, get_any_people est utilisé pour obtenir les informations de classe d'implémentation. J'ai fait le code pour faire une interview en utilisant l'interface en main.
L'argument int * est une liste d'identifiants pour obtenir culture_if.
culture.h
//interface definition
struct culture_if {
char * (* introduire) (); // Auto-introduction
char * (* get_name) (); // nom
char * (* answer) (int id); // Question
};
int get_any_people(int *peoples_id);
Et principal ressemble à ça. J'ai une question pour les personnes qui se sont rassemblées en utilisant culture_if.
main.c
include <stdio.h>
include "culture.h"
include "flyweight.h"
int main() {
struct {
int id;
char * question;
} questions[] =
{
{FOOD, FOOD_QUESTION},
{HAPPY, HAPPY_QUESTION},
{CONPUTER, CONPUTER_QUESTION},
};
int max_members[10];
int i=0;
int member_num = get_any_people(max_members);
printf ("... [interviewer] Bonjour, tout le monde aujourd'hui c'est merci D'abord à la légère vous vous présentez? \ n");
//interface
struct culture_if *cultureif;
for( i = 0 ; i < member_num; i ++ ) {
printf ("[% dth auto-introduction] \ n", i + 1);
cultureif = (struct culture_if *) flyweight_get(max_members[i]);
//自己紹介してもらう
printf("\t%s\n", cultureif->introduce() );
}
printf("\n");
printf ("[Interviewer] Merci. Ensuite, j'aimerais vous poser les questions une par une. \ N N'hésitez pas à répondre. \ N \ n");
int j=0;
for ( i = 0 ; i < sizeof(questions)/sizeof(questions[0]); i ++ ) {
printf("Q %d: %s\n", i+1, questions[i].question);
for( j = 0 ; j < member_num ; j ++ ) {
//名前と、質問の回答をもらう
cultureif = (struct culture_if *) flyweight_get(max_members[j]);
//名前と、質問の回答をもらう
printf ("[A:% s] \ n", cultureif-> get_name ());
printf("\t%s\n", cultureif->answer(i));
}
printf("\n");
}
printf ("[Interviewer] C'est tout pour la question. Merci à tous! \ N");
flyweight_exit();
return 0;
}
flyweight_obtenir estBibliothèque au débutAPI pour obtenir une instance de. La substance de la classe d'implémentation d'interface est acquise en spécifiant l'ID. Ce sera plus facile à utiliser si vous pouvez utiliser la méthode.
Dans la classe d'implémentation d'interface, c'est OK si vous préparez la structure réelle et définissez le pointeur de la fonction statique.
germany.c
#define GNAME "Schweinsteiger"
static char * gm_introduce() {
return "allemand"GNAME"est.";
}
static char * gm_name() {
return GNAME;
}
static char * gm_answer(int id) {
static char *answer[]={
"De la bière avec des pommes de terre et de délicieuses saucisses suffit.",
"Je suis heureux. Je travaille au mieux de mes capacités et j'ai une famille agréable. Le meilleur",
"Ça va jusqu'à présent, avez-vous testé les cas d'erreur utilisés?",
};
return answer[id];
}
//Définir le pointeur de fonction dans la structure
static void gm_constructor(void *src) {
struct culture_if *culture_if = (struct culture_if *)src;
culture_if->introduce = gm_introduce;
culture_if->get_name = gm_name;
culture_if->answer = gm_answer;
}
int Germany_new() {
struct flyweight_init_s method={
gm_constructor,
NULL,
NULL
};
//En cela, struct culture_malloc si, alors gm_le constructeur est appelé
int id = flyweight_register_class(sizeof(struct culture_if), 0, &method);
return id;
}
~~La source estici~~ ~~Environnement d'exploitation: Ubuntu 18.04 Desktop (Ubuntu 14.04 Opération confirmée sur le bureau,Je pense que la plupart des systèmes d'exploitation Linux fonctionneront.)~~
2018/07/30 Addendum J'ai effacé la source, je suis désolé.
Après cela, si vous souhaitez utiliser des variables membres dans la classe d'implémentation, j'ai pensé qu'il serait plus facile de couper comme suit.
python
#define CULTURE_METHOD \
char *(*introduce)();\
char *(*get_name)();\
char *(*answer)(int id);
##Au fait
Evidemment, il y a des gens qui ont soigneusement organisé la réalisation de l'orientation objet en C comme ça. Je vais y faire référence.
http://www.sage-p.com/process/cool.htm#7
Recommended Posts