Grazie
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.
> 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?
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.
>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???).
> 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 );
>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_;
};
>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.