Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Oggetti membro ed ereditati nella lista di inizializzazione

0 views
Skip to first unread message

nembo kid

unread,
Jul 19, 2008, 10:41:43 AM7/19/08
to
Una piccola curiosità. Perché gli oggetti membro e quelli ereditati
_devono_ essere inseriti nella lista di inizializzazione (si traduce
così?) del costruttore della classe?

Grazie

Andrea Laforgia

unread,
Jul 19, 2008, 12:29:17 PM7/19/08
to

Non "devono" (non c'è alcun vincolo imposto con la forza) ma
"dovrebbero". Perché l'inizializzazione avviene nel contesto della
costruzione, anziché essere, costruzione e inizializzazione, due fasi
separate e successive.

nembo kid

unread,
Jul 19, 2008, 12:48:31 PM7/19/08
to
Andrea Laforgia ha scritto:

> Non "devono" (non c'è alcun vincolo imposto con la forza) ma
> "dovrebbero". Perché l'inizializzazione avviene nel contesto della
> costruzione, anziché essere, costruzione e inizializzazione, due fasi
> separate e successive.

Però, se provo a inizializzare un oggetto membro (un subobject) nel
corpo del costruttore della classe, ottengo un errore.

Es. Ho un classe Student che incorpora due oggetti Date (data di
nascita, e data di immatricolazione):

///////////////////////////////////////////////////////////////////////

Studente:: Studente( char* cog, char* nom, // cognome nome
int g_N, int m_N, int a_N, // data di nascita
int g_I, int m_I, int a_I, // data di immatricolazione
long m ) // matr.

dataN ( g_N, m_N, a_N ); // Iniz. ogg. dataN di classe Date
dataI ( g_I, m_I, a_I ); // Iniz. ogg. dataI di classe Date

//////////////////////////////////////////////////////////////////////

Ottengo due errori di compilazione:

studente.cpp no match for call to `(Date) (int&, int&, int&)'


Dove sto sbagliando?

Enrico Franchi

unread,
Jul 19, 2008, 12:52:33 PM7/19/08
to
nembo kid brought next idea :

> Però, se provo a inizializzare un oggetto membro (un subobject) nel
> corpo del costruttore della classe, ottengo un errore.

Distingui quello che 'intendi' fare con quello che hai scritto. Nel
codice che hai scritto non hai fatto quello che hai detto di volere
fare.

In particolare la semantica corretta per fare quello che vuoi è quella
che ti ha già detto Andrea e che tu medesimo avevi intuito.

--
He must be a king.
Why?
He hasn't got shit all over him.


Andrea Laforgia

unread,
Jul 19, 2008, 1:43:16 PM7/19/08
to
On Sat, 19 Jul 2008 18:48:31 +0200, nembo kid <nembo@kid> wrote:

>Studente:: Studente( char* cog, char* nom, // cognome nome
> int g_N, int m_N, int a_N, // data di nascita
> int g_I, int m_I, int a_I, // data di immatricolazione
> long m ) // matr.
>
>dataN ( g_N, m_N, a_N ); // Iniz. ogg. dataN di classe Date
>dataI ( g_I, m_I, a_I ); // Iniz. ogg. dataI di classe Date
>
>//////////////////////////////////////////////////////////////////////
>
>Ottengo due errori di compilazione:
>
>studente.cpp no match for call to `(Date) (int&, int&, int&)'

Il compilatore ti sta dicendo che non c'è un costruttore che accetti i
tre interi (perché mai reference???).

nembo kid

unread,
Jul 19, 2008, 3:48:20 PM7/19/08
to
Andrea Laforgia ha scritto:

> Il compilatore ti sta dicendo che non c'è un costruttore che accetti i
> tre interi (perché mai reference???).

Se li metto nella lista di inizializzazione (come Deitel, da dove ho
preso ispirazione per questo esercizio) tutto ok.

Ecco la specifica di Date:

Date::Date( int g=1, int m=1, int a=1900 );


Andrea Laforgia

unread,
Jul 19, 2008, 4:18:06 PM7/19/08
to
On Sat, 19 Jul 2008 21:48:20 +0200, nembo kid <nembo@kid> wrote:

>Se li metto nella lista di inizializzazione (come Deitel, da dove ho
>preso ispirazione per questo esercizio) tutto ok.

Questa scrittura:

dataN ( g_N, m_N, a_N ); // Iniz. ogg. dataN di classe Date
dataI ( g_I, m_I, a_I ); // Iniz. ogg. dataI di classe Date

non è legale.

I casi sono due:

1)
class Studente {
public:
Studente(int giornoNascita, int meseNascita, int annoNascita):
dataNascita_(giornoNascita, meseNascita, annoNascita) {}
private:
Date dataNascita_;
};

////////////////////////////////////////////////
2)
class Studente {
public:
Studente(int giornoNascita, int meseNascita, int annoNascita)
{
dataNascita_ = Date(giornoNascita, meseNascita, annoNascita);
}
private:
Date dataNascita_;
};

Andrea Laforgia

unread,
Jul 19, 2008, 4:20:12 PM7/19/08
to
On Sat, 19 Jul 2008 19:43:16 +0200, Andrea Laforgia
<a.laf...@andrealaforgia.it.invalid> wrote:

>Il compilatore ti sta dicendo che non c'è un costruttore che accetti i
>tre interi (perché mai reference???).

Correggo: non è questo l'errore riportato. E' dovuto semplicemente a
un errore nell'inizializzazione del membro privato.

0 new messages