Non ci si aspetta che il costruttore esegua molte elaborazioni, in generale, quindi eviterei di farlo almeno.
Result
oggetto dovrebbe essere solo il risultato, creato e restituito da qualche altra classe (o semplicemente dalla funzione, se si interfaccia C). A seconda di quante cose ci saranno nel risultato, puoi costruirlo sia con i parametri del costruttore, o se ce ne sono troppi, quindi con il costruttore senza parametri (o parametri obbligatori), e quindi impostare tutti i parametri (o facoltativi) di Result
istanza dopo la costruzione, prima di restituirla.
Se library->get_result(foo)
riguarda l'elaborazione effettiva e non si ottiene solo il valore del risultato corrente, allora utilizzerei un nome alternativo. Almeno per me "get" suggerisce che si tratta di un'operazione leggera.
Quindi, in questo caso probabilmente uno di questi (presupposto di C ++ 11), prima dichiarazione di una funzione (C ++ è un linguaggio multi-paradigma, niente di sbagliato con le funzioni specialmente quando si interfaccia con le librerie C):
namespace library {
class Result {...}
std::unique_ptr<Result> process(library_handle*, foo*); // note: uses move semantics
}
//usage
auto result = library::process(handle, foo)
Nota anche come ho rimosso "foo" dal nome della funzione. C ++ supporta l'overloading, nessun punto nella duplicazione delle informazioni, che è già dato dal tipo di secondo argomento.
O un approccio più orientato agli oggetti:
namespace library {
class Result {...}
class Library {
Library(library_handle*); // constructor
std::unique_ptr<Result> process(foo*); // library handle already known
}
}
//usage
auto result = library->process(foo);
Nell'ultimo esempio, il risultato potrebbe anche essere memorizzato come variabile membro nella classe Library, nel qual caso avresti getter per esso. Inoltre, a seconda di chi possiede il risultato e di quanto è grande, dovresti considerare di passarlo per valore, dopo aver appreso sulla semantica del movimento C ++ 11 che eviterebbe un sacco di copie.
Pensieri generali: se non sei sicuro del tuo C ++, considera di fornire solo un sottilissimo C ++ wrapper attorno a C, fondamentalmente solo alcune classi di "valore" di convenienza come quel Result
e semplici funzioni in un namespace, quasi 1: 1 mappatura alla tua API C. Potrebbe non essere bello come una buona API OOP C ++, ma sarà un lotto migliore di una crappy API C ++ progettata mentre si impara il moderno C ++;)