Semplicemente togliendo:
Girone *a,*b,*c,*d; // <-- questi.
char h,n;
cout<< "Inserisci lettera girone(in maiuscolo)" << endl;
cin>> h;
che sono variabili locali e non sono quelli che assegni qui:
int main(){
Girone a("Italia","Germania","Cina","Korea");
Girone b("Spagna","Irlanda","Cameroon","Finlandia");
Girone c("Francia","USA","EAU","Portogallo");
Girone d("Cipro","Malta","SudAfrica","Brasile");
Campionato r(a,b,c,d); // <-- questi
Ricorda sempre il concetto: variabile locale batte variabile globale. E all'interno di una classe, e solo per la classe, le variabili membro sono a tutti gli effetti variabili globali, per cui se all'interno di una funzione usi variabili locali con lo stesso nome di quelle globali, saranno le variabili locali a essere usate dal compilatore.
Questo per risolvere il problema dei puntatori.
Però notò che prima di tutto questo fai errori proprio di sintassi:
void Girone::stampadg(Partita* p) {
cout << p.nomecasa << " " << p.nometrasferta << endl;
}
Che significato ha? Stai passando un puntatore non un oggetto, pertanto l'accesso ai dati membri (tra l'altro nemmeno accessibili dato che sono privati di Partita) lo dovresti semmai fare con
-> non con
..
In più la 5° riga del main è proprio sbagliata: stai creando oggetti, non puntatori a oggetti e il costruttore di Campionato accetta solo puntatori. E' un grave errore.
Tralascio il fatto che passare
Partita* p non ha proprio senso dato che l'array di partite è membro di
Girone e quindi sempre accessibile da funzioni appartenenti a
Girone, ma questo punto al momento è secondario rispetto a quanto detto.
Riassumendo devi capire che devi usare
-> con puntatori a oggetti e
. con oggetti fatti e finiti e poi come accedere alle variabili membro di altre classi con opportuni metodi provvisti dalle classi stesse.
Intanto sistema questo, poi vediamo il resto.