[LINUX] Réaliser une classe d'interface en langage C

Classe d'interface en C

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

échantillon

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

Réaliser une classe d'interface en langage C
Intégration du langage machine en langage C
Tri de tas fait en langage C
Test de module multi-instance en langage C
Segfo avec 16 caractères en langage C
Générer un langage C à partir d'une expression S avec Python
Méthode de contrôle exclusive multi-processus en langage C
Configurer un serveur UDP en langage C
Gérer les signaux en langage C
Essayez de créer un module Python en langage C
Écrire un décorateur en classe
File d'attente ALDS1_3_B langage C
Accéder à MongoDB en C
Next Python en langage C
[Algorithme de langage C] Endianness
API C en Python 3
Notation de classe en Python
Aller à la langue pour voir et se souvenir du langage Partie 7 C en langage GO
J'ai essayé d'illustrer le temps et le temps du langage C
[Algorithme de langage C] bloquer le mouvement
Recherche binaire ALDS1_4_B langage C
Un programmeur C / C ++ défie Python (édition de classe)
Utiliser des expressions régulières en C
Imiter Numpy de Python en C #
Recherche binaire en Python / C ++
Hello World en langue GO
[Langage C] readdir () vs readdir_r ()
Recherche linéaire ALDS1_4_A en langage C
Arborescence de surface totale minimale en C #
Introduction à l'API Socket apprise en langage C, partie 1, édition serveur
Considérez une représentation «semblable» orientée objet facile à utiliser en C. ~ Remplacement de l'interface de la partie 2