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++.