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

    [C++] Enum, unsigned int e cicli

    Creo la classe in cui definisco un "enum"

    codice:
    class Classe
    {
      public:
        //quello che serve
        enum NuovoEnum:unsigned int{primo,secondo,terzo};
        //altro che serve
    }
    poi creo un'altra classe, in cui uno dei metodi ha bisogno come parametro il valore di NuovoEnum definito in Classe.


    • Prima possibilità

    codice:
    class AltraClasse
    
    {
      public:    
    //quello che serve
        void metodoDiAltraClasse(Classe::NuovoEnum enum /*altri eventuali parametri);
    }
    ma se il metodo viene richiamato all'interno di un ciclo for, detto "oggetto" l'istanza di AltraClasse devo fare
    codice:
    for(unsigned int i=0;i<numero_cicli;i++)
    
    {
      Classe::NuovoEnum parametro=Classe::NuovoEnum(i);
      oggetto.metodoDiAltraClasse(parametro);
    }

    • Seconda possibilità



    codice:
    class AltraClasse
    {
      public:    
     //quello che serve
        void metodoDiAltraClasse(unsigned int enum /*altri eventuali parametri);
    }
    e nella definizione di metodoDiAltraClasse avrò
    codice:
    AltraClasse::metodiDiAltraClasse(unsigned int enum)
    {
      Classe::NuovoEnum nuovo_enum=Classe::NuovoEnum(enum);
      //altre cose che fa il metodo
    }
    quindi, se la richiamo in un ciclo for diventa
    codice:
    for(unsigned int i=0;i<numero_cicli;i++)
    {
      oggetto.metodoDiAltraClasse(i);
      //altre cose...
    }
    La domanda molto semplicemente è: cosa è meglio?
    Io propenderei per la prima, in quanto "obbligo" a passare un dato che è del tipo predefinito per il metodo.
    L'altra domanda, come faccio a cautelarmi dal passare valori che in realtà il mio enum non contempla? In altre parole, nel momento della compilazione, come posso verificare che i valori siano veramente definiti dall'enum in questione?
    Nell'esempio sopra, i valori ammissibili sono 0,1 e 2, se il ciclo arriva a 3, come faccio a dire che se i è maggiore del max valore di enum, interrompi il ciclo? é anche vero che uso un ciclo for, è perchè so già il numero di cicli, ma qualche errore può sempre scappare...
    Grazie.

  2. #2
    1. Direi anch'io il primo per lo stesso motivo.
    2. A priori, non c'è un modo; in C++ non c'è reflection, e le enum sono giusto un gradino sopra delle costanti messe in un namespace, per cui non c'è modo di sapere se un valore è tra quelli validi di una enum. Un idioma che si usa spesso per le enum senza "buchi" è fare una cosa del genere:
    codice:
    enum NuovoEnum {
        primo,
        secondo,
        terzo,
        Max_NuovoEnum
    };
    E se devi loopare sui valori ammessi per NuovoEnum basta fare
    codice:
    for(int i=0; i<Max_NuovoEnum; ++i)
    (ovviamente bisogna sempre avere cura che Max_NuovoEnum rimanga in fondo a tutto)
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    1. Direi anch'io il primo per lo stesso motivo.
    2. A priori, non c'è un modo; in C++ non c'è reflection, e le enum sono giusto un gradino sopra delle costanti messe in un namespace, per cui non c'è modo di sapere se un valore è tra quelli validi di una enum. Un idioma che si usa spesso per le enum senza "buchi" è fare una cosa del genere:
    codice:
    enum NuovoEnum {
        primo,
        secondo,
        terzo,
        Max_NuovoEnum
    };
    E se devi loopare sui valori ammessi per NuovoEnum basta fare
    codice:
    for(int i=0; i<Max_NuovoEnum; ++i)
    (ovviamente bisogna sempre avere cura che Max_NuovoEnum rimanga in fondo a tutto)
    Troppo gentile rispondere il giorno di Natale! Grazie.
    E soprattutto, continuo a scoprirne di nuove su C++, e più lo conosco, più c'è da conoscere.

    Grazie di nuovo, e auguri!

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.