Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Construisons 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 structure Timer avec un seul membre int seconds. Déclarer également deux fonctions : timer_tick (qui reçoit un pointeur vers Timer et ajoute un nombre de secondes indiqué) et timer_reset (qui reçoit un pointeur vers Timer et remet seconds à zéro). Utiliser des gardes d’inclusion avec le symbole TIMER_H.
  • timer.c : implémenter les deux fonctions. La fonction timer_tick doit accepter un Timer *self et un int amount, puis ajouter amount aux secondes du minuteur. La fonction timer_reset doit accepter un Timer *self et 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 :

  1. Initialiser un Timer avec la valeur initiale en secondes
  2. Appeler timer_tick pour ajouter la quantité indiquée
  3. Afficher le nombre actuel de secondes
  4. Appeler timer_reset pour réinitialiser le minuteur
  5. 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: 0

Essayez 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;
}
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur C en ligne