Il puntatore 'Self'
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 7 di 61.
Nei linguaggi orientati agli oggetti come Python o Java, quando chiami object.method(), il linguaggio passa automaticamente l’oggetto stesso al metodo. In C, dobbiamo farlo manualmente passando un puntatore alla struct come primo argomento.
Questo puntatore viene convenzionalmente chiamato self (preso in prestito da Python) o this (da C++). Consente alla funzione di accedere ai dati della struct per poterli leggere o modificare:
typedef struct {
int health;
} Player;
void player_take_damage(Player *self, int amount) {
self->health -= amount;
}
Il puntatore self è ciò che fa sì che la funzione si comporti come un metodo. Sa quale giocatore modificare. Senza di esso, la funzione non avrebbe modo di accedere a quella specifica istanza della struct. Quando chiami questa funzione, passi l’indirizzo della tua struct:
Player hero = {100};
player_take_damage(&hero, 25);
// hero.health ora è 75
Usare un puntatore (anziché passare direttamente la struct) è essenziale per apportare modifiche. Se passassi la struct per valore, la funzione riceverebbe una copia e tutte le modifiche andrebbero perse al ritorno della funzione. Il puntatore assicura che le modifiche persistano nella struct originale.
Sfida
FacileCostruiamo un modulo Timer che tiene traccia dei secondi trascorsi. Ti eserciterai a usare il modello del puntatore "self" per modificare lo stato interno di una struct tramite funzioni che agiscono come metodi.
Creerai tre file:
timer.h: dichiara una structTimercon un solo membroint seconds. Dichiara anche due funzioni:timer_tick(accetta un puntatore a Timer e aggiunge un numero specificato di secondi) etimer_reset(accetta un puntatore a Timer e reimposta i secondi a zero). Usa le protezioni di inclusione con il simboloTIMER_H.timer.c: implementa entrambe le funzioni. La funzionetimer_tickdeve accettare unTimer *selfe unint amount, quindi aggiungere l'importo ai secondi del timer. La funzionetimer_resetdeve accettare unTimer *selfe impostare i suoi secondi a zero.main.c: crea un Timer, esegui delle operazioni su di esso e mostra i risultati.
Riceverai due input interi: i secondi iniziali del timer e la quantità da aggiungere tramite tick.
Nel file principale:
- Inizializza un
Timercon il valore iniziale dei secondi - Chiama
timer_tickper aggiungere la quantità specificata - Stampa i secondi correnti
- Chiama
timer_resetper reimpostare il timer - Stampa di nuovo i secondi (dovrebbero essere 0)
Stampa i risultati in questo formato:
After tick: {seconds}
After reset: {seconds}Ad esempio, con un valore iniziale di 30 e aggiungendo 15 secondi, l'output sarebbe:
After tick: 45
After reset: 0Provalo tu
#include <stdio.h>
#include "timer.h"
int main() {
int initial_seconds, amount_to_add;
scanf("%d", &initial_seconds);
scanf("%d", &amount_to_add);
// TODO: Crea un Timer e inizializzalo con initial_seconds
// TODO: Chiama timer_tick per aggiungere amount_to_add secondi
// TODO: Stampa i secondi correnti nel formato: "After tick: {seconds}"
// TODO: Chiama timer_reset per reimpostare il timer
// TODO: Stampa di nuovo i secondi nel formato: "After reset: {seconds}"
return 0;
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online