Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    55

    [C++] Errore nel costruttore

    Salve ragazzi, non capisco perchè qui
    codice:
    Campionato::Campionato() : 
        squadre[0]("Italia"),
        squadre[1]("Germania"),
        squadre[2]("Francia"),
        squadre[3]("Belgio"),
        squadre[4]("Brasile"),
        squadre[5]("Argentina"),
        squadre[6]("Uruguay"),
        squadre[7]("USA"),
        squadre[8]("Cile"),
        squadre[9]("Spagna"),
        squadre[10]("Portogallo"),
        squadre[11]("Olanda"),
        squadre[12]("Inghilterra"),
        squadre[13]("Messico"),
        squadre[14]("Colombia"),
        squadre[15]("Ghana"),
        gironi[0](squadre[0],squadre[8],squadre[6],squadre[7], "A"),
        gironi[1](squadre[1],squadre[2],squadre[15],squadre[13], "B"),
        gironi[2](squadre[3],squadre[4],squadre[10],squadre[12], "C"),
        gironi[3](squadre[5],squadre[9],squadre[11],squadre[14], "D"){;}
    
        mi dice:
        Campionato.cpp: In constructor ‘Campionato::Campionato()’:
        Campionato.cpp:4: error: expected ‘(’ before ‘[’ token
    Campionato.cpp:4: error: expected ‘{’ before ‘[’ token
    Campionato.cpp: At global scope:
    Campionato.cpp:4: error: expected unqualified-id before ‘[’ token
    Perchè?
    Grazie

  2. #2
    La sintassi dell'initialization list si può usare per inizializzare oggetti "interi", non sotto-oggetti (come nel caso dei singoli elementi degli array). La sintassi corretta sarebbe:
    codice:
    Campionato::Campionato() : 
        squadre{
            "Italia",
            "Germania",
            "Francia",
            "Belgio",
            "Brasile",
            "Argentina",
            "Uruguay",
            "USA",
            "Cile",
            "Spagna",
            "Portogallo",
            "Olanda",
            "Inghilterra",
            "Messico",
            "Colombia",
            "Ghana"},
        gironi{
            Girone(squadre[0],squadre[8],squadre[6],squadre[7], "A"),
            Girone(squadre[1],squadre[2],squadre[15],squadre[13], "B"),
            Girone(squadre[3],squadre[4],squadre[10],squadre[12], "C"),
            Girone(squadre[5],squadre[9],squadre[11],squadre[14], "D")
            }
    valida tuttavia solo da C++11 (in C++98 non esiste modo per inizializzare un array tramite initialization list).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    55
    Giustooo!!... Grazie 1000

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    55
    e in c++98 come si dovrebbe fare?

  5. #5
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Quote Originariamente inviata da vicio_93 Visualizza il messaggio
    e in c++98 come si dovrebbe fare?
    Puoi lasciar perdere l'initialization list e mettere tutto nel corpo del costruttore...

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    55
    Con la stessa struttura scritta sopra?

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    55
    codice:
    Campionato::Campionato(){
        squadre{
            "Italia",
            "Germania",
            "Francia",
            "Belgio",
            "Brasile",
            "Argentina",
            "Uruguay",
            "USA",
            "Cile",
            "Spagna",
            "Portogallo",
            "Olanda",
            "Inghilterra",
            "Messico",
            "Colombia",
            "Ghana"
            };
        gironi{
            Girone (squadre[0],squadre[8],squadre[6],squadre[7], "A"),
            Girone (squadre[1],squadre[2],squadre[15],squadre[13], "B"),
            Girone (squadre[3],squadre[4],squadre[10],squadre[12], "C"),
            Girone (squadre[5],squadre[9],squadre[11],squadre[14], "D")
            };
    }
    
    [root@root Mondiali]# g++ main.cpp Campionato.cpp Girone.cpp Partita.cpp Squadra.cpp
    Campionato.cpp: In constructor ‘Campionato::Campionato()’:
    Campionato.cpp:4: error: expected ‘;’ before ‘{’ token
    Campionato.cpp:22: error: expected ‘;’ before ‘{’ token

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    55
    Penso che non posso utilizzare più questa scrittura perchè è come se stessi re-inizializzando gli oggetti.. e non è possibile..

  9. #9
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ma se tu nel costruttore fai

    codice:
    squadre[0] = "Italia";
    squadre[1] = ...;
    ...
    gironi[0] = Girone(squadre[0],squadre[8],squadre[6],squadre[7], "A");
    ...

    non funziona?

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2014
    Messaggi
    55
    codice:
     
    Campionato::Campionato(){
            squadre[0]=("Italia");
            squadre[1]=("Germania");
            squadre[2]=("Francia");
            squadre[3]=("Belgio");
            squadre[4]=("Brasile");
            squadre[5]=("Argentina");
            squadre[6]=("Uruguay");
            squadre[7]=("USA");
            squadre[8]=("Cile");
            squadre[9]=("Spagna");
            squadre[10]=("Portogallo");
            squadre[11]=("Olanda");
            squadre[12]=("Inghilterra");
            squadre[13]=("Messico");
            squadre[14]=("Colombia");
            squadre[15]=("Ghana");
            gironi[0]=(squadre[0],squadre[8],squadre[6],squadre[7], "A");
            gironi[1]=(squadre[1],squadre[2],squadre[15],squadre[13], "B");
            gironi[2]=(squadre[3],squadre[4],squadre[10],squadre[12], "C")
            gironi[3]=(squadre[5],squadre[9],squadre[11],squadre[14], "D");
    }
    HO risolto i problemi legati all'inizializzazione dell'array squadre [16] ridefinendo l'operatore = per la classe squadra.. cioè void operator=(const string);
    Per l'inizializzazione dell'array gironi [4] invece mi da errore.. In particolare ho anche in questo caso ridefinito l'operatore =, però in questo caso passandogli 5 argomenti e gli errori sono impietosi:

    In file included from Campionato.h:6,
    from main.cpp:3:
    Girone.h:16: error: ‘void Girone:perator=(Squadra&, Squadra&, Squadra&, Squadra&, std::string)’ must take exactly one argument
    In file included from Campionato.h:6,
    from Campionato.cpp:1:
    Girone.h:16: error: ‘void Girone:perator=(Squadra&, Squadra&, Squadra&, Squadra&, std::string)’ must take exactly one argument
    Campionato.cpp: In constructor ‘Campionato::Campionato()’:
    Campionato.cpp:20: error: no match for ‘operator=’ in ‘((Campionato*)this)->Campionato::gironi[0] = (0, "A")’
    Girone.h:8: note: candidates are: Girone& Girone:perator=(Girone&)
    Campionato.cpp:21: error: no match for ‘operator=’ in ‘((Campionato*)this)->Campionato::gironi[1] = (0, "B")’
    Girone.h:8: note: candidates are: Girone& Girone:perator=(Girone&)
    Campionato.cpp:22: error: no match for ‘operator=’ in ‘((Campionato*)this)->Campionato::gironi[2] = (0, "C")’
    Girone.h:8: note: candidates are: Girone& Girone:perator=(Girone&)
    Campionato.cpp:23: error: expected ‘;’ before ‘gironi’
    In file included from Girone.cpp:1:
    Girone.h:16: error: ‘void Girone:perator=(Squadra&, Squadra&, Squadra&, Squadra&, std::string)’ must take exactly one argument


    Non capisco proprio.. Non esiste un modo più semplice per inizializzare gli array nei costruttori senza c++11??

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.