[Corsopoc] Problemi inerenti all'incapsulamento in C++
cantone
cantone@copernico.uniroma2.it
Thu, 19 Dec 2002 21:05:10 +0100
--=====================_18017804==_.ALT
Content-Type: text/plain; charset="iso-8859-1"; format=flowed
Content-Transfer-Encoding: quoted-printable
At 11.10 18/12/02 +0100, Valerio Pace wrote:
>Gentile prof.Cantone vorrei sapere come =E8 possibile in C++ creare un=
array=20
>di oggetti all'interno dell'implementazione della classe ovvero come =E8=20
>possibile realizzare un codice analogo a questo
>
>class x{
>public:
>//methods of public interface
>private:
>type class[n] nameclass;
>};
Le confesso, dopo aver riflettuto sulla sua domanda e non per poco del=20
tempo per me disponibile, di non essere riuscito a capire che cosa vuole,=20
quale problema spera di risolvere con il [segmento di] codice scritto sopra.
Comunque, fermo restando che non sono il risolutore dei suoi esercizi e=20
tantomeno un compilatore, proviamo a procedere per ipotesi.
Se dovesse definire un array di nome a fatto di elementi dinamici di classe=
=20
C o discendenti di C potrebbe scrivere qualche cosa del genere:
C * [] a; //Questa e' la definizione di un array di puntatori alla classe C=
=20
e discendenti
Detto allora, ad esempio,
int i;
C *p; // Questo e' una variabile del tipo puntatore a C
....
p=3D new C; // p punta a un oggetto dinamico di classe C
..
i=3D ..;
a[i] =3D p; // a[i] e p puntano allo stesso oggetto dinamico;
allora a[i] punterebbe all'oggetto prima creato con new.
Per un array statico di elementi statici dovrebbe funzionare quanto segue=20
(salvo dettagli sintattici):
C A[50];//Questa e' la definizione di un array di 50 elementi di classe C
C o; // o e' un oggetto statico delle classe C inizializzato in modo=
standard
o.modify(...); // o e' modificato in qualche modo
a[i] =3D o; a[i] e sono uguali e distinti;
Supponiamo, invece, che abbia di un array in cui allocare nomi di classe.
Nel C++ classico la getClass() non e' implementata. Se tale funzione le=20
serve e il suo compilatore non la prevede allora deve realizzarsela il=20
programmatore. Cio' potrebbe essere fatto, ad esempio:
1- dotando OGNI classe della gerarchia di interesse della funzione
virtual String getClass() {return "SOSTITUISCI QUESTA STRINGA CON IL=20
NOME DELLA CLASSE CHE SATI SCRIVENDO: QUESTO E' UN AVVISO PER IL=20
PROGRAMMATORE";}
OPPURE
2- dotando la madre classe sia dell'attributo protetto String nomeClasse,=20
sia del metodo String getClass() {return nomeClasse;}. Il costruttore di=20
ogni classe, madre o discendente che sia, dovrebbe valorizzare nomeClasse=20
al nome della classe particolare.
NB: questa realizzazione e' impropria perche' ogni oggetto avrebbe=20
l'attributo nome. Dovrebbe trattarsi di un attributo e di un metodo di=20
classe, visto che questi sono posseduti allo stesso modo da tutti gli=20
oggetti aventi la stessa classe. Pero', per ottenere cio', C++ prevede=20
static e, se serve ereditarieta', l'attributo deve essere ridefinito e cio'=
=20
non e' possibile per variabili static. Personalmente, preferisco la=20
soluzione 1.
In entrambi i casi, l'array di nomi di classi di cui, per ipotesi, ha=20
bisogno, dovrebbe essere un array di stringhe.
--=====================_18017804==_.ALT
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
At 11.10 18/12/02 +0100, Valerio Pace wrote:
Gentile prof.Cantone vorrei sapere
come =E8 possibile in C++ creare un array di oggetti all'interno
dell'implementazione della classe ovvero come =E8 possibile realizzare un
codice analogo a questo
class x{
public:
//methods of public interface
private:
type class[n] nameclass;
};
Le confesso, dopo aver riflettuto sulla sua domanda e non per poco del
tempo per me disponibile, di non essere riuscito a capire che cosa vuole,
quale problema spera di risolvere con il [segmento di] codice scritto
sopra.
Comunque, fermo restando che non sono il risolutore dei suoi esercizi e
tantomeno un compilatore, proviamo a procedere per ipotesi.
Se dovesse definire un array di nome
a
fatto di elementi dinamici di classe C o discendenti di C potrebbe=
scrivere qualche cosa del genere:
C * [] a; //Questa=
e' la definizione di un array di puntatori alla classe C e=
discendenti
Detto allora, ad esempio,
int i;
C *p; // Questo e' una variabile del tipo puntatore a C
....
p=3D new C;=
// p punta a un oggetto dinamico di classe C
..
i=3D=
..;
a[i] =3D p; // a[i] e p puntano allo stesso oggetto dinamico;
allora a[i] punterebbe all'oggetto prima creato con new.
Per un array statico di elementi statici dovrebbe funzionare quanto segue=
(salvo dettagli sintattici):
C A[50];//Questa e'=
la definizione di un array di 50 elementi di classe C
C o; // o e' un oggetto statico delle classe C inizializzato in modo=
standard
o.modify(...); // o e' modificato in qualche modo
a[i] =3D o; a[i] e sono uguali e distinti;
Supponiamo, invece, che abbia di un array in cui allocare nomi di=
classe.
Nel C++ classico la getClass() non e'=
implementata. Se tale funzione le serve e il suo compilatore non la prevede=
allora deve realizzarsela il programmatore. Cio' potrebbe essere fatto, ad=
esempio:
1- dotando OGNI classe della gerarchia=
di interesse della funzione
virtual String=
getClass() {return "SOSTITUISCI QUESTA STRINGA CON IL NOME DELLA=
CLASSE CHE SATI SCRIVENDO: QUESTO E' UN AVVISO PER IL=
PROGRAMMATORE";}
OPPURE
2- dotando la madre classe sia dell'attributo protetto String nomeClasse, sia del metodo=
String getClass() {return nomeClasse;}. Il costruttore di ogni classe, madre o=
discendente che sia, dovrebbe valorizzare nomeClasse al nome della classe=
particolare.
NB: questa realizzazione e' impropria perche' ogni oggetto avrebbe=
l'attributo nome. Dovrebbe trattarsi di un attributo e di un metodo di=
classe, visto che questi sono posseduti allo stesso modo da tutti gli=
oggetti aventi la stessa classe. Pero', per ottenere cio', C++ prevede=
static e, se serve ereditarieta', l'attributo=
deve essere ridefinito e cio' non e' possibile per variabili static.=
Personalmente, preferisco la soluzione 1.
In entrambi i casi, l'array di nomi di classi di cui, per ipotesi, ha=
bisogno, dovrebbe essere un array di stringhe.
--=====================_18017804==_.ALT--