Newsgroup: it.comp.lang.c++
Titolo: Classi contenenti oggetti classe

Ciao,
sono nuovo del linguaggio c++ e vorrei farvi una domanda riguardo le
classi che forse vi sembrerà ovvia ma a cui non riesco a trovare una
risposta:
ho una classe
class pippo {
    string a;
    string b;
    int c;
     };
ed un'altra che contiene come oggetto pippo:
class paperino{
     string s;
     pippo p ;
     int k;
  };
se creo il costruttore per la classe paperino
paperino::paperino(string s ,pippo p ,int k){.... };
mi da errore del tipo  no matching function for call to
`pippo::pippo()'
come lo devo dichiarare l'oggetto pippo nella classe paperino?
Grazie,
Mike

 `pippo::pippo()'
questo è il default constructor (implicitamente dichiarato dal 
compilatore in mancanza di indicazioni ... e non combacia)
devi dirglielo tu dichiarandolo DENTRO
class paperino {
      string s;
      pippo p ;
      int k;
public:
     paperino (string s ,pippo p ,int k);
     // solo declaration, non ancora definition
   };
poi fuori definisci il corpo della funzione (se è piccolo e 
scarno conviene mettere tutto DENTRO la classe).
Altro consiglio, conviene invocare i costruttori dei sotto 
oggetti in modo esplicito, delegandone la costruzione. Ciò 
consente di stabilire anche l'ordine di inizializzazione dei 
sottooggetti (in caso quello di default, tal quale l'ordine di 
comparizione, non ti andasse bene)
ahhh, cambia i nomi dei parametri formali, coincidono coi nomi 
dei membri, e questo oscura uno dei due (penso i membri a meno 
di non usare lo scomdo this->membername)
es: FUORI
paperino::paperino (string arg_s ,pippo arg_p ,int arg_k)
     : k (arg_k), s (arg_s), p (arg_p)
	{ istruzioni };
ciao
Soviet-Mario


 comparizione, non ti andasse bene)
Attenzione!
L'ordine di inizializzazione dei membri dati segue sempre
quello di dichiarazione nella classe, non importa in che ordine
li inizializzi nel costruttore (questo puo' essere fonte di bug subdoli
e di difficile individuazione).
Una regola generale e' quella di rispettare lo stesso ordine nella
dichiarazione e nella inizializzazione.
Per quanto riguarda il post originale:
L'esempio che  fornito dovrebbe funzionare, infatti, se non si
specifica nessun costruttore per Pippo, il compilatore ne fornisce uno
di default "a gratis".
Ma se se ne definisce uno qualunque, per es. Pippo(string s1, string
s2, int n), allora quello "gratis" non c'e' piu' e bisogna
inizializzare esplicitamente il membro p di Paperino.
Saluti,
Fabio

 e di difficile individuazione).
azzzzzzzzz ! Non si finisce mai di imparare. Ti ringrazio molto 
di questa precisazione (e mi scuso col postatore della domanda), 
è possibile che presto o tardi questa falsa certezza mi avrebbe 
dato problemi, infatti
ciao
Soviet-Mario


 dato problemi, infatti
Si, e' Item 13 di Effective C++ Second Edition di Scott Meyers (a lavoro
ho la seconda, nella terza, che ho invece a casa, potrebbe aver un
diverso item numbero o essere stata inglobata sotto altro titolo, la
terza edizione e' parecchio diversa).
Si chiama: "Item 3: list members in an initialization list in the order
in which they are declared".
Il mio consiglio e' se non hai ancora letto questo libro di comprarlo e
leggerlo al piu' presto. E' una lettura veloce, piacevole e costruttiva.
Leggendo nei ritagli di tempo in pochi minuti leggi tranquillamente un
4-5 item al giorno, e cosi' leggi il libro comodamente in meno di due
settimane (se hai piu' tempo per leggere si legge invece in un paio di
giorni).
La cosa interessante di questo libro e' che tratta argomenti che
affronti tutti i giorni quando programmi in C++, quindi in realta
ripassi i contenuti del libro in automatico da solo programmando i
giorni seguenti (e inevitabilmente ripensando a quello che hai letto).
In pratica il libro basta leggerlo piu' che studiarlo.
Ho notato come con libri voluminosi e "completi" come C++ Primer 4th ed,
ad esempio, (che propone lo stesso consiglio per questo argomento), sia
facile non assimilare tutti i dettagli in quanto stai in pratica
leggendo 1000 pagine di dettagli (anche se in realta' il libro che ho
preso ad esempio e' piuttosto discorsivo). I libri di meyers invece sono
suddivisi in 50, 35 o 55 (etc...) items e risulta molto semplice
ricordarseli.
Magari lo hai letto e non ti sei ricordato, nel qual caso la mia teoria
non funge ;-)
HTH,
Tommaso Galleri
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG