Structs comme objets
Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 6 sur 61.
Dans les langages orientés objet, un objet est une entité qui regroupe des données (état) avec des fonctions qui opèrent sur ces données (méthodes). Le C ne possède pas d'objets intégrés, mais nous pouvons parvenir au même concept en utilisant des structures et des fonctions.
Considérez une struct comme la partie « données » d'un objet. Elle détient l'état — les valeurs qui définissent ce que l'objet est actuellement :
typedef struct {
int value;
} Counter;
Cette structure Counter représente une entité avec un seul élément d'état : sa valeur actuelle. Pour lui donner un comportement, nous écrivons des fonctions qui acceptent la structure comme paramètre :
void counter_increment(Counter *c) {
c->value++;
}
int counter_get(Counter *c) {
return c->value;
}
Ces fonctions agissent comme des méthodes — elles opèrent spécifiquement sur les données Counter. En passant la structure aux fonctions, nous simulons ce que d'autres langages font automatiquement lorsque vous appelez counter.increment().
int main() {
Counter my_counter = {0};
counter_increment(&my_counter);
printf("%d\n", counter_get(&my_counter)); // Affiche : 1
return 0;
}
La convention de nommage typename_action (comme counter_increment) aide à organiser votre code et permet de clarifier à quelle structure appartient une fonction. Ce modèle est le fondement de la programmation orientée objet en C.
Défi
FacileConstruisons un module Counter simple qui traite une structure comme un objet avec un comportement. Vous organiserez votre code sur trois fichiers pour pratiquer le modèle de regroupement de données avec des fonctions qui opèrent sur celles-ci.
Vous créerez trois fichiers :
counter.h: Votre fichier d'en-tête déclarant la structureCounteravec un seul membreint value. Déclarez également deux fonctions qui agissent comme des « méthodes » pour le compteur :counter_increment(prend un pointeur vers Counter et augmente sa valeur de 1) etcounter_get(prend un pointeur vers Counter et renvoie sa valeur actuelle). Utilisez des gardes d'inclusion avec le symboleCOUNTER_H.counter.c: Votre fichier source implémentant les deux fonctions. N'oubliez pas d'inclure votre fichier d'en-tête.main.c: Votre fichier principal qui crée un Counter, effectue des opérations sur celui-ci et affiche les résultats.
Vous recevrez deux entrées entières : la valeur de départ de votre compteur et le nombre de fois qu'il faut l'incrémenter.
Dans votre fichier principal, initialisez un Counter avec la valeur de départ, puis appelez counter_increment le nombre de fois spécifié. Enfin, utilisez counter_get pour récupérer et afficher la valeur finale.
Affichez le résultat dans ce format :
Final value: {result}Par exemple, avec une valeur de départ de 5 et 3 incréments, la sortie serait :
Final value: 8Aide-mémoire
En C, nous pouvons simuler la programmation orientée objet en combinant des structures (données) avec des fonctions (comportement) qui opèrent sur ces structures.
Définissez une structure pour contenir l'état :
typedef struct {
int value;
} Counter;
Créez des fonctions qui agissent comme des « méthodes » en acceptant la structure comme paramètre :
void counter_increment(Counter *c) {
c->value++;
}
int counter_get(Counter *c) {
return c->value;
}
Utilisez la structure et les fonctions ensemble :
Counter my_counter = {0};
counter_increment(&my_counter);
printf("%d\n", counter_get(&my_counter)); // Affiche : 1
La convention de nommage typename_action (par exemple, counter_increment) aide à organiser le code et clarifie sur quelle structure une fonction opère.
Essayez vous-même
#include <stdio.h>
#include "counter.h"
int main() {
// Lire l'entrée
int starting_value;
int num_increments;
scanf("%d", &starting_value);
scanf("%d", &num_increments);
// TODO: Créer un Counter et l'initialiser avec starting_value
// TODO: Appeler counter_increment le nombre de fois spécifié
// TODO: Utiliser counter_get pour récupérer la valeur finale et l'afficher
// Format d'affichage : "Final value: {result}"
return 0;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Object Oriented Programming
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercle