[LINUX] Realisieren Sie die Schnittstellenklasse in der Sprache C.

Schnittstellenklasse in C.

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).

Stichprobe

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

Realisieren Sie die Schnittstellenklasse in der Sprache C.
Einbettung der Maschinensprache in die Sprache C.
Heap-Sortierung in C-Sprache
Modultest mit mehreren Instanzen in C-Sprache
Segfo mit 16 Zeichen in C-Sprache
Generieren Sie mit Python eine C-Sprache aus dem S-Ausdruck
So steuern Sie Multiprozesse ausschließlich in C-Sprache
Richten Sie einen UDP-Server in der Sprache C ein
Verarbeiten Sie Signale in C-Sprache
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Schreiben Sie Dekorateur in der Klasse
C-Sprache ALDS1_3_B Warteschlange
Greifen Sie auf MongoDB in C zu
Weiter Python in C-Sprache
[C-Sprachalgorithmus] Endianness
C-API in Python 3
Klassennotation in Python
Gehen Sie in die Sprache, um Teil 7 C in der Sprache GO zu sehen und sich daran zu erinnern
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
[C-Sprachalgorithmus] Blockbewegung
C-Sprache ALDS1_4_B Binäre Suche
C / C ++ - Programmierer fordert Python heraus (Class Edition)
Verwenden Sie reguläre Ausdrücke in C.
Nachahmung von Pythons Numpy in C #
Binäre Suche in Python / C ++
Hallo Welt in GO-Sprache
[C Sprache] readdir () vs readdir_r ()
C-Sprache ALDS1_4_A Lineare Suche
Minimaler Gesamtflächenbaum in C #
Einführung in die in C Language Part 1 Server Edition erlernte Socket-API
Betrachten Sie eine einfach zu verwendende objektorientierte "Like" -Darstellung in C. ~ Teil 2 Interface Override