Che cosa dovrei usare per oggetti tecnicamente sempre di sola lettura?

3

Ho una funzione get() che ottiene un oggetto human da qualche parte. Questo è letteralmente l'unico uso di human , per fornire una raccolta di proprietà di human .

struct human {
    std::string first_name;
    std::string last_name;
    unsigned int age;
    std::string location;
};

Fare cose come

human user;
user.first_name = "Foo";

non ha senso, perché si suppone che human venga usato per leggere le proprietà dell'oggetto che get() restituisce, se questo ha senso.

human user = get();
std::cout << user.age << '\n';

Dovrebbe essere effettivamente una struttura di sola lettura. Penso che sia logico imporlo, come se modificassi accidentalmente i dati, forse sarai sorpreso di vedere che è cambiato o ha un valore strano.

Ho pensato di dichiarare le proprietà private e di fornire funzioni getter come first_name() e age() . Anche la creazione di ogni variabile membro const non è l'ideale, poiché ciò rimuoverebbe il costruttore implicito di copia.

Ma mi stavo chiedendo se c'è un modo migliore per raggiungere questo obiettivo, perché questi due metodi richiedono un sacco di codice standard.

    
posta Rakete1111 15.06.2017 - 13:23
fonte

1 risposta

5

Rendi privati i membri ma non rendili costanti. Fornisci Getters ma nessun setter e segna i tuoi getter. ora il tuo oggetto è copiato ma il client non può modificare i valori. Dovrai fornire tutti i valori nel costruttore. Il codice Boilerplate è inevitabile qui.

Potresti avere la tua funzione restituire un const umano, ma questo non fa altro che suggerire allo sviluppatore che non deve essere modificato.

    
risposta data 16.06.2017 - 12:24
fonte

Leggi altre domande sui tag