Menu
Coddy logo textTech

Struct vs class

Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 37 di 104.

In C++, struct e class sono quasi identici. Entrambi possono avere variabili membro, funzioni membro, costruttori e supportare l'ereditarietà. L'unica differenza è il loro livello di accesso predefinito.

In una class, i membri sono privati per impostazione predefinita. In una struct, i membri sono pubblici per impostazione predefinita:

struct Point {
    int x;    // pubblico per impostazione predefinita
    int y;    // pubblico per impostazione predefinita
};

class Circle {
    double radius;    // privato per impostazione predefinita
    
public:
    double getRadius() { return radius; }
};

Questo vale anche per l’ereditarietà. Una struct eredita pubblicamente per impostazione predefinita, mentre una class eredita privatamente:

struct DerivedStruct : Base {};    // ereditarietà pubblica
class DerivedClass : Base {};      // ereditarietà privata

Oltre a questi valori predefiniti, non c'è alcuna differenza tecnica. Tuttavia, le convenzioni sono importanti.

La maggior parte dei programmatori C++ usa struct per semplici contenitori di dati con membri pubblici (come una coordinata o una configurazione) e class quando l'incapsulamento e il comportamento sono importanti. Seguire questa convenzione rende più chiara l'intenzione del tuo codice agli altri sviluppatori.

challenge icon

Sfida

Facile

Creiamo un semplice sistema di configurazione che mostra quando usare struct invece di class secondo le convenzioni del C++. Creerai una struct per dati semplici pensati per essere accessibili liberamente e una class per dati che richiedono incapsulamento e accesso controllato.

Creerai due file per organizzare il codice:

  • Config.h: definisci sia una struct sia una class che rappresentano diversi tipi di dati di configurazione.

    Per prima cosa, crea una struct chiamata Dimensions: un semplice contenitore di dati per larghezza e altezza (entrambe di tipo int). Poiché i membri delle struct sono pubblici per impostazione predefinita, dovrebbero essere accessibili direttamente senza getter. Includi un metodo area() che restituisce il prodotto della larghezza per l'altezza.

    Poi, crea una class chiamata AppConfig che gestisce le impostazioni dell'applicazione con un incapsulamento appropriato. Dovrebbe memorizzare il nome di un'app (stringa) e un oggetto Dimensions per le dimensioni della finestra. Poiché i membri delle classi sono privati per impostazione predefinita, dovrai rendere esplicitamente accessibile l'interfaccia pubblica. Fornisci:

    • Un costruttore che accetta il nome dell'app, la larghezza e l'altezza
    • Un getter getAppName() che restituisce il nome
    • Un getter getWindowSize() che restituisce Dimensions
    • Un metodo displayConfig() che stampa: "App: <name>, Window: <width>x<height>, Area: <area>"
  • main.cpp: mostra la differenza tra l'uso di struct e class. Leggi da input un nome per l'app, la larghezza e l'altezza (su tre righe separate), poi:
    • Crea direttamente una struct Dimensions con i valori di larghezza e altezza: accedi direttamente ai suoi membri per stampare: "Direct struct access: <width> x <height>"
    • Crea un oggetto AppConfig con tutti e tre i valori
    • Chiama displayConfig() per mostrare la configurazione completa
    • Usa il getter per recuperare le dimensioni della finestra e stampare: "Via getter - Area: <area>"

Questa sfida evidenzia la convenzione: usa struct quando hai dati semplici e trasparenti (come coordinate o dimensioni) e usa class quando vuoi controllare l'accesso e aggiungere comportamenti ai tuoi dati.

Converti gli input di larghezza e altezza da stringhe a interi usando std::stoi(). Non dimenticare le guardie di inclusione nel file header.

Provalo tu

#include <iostream>
#include <string>
#include "Config.h"

using namespace std;

int main() {
    // Leggi l'input
    string appName;
    string widthStr;
    string heightStr;
    
    getline(cin, appName);
    getline(cin, widthStr);
    getline(cin, heightStr);
    
    int width = stoi(widthStr);
    int height = stoi(heightStr);
    
    // TODO: Crea una struct Dimensions con width e height
    // Accedi direttamente ai suoi membri per stampare: "Direct struct access: <width> x <height>"
    
    // TODO: Crea un oggetto AppConfig con appName, width e height
    
    // TODO: Chiama displayConfig() sull'oggetto AppConfig
    
    // TODO: Usa il getter getWindowSize() per ottenere le dimensioni e stampare: "Via getter - Area: <area>"
    
    return 0;
}
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore C++ online