PDA

Visualizza la versione completa : [C++] Field "C" has incomplete type


FinalFantasy
06-11-2005, 23:20
class AttivitaComposte : public AttivitaElementari
{
public:
AttivitaComposte C[20];
int nC;

AttivitaComposte()
{
nC=0;
TipoAttivita=Composta;
}

void assignC(AttivitaComposte c[])
{
//for (int i=0;i<nC;i++)
}

};



Mi da errore sul metodo C, mi dice che il campo ci ha un tipo incompleto; e TipoAttivita=Composta, metodo che eredita dalla superclasse, mi dice parse error before '='

oregon
06-11-2005, 23:36
Scusa ma C dichiarato cosi'

AttivitaComposte C[20];

e' un metodo?

A me sembra un array di 20 elementi di oggetti di classe AttivitaComposte che, non essendo ancora definita, non e' neanche conosciuta dal compilatore.

Sei sicuro che volevi dichiarare C come metodo?

FinalFantasy
06-11-2005, 23:38
Originariamente inviato da oregon
Scusa ma C dichiarato cosi'

AttivitaComposte C[20];

e' un metodo?

A me sembra un array di 20 elementi di oggetti di classe AttivitaComposte che, non essendo ancora definita, non e' neanche conosciuta dal compilatore.

Sei sicuro che volevi dichiarare C come metodo?
si, x la risoluzine di un esercizio, spiegato a me da un prof universitario che lavora in java. Pensavo che era fattibile dichiarere un oggetto all'interno della sua stessa classe come metodo.

oregon
06-11-2005, 23:42
"Dichiarare un oggetto all'interno della sua stessa classe come metodo"?

Hai riletto questa frase?

Sicuramente quello che vuoi fare e' qualcos'altro ... sicuramente non quello che hai scritto ...

Forse, rispiegando la necessita', magari con un esempio ...

FinalFantasy
07-11-2005, 12:59
beh...scusa...non credo che mettere un metodo di tipo AttivitaComposte dentro la classe AttivitaComposte sia poi una cosa strana...se in java si può fare...

anx721
07-11-2005, 17:40
Non puoi avere in una classe un campo il cui tipo coincide con quello della stessa classe perchè avresti una struttura ricorsiva infinita:

supponi che la classe AttivitaComposte dichiari al suo interno un campo c di tipo AttivitaComposte; allora se te istanzi un oggetto AttivitaComposte questo ha al suo interno il campo c che è AttivitaComposte che a sua volta deve avere un suo campo c che è AttivitaComposte che a sua volta deve avere un campo c e cosi via all'infinito. Il che non è posibile.

Ciò che invece puoi fare per avere un tipo ricorsivo è dichiarare il campo c non come un AttivitaComposte ma come un puntatore a AttivitaComposte: in questo modo la ricorsione si interrompe quando un oggetto AttivitaComposte ha il campo c pari a NULL e quindi la catena finisce. Analogo discorso vale se non hai un campo c AttivitaComposte ma hai un intero array di AttivitaComposte...anche in questo caso non dovresti dichiarare c come un array di AttivitaComposte ma come un puntatore ad AttivitaComposte che istanzierai nel modo opportuno nel costruttore.

Il motivo per cui in java puoi dichiarare nella classe A un campo di tipo A dipende dal fatto che in java tutti gli oggetti sono in realtà puntatori ad oggetti e quindi il campo c di tipo A è un puntatore ad A inizializzato a null. In c++ ci sono gli oggetti veri e propri e accanto a questi i puntatori ad oggetti; proprio questa doppia presenza complica parecchio la sintassi del linguaggio c++.

oregon
07-11-2005, 19:07
Originariamente inviato da FinalFantasy
beh...scusa...non credo che mettere un metodo di tipo AttivitaComposte dentro la classe AttivitaComposte sia poi una cosa strana...se in java si può fare...

In C++ si deve fare riferimento ad un *puntatore* alla stessa classe ... cosa che un metodo puo' restituire ...

Questo tuo "parallelo" tra Java e C++ ti confonde le idee.

Se non conosci a perfezione Java, evita i confronti.

Il mio consiglio è di studiare C++ "a prescindere" dalle tue conoscenze di altri linguaggi ...

Loading