Le pointeur 'Self'
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 7 sur 61.
Dans les langages orientés objet comme Python ou Java, lorsque vous appelez object.method(), le langage transmet automatiquement l’objet lui-même à la méthode. En C, nous devons le faire manuellement en transmettant un pointeur vers la struct comme premier argument.
Ce pointeur est traditionnellement nommé self (emprunté à Python) ou this (de C++). Il donne à la fonction accès aux données de la struct afin qu’elle puisse les lire ou les modifier :
typedef struct {
int health;
} Player;
void player_take_damage(Player *self, int amount) {
self->health -= amount;
}
Le pointeur self est ce qui permet à la fonction d’agir comme une méthode. Il sait quel joueur modifier. Sans lui, la fonction n’aurait aucun moyen d’accéder à l’instance spécifique de struct. Lors de l’appel de cette fonction, tu transmets l’adresse de ta struct :
Player hero = {100};
player_take_damage(&hero, 25);
// hero.health est maintenant 75
Utiliser un pointeur (plutôt que de transmettre directement la structure) est essentiel pour la modifier. Si vous transmettiez la structure par valeur, la fonction recevrait une copie, et toute modification serait perdue lorsque la fonction se termine. Le pointeur garantit que les modifications persistent dans la structure d’origine.
Défi
FacileConstruisons un module Timer qui suit le nombre de secondes écoulées. Tu t’entraîneras à utiliser le modèle du pointeur « self » pour modifier l’état interne d’une structure grâce à des fonctions qui jouent le rôle de méthodes.
Tu vas créer trois fichiers :
timer.h: déclarer une structureTimeravec un seul membreint seconds. Déclarer également deux fonctions :timer_tick(qui reçoit un pointeur vers Timer et ajoute un nombre de secondes indiqué) ettimer_reset(qui reçoit un pointeur vers Timer et remet seconds à zéro). Utiliser des gardes d’inclusion avec le symboleTIMER_H.timer.c: implémenter les deux fonctions. La fonctiontimer_tickdoit accepter unTimer *selfet unint amount, puis ajouter amount aux secondes du minuteur. La fonctiontimer_resetdoit accepter unTimer *selfet définir ses secondes sur zéro.main.c: créer un Timer, effectuer des opérations dessus et afficher les résultats.
Tu recevras deux entrées entières : les secondes initiales de ton minuteur et la quantité à ajouter via tick.
Dans ton fichier main :
- Initialiser un
Timeravec la valeur initiale en secondes - Appeler
timer_tickpour ajouter la quantité indiquée - Afficher le nombre actuel de secondes
- Appeler
timer_resetpour réinitialiser le minuteur - Afficher à nouveau le nombre de secondes (il doit être égal à 0)
Afficher les résultats dans ce format :
After tick: {seconds}
After reset: {seconds}Par exemple, avec une valeur initiale de 30 et l’ajout de 15 secondes, la sortie serait :
After tick: 45
After reset: 0Essayez vous-même
#include <stdio.h>
#include "timer.h"
int main() {
int initial_seconds, amount_to_add;
scanf("%d", &initial_seconds);
scanf("%d", &amount_to_add);
// TODO: Créer un Timer et l'initialiser avec initial_seconds
// TODO: Appeler timer_tick pour ajouter amount_to_add secondes
// TODO: Afficher les secondes actuelles au format : "After tick: {seconds}"
// TODO: Appeler timer_reset pour réinitialiser le timer
// TODO: Afficher à nouveau les secondes au format : "After reset: {seconds}"
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 Programmation Orientée Objet
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 cercleImplémentation du rectangleUtilisation polymorpheConteneur de formesEntraînez-vous par vous-même : Compilateur C en ligne