Newsgroup: it.comp.lang.c++
Titolo: Il solito principiante......

Premetto che sono alle prime armi quindi la mia richiesta potrà sembrare 
stupida....
Ho il seguente problema, devo derivare una classe CMyTime dalla classe 
CTime eho fatto in questo modo:
class CMyTime : public CTime
{
private:
	//alucune variabile che mi serviranno	
public:	
	// alcune funzioni....
	CString Time2String(CMyTime);
	CMyTime String2Time(CString);
};
Se faccio in questo modo, senza dichiarare un costruttore, non posso 
inizializzare nessun oggetto della mia classe CMyTime. Giusto?
Io pensavo che il costruttore venisse ereditato dalla classe CTime, in 
questo modo se avessi scritto:
CMyTime Tempo(1998,03,14,12,23,10);
potevo creare un mio oggetto.
Ma sembra che non funzioni.
Allora ho detto "Aggiungo un costruttore per CMyTime!", il problema è che 
non so bene come fare, ho fatto un po di tentativi ma tutti mi generano 
errori di vario tipo.
Ad esempio:
class CMyTime : public CTime
{
private:
	//alucune variabile che mi serviranno	
public:
	CMyTime(int ore,int minuti,int secondi)
	{
		nHour=ore;
		nMinute=minuti;
		nSecond=secondi;
	}	
	// alcune funzioni....
	CString Time2String(CMyTime);
	CMyTime String2Time(CString);
};
Oppure:
class CMyTime : public CTime
{
private:
	//alucune variabile che mi serviranno	
public:
	CMyTime(int ore,int minuti ,int 
		secondi):CTime(ore,minuti,sedondi);	
	// alcune funzioni....
	CString Time2String(CMyTime);
	CMyTime String2Time(CString);
};
Cosa non va? E come si dovrebbe fare?
bo...@numerica.it
-- 
b0nu$
bo...@numerica.it
www.geocities.com/SiliconValley/Lakes/4313

 secondi):CTime(ore,minuti,sedondi);
Qui, due problemi:
1. CTime non ha un costruttore a 3 argomenti
 (ne occorrono 6, devi passare anno, mese e
giorno prima di ore, minuti, secondi);
2. dopo il costruttore della base non devi porre
un punto e virgola, ma un'aperta graffa; se non
devi fare nulla di speciale in questo costruttore
inlinea, dopo l'aperta graffa mettici subito la
chiusa graffa relativa.
Alex

Devi chiamare il vecchio costruttore. Esempio:
class originalClass {
    public:
        originalClass(int x = 0, int y = 0);
    protected:
    private:
};
class newClass : public originalClass {
    public:
        newClass(int a, int b) {
            originalClass(a, b);
        }
    protected:
    private:
};
Che ne pensi?

        }
No, la sintassi corretta e`:
        newClass(int a, int b): originalClass(a,b) {
        }
La sintassi che tu usi (con la keyword "super" invece del
nome della class base) e` invece quella di Java.
Alex

        }
Giusto.
Tuttavia non uso molto il java quindi non so cosa sia la parola riservata
'super' - che comunque non pensavo di aver usato (?)

Emanuele,
non conosco bene la classe CTime che immaggino appartenga alla
collezione di MFC, tuttavia cerchero' di fare luce su alcuni
aspetti che sono tipici dell C++.
data una classe base:
class Base{
  private:
    //dati privati
    int    iNumero;
    char   sNome[32];
    //...
   public:
    //costruttore
    Base(int Num, char* Nome){
	//inizializzo i dati membri privati
	iNumero = Num;
	strcpy(sNome, Nome)
    }
    //...
};
nell'ereditare dalla classe base è importante soddisfare le
esigenge del construttore della classe materna. E' compito
del programmatore chiamare correttamente il costruttore
della classe madre, in questo modo:
class Derived{
   private:
     int iAltroNumero;
     //...
    public:
    //costruttore
      Derived(int AltroNumero, int Numero, char* Nome):
	Base(Numero, Nome) {}
    //...
};
Cosi' facendo, il costruttore della classe Derived ha correttamente
chiamato anche quello della classe Base. 
In C++ quando non definisci almeno un costruttore, il
compilatore ne crea uno per te. Vi sono pero' moltissimi
casi in cui tale automatismo sfocia in un numero
di errori imprevisti da mandare in tilt l'intero
sistema di elaborazione.
Ogni qualvolta devi ereditare una classe, informati sul/sui
costruttore/i che la classe materna utilizza per inizializzare
i dati membri. Basta consultare l'help in linea o meglio
dare uno sguardo al codice sorgente (nel caso sia disponibile!).
A presto.