Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177

    [C++] Inizializzare array con lista di inizializzazione

    In prova.h definisco
    codice:
    class Prova
    {
      public:
        Prova();
        //altro...
      private:
        double valore;
        //altro...
    }
    Se col costruttore di default voglio inizializzare valore a zero faccio, in prova .cpp

    codice:
    Prova::Prova():valore(0.0)
    {
      //altre cose...
    }
    Se al posto di valore avessi un array, è possibile inizializzare a 0.0 l'array con la lista di inizializzazione?
    Fino ad ora ho sempre fatto in questo modo
    In prova.h definisco
    codice:
    class Prova
    {
      public:
        Prova();
        //altro...
      private:
        double valore[5];
        //altro...
    }
    In prova .cpp

    codice:
    Prova::Prova()
    {
      for(unsigned int i=0;i<5;i++)
      {
        valore[i]=0.0;
      }
      //altre cose...
    }
    è possibile invece (per quello che ho letto non mi pare, ma chiedo conferma) fare un qualcosa del genere? (è pseudocodice diciamo, perchè non funziona, ma serve solo a chiarire quello che ho in mente)

    codice:
    Prova::Prova():valore[]({0,0,0,0,0})
    {
      //altre cose...
    }
    Grazie

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Si, a patto di avere un compilatore C++11 (praticamente tutti ormai) puoi scegliere di fare:
    codice:
    class Prova
    {
      public:
        Prova();
        //altro...
      private:
        double valore[5] = {0.0};
        //altro...
    }
    o
    codice:
    Prova::Prova(): valore {0}
    {
      //altre cose...
    }
    a scelta.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Ho fatto una prova qui, col codice seguente ottengo tutti zero
    codice:
    // Example program
    #include <iostream>
    #include <string>
    
    class Prova
    {
      public:
        Prova():valore {0.0}{};
        void getValore()
        {
          for(unsigned int i=0;i<5;i++)
          {
            std::cout<<"\n"<<valore[i];
          }
        };
        //altro...
      private:
        double valore[5];
        //altro...
    };
    
    int main()
    {
      Prova prova;
      prova.getValore();
    
    }
    E anche con questo
    codice:
    // Example program
    #include <iostream>
    #include <string>
    
    class Prova
    {
      public:
        Prova(){};
        void getValore()
        {
          for(unsigned int i=0;i<5;i++)
          {
            std::cout<<"\n"<<valore[i];
          }
        };
        //altro...
      private:
        double valore[5]={0.0};
        //altro...
    };
    
    int main()
    {
      Prova prova;
      prova.getValore();
    
    }
    Con questo codice, e anche il successivo, ottengo 33 solo al primo elemento, gli altri sono zero. In basso, il compilatore è settato a C++14.

    codice:
    // Example program
    #include <iostream>
    #include <string>
    
    class Prova
    {
      public:
        Prova():valore {33}{};
        void getValore()
        {
          for(unsigned int i=0;i<5;i++)
          {
            std::cout<<"\n"<<valore[i];
          }
        };
        //altro...
      private:
        double valore[5];
        //altro...
    };
    
    int main()
    {
      Prova prova;
      prova.getValore();
    
    }
    codice:
    // Example program
    #include <iostream>
    #include <string>
    
    class Prova
    {
      public:
        Prova(){};
        void getValore()
        {
          for(unsigned int i=0;i<5;i++)
          {
            std::cout<<"\n"<<valore[i];
          }
        };
        //altro...
      private:
        double valore[5]={33};
        //altro...
    };
    
    int main()
    {
      Prova prova;
      prova.getValore();
    
    }
    Se faccio
    codice:
    // Example program
    #include <iostream>
    #include <string>
    
    class Prova
    {
      public:
        Prova():valore {33,2,5,6,7}{};
        void getValore()
        {
          for(unsigned int i=0;i<5;i++)
          {
            std::cout<<"\n"<<valore[i];
          }
        };
        //altro...
      private:
        double valore[5];
        //altro...
    };
    
    int main()
    {
      Prova prova;
      prova.getValore();
    
    }
    oppure

    codice:
    // Example program
    #include <iostream>
    #include <string>
    
    class Prova
    {
      public:
        Prova(){};
        void getValore()
        {
          for(unsigned int i=0;i<5;i++)
          {
            std::cout<<"\n"<<valore[i];
          }
        };
        //altro...
      private:
        double valore[5]={33,2,5,6,7};
        //altro...
    };
    
    int main()
    {
      Prova prova;
      prova.getValore();
    
    }
    Il tutto funziona correttamente.


    Dove stà l'inghippo?
    Uno dei dati membro è un array in quanto conosco il suo numero di elementi tramite un tipo enumerato (al posto di 5 c'è AltraClasse::NumeroElementiArray), che potrebbe cambiare valore: col ciclo for il tutto era gestito in automatico, se invece devo passargli la lista di tutti gli zero, la cosa non è più automatica...

    A casa uso Code::Blocks e compilatore gcc se non ricordo male, può dipendere da questo?

    Grazie ancora

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Dove stà l'inghippo?
    Nessun inghippo. Semplicemente se metti {0} in automatico il compilatore mette a zero tutte le locazioni dell'array, con {33} il compilatore mette la prima locazione a 33 e il resto a zero. Se vuoi valori diversi li devi esplicitare locazione per locazione come faresti con un array normale.
    Uno dei dati membro è un array in quanto conosco il suo numero di elementi tramite un tipo enumerato (al posto di 5 c'è AltraClasse::NumeroElementiArray), che potrebbe cambiare valore: col ciclo for il tutto era gestito in automatico, se invece devo passargli la lista di tutti gli zero, la cosa non è più automatica...
    Come detto non serve passargli una lista di tutti zero: ne basta uno anche se l'array ha 2^n locazioni.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.