Newsgroup: it.comp.lang.c++
Titolo: Accesso funzione membro da classe annidata

Ciao,
Ho il "solito" problema di una classe che ne contiene
altre e che dovrebbe fornire a quelle annidate una serie
di funzioni di utilità. Ovviamente il linguaggio non mi
consente di fare questo a meno che non dichiari public
tali funzioni, ma a questo punto addio isolamento dei dati
e dei metodi. Fin qui ho sempre risolto con porcherie di
vario genere, esiste un sistema relativamente semplice ed
elegante? Sotto, c'è un piccolo frammento di codice che
spero utile a illustrare il mio problema. Decommentando
"// public" ovviamente funziona ma non è quel che vorrei.
grazie!
Apx.
class Cexternal
{
   struct Sinternal
   {
     void    dosomething (const Cexternal *cptr)
     {
       int   val = (cptr->fun_prova()) ;
     }
   } ;
   // public:
   int  fun_prova () const { return (0) ; }
} ;
int main ()
{
   Cexternal  x ;
   return (0)   ;
}

 "// public" ovviamente funziona ma non è quel che vorrei.
Non so se si possa, ma si potrebbe tentare una forward 
declaration, anche se qualora fosse possibile non conosco la 
sintassi corretta. Tipo ...
class Cexternal;
struct Cexternal :: Sinternal;
ma non so se funga.
Se funge, puoi attribuire VISIBILITA' al nome classe esterna 
entro quella annidata (che di norma sarebbe inconsapevole 
del suo contenitore, essendo esso un nome incompleto ...).
Poi il mio intento sarebbe stato la strategia standard per 
garantire l'accesso all'area privata : una dichiarazione di 
friendship dentro Cexternal
FRIEND STRUCT Sinternal;
Se non fosse possibile la prima sintassi, potresti tentare 
di usare una forward declaration INTERNA, dentro la classe 
esterna, dove non  necessario nessuno scope declataror.
Scusa se ho le idee confuse, è parecchio tempo che non 
scrivo niente in C++, e quel poco che sapevo sta lentamente 
sbiadendo anche se leggo le chicche sul NG.
ciao
Soviet


 FRIEND STRUCT Sinternal;
ti ringrazio tanto ma anche dichiarandola friend l'intera
struttura, il compilatore mi manda al diavolo. Eppure è
strano che non esista una specie di via diretta per
realizzare questo: anche nel mondo reale con l'esempio
classico della descrizione dell'aereo e i suoi motori come
classi, l'aereo dovrebbe rendere disponibile ai motori
alcuni servizi e supporti. Sicuramente c'è qualche
validissima ragione se un linguaggio tanto perfetto non lo
fa in modo "nativo", ma per adesso sto ancora a caro amico :(
ciao!
C.
PS - non dispero salire dalle parti tue, ora che ho la moto...
-- 
"Papà, cos'è un mostro? - Mia cara, così su tre piedi
proprio non te lo saprei dire"

In teoria, la dichiarazione di friendship agisce anche come forward
declaration.
Per cui questo dovrebbe andare:
class A
{
   friend class B;
public:
   static void f ();
private:
   static void g ();
   class B
   {
   private:
      B () { A::g (); }
   };
};

 Per cui questo dovrebbe andare:
ehm, me lo rifiuta con lo stesso messaggio di errore, ma 
grazie lo stesso :)
ciao!
Apx.


 stesso :)
Penso che dovresti fare:
friend class A::B;
ma neanch'io ho voglia di provare...
E.

 }
Scusa, sicuramente mi sfugge qualcosa ma il tuo esempio qui sopra sia il GCC 
4.2.3 che il VC++ 2003 me lo compilano senza errori (solo un paio di warning 
riguardanti le variabili non utilizzate val e x. Invece il vecchio BCC551 d� 
l'errore che dici ma a questo punto penso che dipenda dalla vetust� del BCC.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic
 

A me quel sorgente non da alcun errore.
Quale sarebbe l'errore che ti viene segnalato? 

 GCC 4.2.3 che il VC++ 2003 me lo compilano senza errori [...]
Dunque, quando c'era soltanto lo standard del 98 quel codice non compilava,
in quanto le classi interne non avevano accesso ai membri privati della
classe esterna, a meno che non fossero dichiarati friend. Poi in un defect
report hanno proposto di rimuovere questa restrizione e la proposta �
passata. Non ho capito bene se questa modifica sia stata effettivamente
inserita nel Technical Corrigendum del 2003, ma sicuramente � parte nel
imminente prossimo standard (C++0x).
Max

grazie a tutti... in effetti ho il borland 6 e giuro che
non compila, mi dice che non è possibile accedere a
variabili e metodi. Inizio a pensare che non vada il
compilatore. Purtroppo DEV-CPP non mi funziona e non so
dove sbattere la testa, visual studio non mi piace,
eccetera...
beh, dovrò cambiare compilatore :/
ciao


 beh, dovr� cambiare compilatore :/
S�, meglio cambiare compilatore. Guarda, io normalmente non programmo sotto
Windows, ma quando ho dovuto fare il porting di alcune cose, ho usato
questa distribuzione di MingW: 
http://nuwen.net/mingw.html
. Mi sono trovato
molto bene.
Max

 classe esterna, a meno che non fossero dichiarati friend.
Dichiarati friend i membri? 

> Dichiarati friend i membri?
sì, tutto il friendabile di questo mondo. Sono anni che
rimando l'inevitabile, ovvero smettere di programmare. Ci
crediate o meno non sono MAI riuscito a usare make, ed è
la sola cosa che mi separa da mingw/CGG e soci. Non credo
ci riuscirò mai.


 Dichiarati friend i membri?
No. Refuso. Sostituire "dichiarati" con "dichiarate".
Max

 Sono anni che rimando l'inevitabile, ovvero smettere di programmare.
Smettere di programmare con quel compilatore vecchio, o in generale? 

 in generale?
ci sto provando, ma Make di MinGW non mi funziona, mi dice
sempre "shift scorretto", sono giorni che mi ci sto
scornando, e google non aiuta. Adesso cerco un NG adatto e
chiedo lì.
ciao!
Apx.


chiedo l�.
Scarica Code::Blocks e non dovresti avere problemi. 

 molto bene.
Su quel sito, sotto windows, si parla della versione 4.3.3 del gcc. Sul 
sito "ufficiale" di MinGW ( 
http://www.mingw.org/wiki/GCCStatus
 ) la 
stabile ï¿œ la 3.4.5 e la beta "ufficiale" ï¿œ la 4.3.0 anche se si parla 
dell'imminente beta della 4.4.0.
Cosï¿œ, per fare due chiacchere.
-- 
Mio figlio: 
http://it.youtube.com/davideippopotamo
La violenza non puï¿œ essere una esclusiva dei malfattori.
Ladri del mio appartamento, vi siete dimenticati un coltellaccio da 
cucina, tornate.

 beh, dovrò cambiare compilatore :/
Ciao.
Puoi scaricare la versione Turbo c++ 2006 gratuita. Borland ha
venduto il prodotto a Embarcadero che comunque continua a
svilupparlo. Non so dirti se questa versione presenta il
problema, ma dovrebbe essere aggiornato quindi suppongo di no.
Ecco il link:
http://downloads.embarcadero.com/free/c_builder
ciao
Giacomo

non ricordo se l'ho fatto, ma nel caso ancora grazie a
tutti, davvero utili come sempre!
