Letztes Mal, als ich [Centralized Resource Management Library] erstellt habe (https://qiita.com/developer-kikikaikai/items/3e4e950dd1ebd20508d7 "Centralized Resource Management Library")
Ich schrieb.
Zu dieser Zeit schrieb ich, dass es interessant wäre, weil es keine Methode für die Instanz gibt. Wenn Sie darüber nachdenken, können Sie es mit einem Funktionszeiger normal realisieren. Also habe ich eine Probe gemacht.
4/29 postscript [hier](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% Ich schrieb meine Eindrücke auf E7% 94% A8% E6% 80% A7% E3% 81% AB% E3% 81% A4% E3% 81% 84% E3% 81% A6).
Ich habe eine Struktur definiert, die wie folgt aussieht: Verwenden Sie die Schnittstelle, um die Implementierungsklasse zu bitten, Antworten zu Ihrer Kultur zu geben.
Dieses Mal wird get_any_people verwendet, um die Informationen zur Implementierungsklasse abzurufen. Ich habe den Code für ein Interview über die Hauptschnittstelle erstellt.
Das Argument int * ist eine Liste von IDs zum Abrufen von culture_if.
culture.h
//interface definition
struct culture_if {
char * (* Introduce) (); // Selbsteinführung
char * (* get_name) (); // name
char * (* answer) (int id); // Frage
};
int get_any_people(int *peoples_id);
Und main sieht so aus. Ich habe eine Frage an Leute, die sich mit Culture_if versammelt haben.
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] Hallo, alle sind heute dankbar. Stellen Sie sich zuerst leichtfertig vor? \ n");
//interface
struct culture_if *cultureif;
for( i = 0 ; i < member_num; i ++ ) {
printf ("[% dth Selbsteinführung] \ n", i + 1);
cultureif = (struct culture_if *) flyweight_get(max_members[i]);
//自己紹介してもらう
printf("\t%s\n", cultureif->introduce() );
}
printf("\n");
printf ("[Interviewer] Danke. Ich möchte Ihnen nacheinander Fragen stellen. \ N Sie können diese gerne beantworten. \ 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] Das ist alles für die Frage. Vielen Dank an alle! \ N");
flyweight_exit();
return 0;
}
flyweight_bekommen istBibliothek am AnfangAPI zum Abrufen einer Instanz von. Der Inhalt der Schnittstellenimplementierungsklasse wird durch Angabe der ID erfasst. Es ist einfacher zu verwenden, wenn Sie die Methode verwenden können.
In der Schnittstellenimplementierungsklasse ist es in Ordnung, wenn Sie die eigentliche Struktur vorbereiten und den Zeiger der statischen Funktion setzen.
germany.c
#define GNAME "Schweinsteiger"
static char * gm_introduce() {
return "Deutsche"GNAME"ist.";
}
static char * gm_name() {
return GNAME;
}
static char * gm_answer(int id) {
static char *answer[]={
"Bier mit Kartoffeln und leckeren Würstchen reicht aus.",
"Ich bin glücklich. Ich arbeite nach besten Kräften und habe eine nette Familie. Das beste",
"Ist es soweit in Ordnung, haben Sie die verwendeten Fehlerfälle getestet?",
};
return answer[id];
}
//Funktionszeiger in Struktur setzen
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
};
//In dieser Struktur Kultur_malloc wenn, dann gm_Konstruktor heißt
int id = flyweight_register_class(sizeof(struct culture_if), 0, &method);
return id;
}
~~Die Quelle istHier~~ ~~Betriebsumgebung: Ubuntu 18.04 Desktop (Ubuntu 14.04 Bestätigter Vorgang auf dem Desktop,Ich denke, die meisten Linux-Betriebssysteme werden funktionieren.)~~
2018/07/30 Nachtrag Ich habe die Quelle gelöscht, tut mir leid.
Wenn Sie danach Mitgliedsvariablen in der Implementierungsklasse verwenden möchten, dachte ich, es wäre einfacher, die Definition wie folgt zu schneiden.
python
#define CULTURE_METHOD \
char *(*introduce)();\
char *(*get_name)();\
char *(*answer)(int id);
##Apropos
Offensichtlich gibt es Leute, die die Realisierung der Objektorientierung in C so sorgfältig organisiert haben. Ich werde darauf verweisen.
http://www.sage-p.com/process/cool.htm#7
Recommended Posts