Le struct come oggetti
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 6 di 61.
Nei linguaggi orientati agli oggetti, un oggetto è un'entità che raggruppa dati (stato) e funzioni che operano su quei dati (metodi). C non ha oggetti integrati, ma possiamo ottenere lo stesso risultato usando struct e funzioni.
Considera una struct come la parte dei "dati" di un oggetto. Contiene lo stato: i valori che definiscono cos'è attualmente l'oggetto:
typedef struct {
int value;
} Counter;
Questa struct Counter rappresenta un’entità con un singolo elemento di stato: il suo valore corrente. Per darle un comportamento, scriviamo funzioni che accettano la struct come parametro:
void counter_increment(Counter *c) {
c->value++;
}
int counter_get(Counter *c) {
return c->value;
}
Queste funzioni agiscono come metodi. Operano specificamente sui dati Counter. Passando la struct alle funzioni, simuliamo ciò che altri linguaggi fanno automaticamente quando chiami counter.increment().
int main() {
Counter my_counter = {0};
counter_increment(&my_counter);
printf("%d\n", counter_get(&my_counter)); // Stampa: 1
return 0;
}
La convenzione di denominazione typename_action (come counter_increment) aiuta a organizzare il codice e chiarisce a quale struct appartiene una funzione. Questo schema è il fondamento della programmazione orientata agli oggetti in C.
Sfida
FacileCostruiamo un semplice modulo Counter che tratta una struct come un oggetto con un comportamento. Organizzerai il codice in tre file per esercitarti nello schema che consiste nel raggruppare dati e funzioni che operano su di essi.
Creerai tre file:
counter.h: il tuo file header che dichiara la structCountercon un singolo membroint value. Dichiara anche due funzioni che agiscono come "metodi" per il contatore:counter_increment(accetta un puntatore a Counter e incrementa il suo valore di 1) ecounter_get(accetta un puntatore a Counter e restituisce il suo valore attuale). Usa le protezioni per le inclusioni con il simboloCOUNTER_H.counter.c: il tuo file sorgente che implementa entrambe le funzioni. Ricordati di includere il tuo file header.main.c: il tuo file principale, che crea un Counter, esegue operazioni su di esso e visualizza i risultati.
Riceverai due input interi: il valore iniziale del contatore e il numero di volte da incrementarlo.
Nel tuo file principale, inizializza un Counter con il valore iniziale, quindi chiama counter_increment il numero di volte specificato. Infine, usa counter_get per recuperare e stampare il valore finale.
Stampa il risultato in questo formato:
Final value: {result}Ad esempio, con un valore iniziale di 5 e 3 incrementi, l'output sarebbe:
Final value: 8Provalo tu
#include <stdio.h>
#include "counter.h"
int main() {
// Leggi l'input
int starting_value;
int num_increments;
scanf("%d", &starting_value);
scanf("%d", &num_increments);
// TODO: Crea un Counter e inizializzalo con starting_value
// TODO: Chiama counter_increment il numero di volte specificato
// TODO: Usa counter_get per ottenere il valore finale e stamparlo
// Formato di stampa: "Final value: {result}"
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