Newsgroup: it.comp.lang.c++
Titolo: Classi dentro classi

Salve a tutti. E' possibile creare una classe che ne contenga un'altra al suo
interno ?
Grazie in anticipo.
-- 
*** Gottardi Matteo / 
goma...@tin.it
 ***
*Linux*, the choice of a _GNU_ generation

Salve a tutti. Come posso fare per risolvere questo problema ? Allora, ecco il
codice:
class Uscite
{
	private:
	Stanza *nord;
	Stanza *sud;
	Stanza *est;
	Stanza *ovest;
};
class Stanza
{
	private:
	int numero;
	char *nome;
	char *descrizione;
	Uscite uscite;
};
In pratica Uscite richiede un puntatore a Stanza, e stanza richiede al suo
interno un'istanza di Uscite...
Come posso fare per risolvere questo problema ? Il compilatore mi da errore...


Salve a tutti. Come posso fare per risolvere questo problema ? 
[omissis] 
Il problema sta nel fatto che la classe Stanza viene utilizzata prima della
sua dichiarazione.
Devi semplicemente aggiungere la dichiarazione di Stanza prima di utilizzarla
in Uscite:
class Stanza;
class Uscite {
  ...
};
class Stanza {
  ...
};
Paolo
----------------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
  e-mail: 
mar...@cli.di.unipi.it
 
----------------------------------------------------------

interno ?
Certamente.  In C++ Standard, puoi avere, ad esempio:
-> fuori.h
class fuori {
    class dentro_privata {
    public:
        void popi();
    };
public:
    class dentro_pubblica {
    public:
        void pep();
    }
};
-> fuori.cpp
void fuori::dentro_privata::popi() {
    // ecc
}
void fuori::dentro_pubblica::pep() {
    // ecc
}
-> fine
Nota che non c'e` nessuna implicita relazione
di "amicizia" fra classi esterne ed interne; esse
stanno fra loro come altre classi qualunque,
l'annidamento e` solo una questione di scoping
(ed eventualmente, per classi annidate che siano
private o protette, di accessibilita` da parte di
altro codice ancora).
Alex

Come posso fare per risolvere questo problema ? Il compilatore mi da
errore...
Prima di iniziare la dichiarazione di class Uscite, metti
una "forward declaration" dell'altra:
class Stanza;
Sinche` tutto quel che fai e` tenere puntatori (e/o
reference) ad una classe, non occorre ancora che tu
ne specifichi i dettagli (e' una "incomplete class"
sino a che non "completi" la sua dichiarazione).
Alex

 
 L'errore deriva dalla dichiarazione 
Stanza *nord,*est,*sud,*ovest;
prima che Stanza sia stato definito; e' ovvio che il problema non si
risolve anteponendo la definizione di stanza a quella di uscite perche'
cosi' facendo e' Uscite a non essere definito;
	Una possibile soluzione brute force, che mi vergogno quasi a proporti
tanto e' brutta e contorta (ed a dire il vero non sono sicuro che sia
nemmeno corretta), e' la seguente:
class Stanza
 {
 	private:
 class Uscite
 {
 	private:
 	Stanza *nord;
 	Stanza *sud;
 	Stanza *est;
 	Stanza *ovest;
 };
 	int numero;
 	char *nome;
 	char *descrizione;
 	Uscite uscite;
	Prendila molto con le pinze; ma secondo me e' meglio cambiare totalmente
approccio all'implementazione della struttura dati che puo' penalizzare
molto, in termini di tempo e risorse,l'efficienza del programma.
	Bye MayheM. 

 class Uscite {
Grazie a tutti, adesso funziona :)


 interno un'istanza di Uscite...
Aggiungi:
	class Stanza;
prima della dichiarazione della classe Uscite.
-- 
Roberto Lupi
Undergraduate Electronic Engineering Student, University of Ancona, Italy
UNIX System Administrator
Windows and Linux Developer
PGP Key - 
http://ascu.unian.it/~lupex/lupex-public-key.asc