Se voglio caricare un oggetto da un file, ci sono un certo numero di cose che possono andare storte. Pertanto, quando si fa ciò si ha bisogno di un modo per gestire gli errori. In alcune lingue, come haskell, è possibile restituire un oggetto Maybe
che potrebbe contenere l'oggetto appena creato. In C++
, sebbene sia in linea di principio possibile creare una classe di convenienza, di solito non è il modo più diretto per fare le cose. Di seguito elencho vari modi in cui gli errori potrebbero essere gestiti durante il caricamento di un oggetto da un file in C++
.
- Restituisce un puntatore:
Object* load_from_file(const char* filename);
Restituendo un puntatore, possiamo restituire nullptr
nel caso in cui si verifichi un problema durante il caricamento dell'oggetto.
- Prendi un riferimento a un oggetto costruito di default e restituisci
false
se si verifica un problema:
bool load_from_file(const char* filename, Object& obj);
Utilizzando questo metodo, è necessario implementare un metodo di inizializzazione separato per l'oggetto, che verrà richiamato dopo averlo caricato dal file.
- Genera un'eccezione nella funzione
load_from_file
:
Object load_from_file(const char* filename);
In generale, credo che il lancio di un'eccezione in questo caso potrebbe essere negativo, in quanto non si tratta di un caso veramente "eccezionale".
- Carica dati su un intermedio
struct
:
struct ObjectData{
//data
};
bool load_from_file(const char* filename, ObjectData& data);
//example use:
ObjectData data;
if(load_from_file("path_to_some_file", data)){
Object(data);
//etc...
}
La differenza qui con il secondo metodo è che non è necessario creare un metodo di inizializzazione per Object
.
In generale, qual è il metodo preferito per il problema sopra descritto o quale metodo è preferito in quali casi?