codice:
>int* nome_funzione( int )
> {
> int* array = new int[ 10 ];
> .....
> .....
> return array;
> }
Questo è un "pattern" molto più comune di quanto si potrebbe pensare.
> Dove devo deallocare l'array?
> -> credo non avrebbe senso nella funzione: non posso deallocare
> qualcosa che poi deve essere ancora utilizzato!!
Su questo non c'è dubbio.
> -> se poi lo faccio nel programma chiamante, quest'ultimo dovrebbe
> sapere come lavora a funzione, cioè dovrebbe essere a conoscenza del
> fatto che l'array è stato allocato dinamicamente..e non credo sia una
> soluzione pulita!!
E' una soluzione pulita solo se il chiamante _sa bene_ che la funzione
alloca dinamicamente un oggetto.
E' vero, ci siamo detti tante volte che il chiamante deve ignorare l'implementazione di una funzione e limitarsi solo a conoscerne il prototipo. In certi casi, come quello di sopra, però, il servizio offerto da una funzione è proprio quello di creare un oggetto in base a certe regole (proprio come la funzione CostruisciLista() del nostro esercizio
ListaOrdinata; le regole in quel caso le fissava l'utente). Questo tipo di funzioni si chiamano Factory (fabbrica) e, di solito, hanno il nome che inizia per Create... (CreateList, CreateWidget, CreateComponent, etc...)proprio per ricordare al chiamante che stanno costruendo qualcosa che andrà poi distrutto. Questo comportamento deve ovviamente essere documentato da chi scrive (e documenta) la funzione.