Newsgroup: it.comp.lang.c++
Titolo: [stile] Funzioni ausiliarie, dove le mettete?

Ciao a tutti!
Supponiamo che nella classe Pizza ci sia un metodo pubblico
condisci(), che si avvale di una funzione ausiliaria, diciamo
condisci1(), che so che verrà chiamata solo da condisci().
Ecco, voi condisci1() dove la mettereste?
privata in Pizza? dichiarata all'interno di condisci()?
grazie, giulio
Per favore togliete "!RemoveMe!" dall'indirizzo per rispondere via email
Please remove "!RemoveMe!" from the address to email me

>privata in Pizza? dichiarata all'interno di condisci()?
Scusa ma tu possiedi un compilatore che permette di definire funzioni o 
member functions nested?
non e' standard, e nessun compilatore che io uso (tranne cose 
sperimentali atte divulgare alcune idee da proporre come standard, tra 
cui questa possibilita') supporta questo...
??
-- 
  . 
darX...@tin.it
      . 
darx...@wappi.com
 (GSM SMS)
   . Fido 2:335/241.5     . 
http://darxstar.cjb.net
  ICQ UIN# 11151997 -   
  trough Britannia: Gwydion the Mage <UO: EUROPA,now in Trisinc>
---
I don't want my freedom: there's no reason for living, with a broken heart
 -- The Queen

 
Dipende dalla specificita' della funzione. Se e' significativa solo nel
contesto di Pizza, la trasformo in una funzione membro statica, magari
privata, altrimenti la metto in un altro sorgente.
Cosa intendi per "dichiarata all'interno di condisci()"? Il C++ non
permette funzioni innestate, come ad esempio il Pascal. Io preferisco
dichiarare e definire le entita' dei miei programmi allo stesso livello,
quindi se si tratta di funzioni libere, le dichiaro in un include file;
se sono definite in un namespace specifico inserisco la dichiarazione
nello stesso namespace, sempre in un include file, se sono membri...
Ciao,
Nicola

 privata in Pizza? dichiarata all'interno di condisci()?
Il C++ non supporta le dichiarazioni annidate di funzioni,
quindi non hai neppure l'opzione di dichiarare condisci1
"all'interno di condisci".
Se e` indispensabile che la "funzione ausiliaria" abbia
accesso a informazioni private dell'oggetto (cioe` se
c'e` qualche ragione, che mi sfugge, per non poterle
semplicemente passare delle reference agli eventuali
campi-dati privati che servano, ecc), puoi dichiararla
come funzione membro private dell'oggetto.
Piu` abitualmente, pero`, sara` piu` pratico averla
invece come funzione static (non membro) che viene
dichiarata e definita nel file-sorgente in cui implementi
l'unica funzione-membro che ne abbisogna.  L'uso di
funzioni private o altre ausiliarie e` infatti tutto sommato
un dettaglio d'implementazione, ed e` un peccato che
simili dettagli vengano resi _visibili_ al codice cliente
(ricordare che, in C++, la visibilita` e` un concetto
separato da quello dell'accessibilita`).
Naturalmente, la soluzione generale a questo problema
e` usare classi astratte ("pure interfacce"), che vengono
poi rese concrete da "classi di implementazione" che il
codice-cliente non vede neppure da lontano; se hai gia`
dato questa eccellente impostazione al tuo progetto,
allora, fra i tanti altri vantaggi, hai acquisito anche quello
di poter aggiungere tutti i membri (funzioni e dati) che
desideri, senza nessun impatto sul codice cliente (che
non dovra` neppure _rilinkare_, se esponi in modo
appropriato le tue classi-interfaccia da una DLL, anche
se tu aggiungi, togli, rinomini, o altrimenti modifichi,
un paccone di classi-implementazione...!).
Ma se le tue classi sono concrete o semi-concrete, sigh,
paghi il prezzo -- o esponi (visibili, benche` non
accessibili) dettagli di implementazione, o ricorri a
funzioni-free-static-di-file, idiomi pImpl, ecc ecc.
Alex

member functions nested?
No. Scusate, ignoranza mia. Spero di non aver generato confusione...
:-)
grazie a tutti, giulio


dichiarata all'interno di condisci()?
In C/C++ questo non e` possibile.
Paolo
-----------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
-----------------------------------------------

 privata in Pizza? dichiarata all'interno di condisci()?
Io, in effetti, la metterei all'interno di condisci. Se quello è il posto
dove dovrebbe stare, perchè non mettercela?
Purtroppo in C/C++ non è (ancora?) possibile, per cui puoi scegliere più o
meno a caso tra le varie alternative.
Se è il caso, però, considererei la possibilità di riflettere sul
significato delle classi che stai creando, e se è possibile che una diversa
strutturazione porti a una implementazione più lineare. (o più OO, a scelta)
Il metodo condisci, per esempio, potrebbe essere all'interno di una classe
Cuoco, mentre in Pizza ci sarebbe un metodo AggiungiIngrediente (class
&Ingredienti).
O almeno questo è quello che mi suggerisce il mio povero e piccolo
agglomerato di neuroni, dato che non ho mai visto una pizza condirsi da
sola, o che il pizzaiolo si limitasse a dire all'impasto testè creato:
"condisciti!". Però non l'ho mai neanche mai visto dire al banco vuoto:
"creati!", o all'impasto "distruggiti!", per cui non saprei se il
suggerimento può essere valido nel tuo caso.
Ciao
--
Alessandro Monti
P.S.
Ma poi ce la fai assaggiare questa pizza? Io suggerirei di implementare un
metodo Serviti, con parametro l'indirizzo e-mail. Una pizzeria su Internet!