Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]enums sintassi c++

    ciao
    ho il seguente codice:
    [code]
    enum IfcTimeSeriesDataTypeEnum {
    continuous,
    discrete,
    discretebinary,
    piecewisebinary,
    piecewiseconstant,
    piecewisecontinuous,
    notdefined,
    };
    [code]
    e
    codice:
    enum IfcTransitionCode { 
        discontinuous,
        continuous,
        contsamegradient,
        contsamegradientsamecurvature,
    };
    questi due blocchi di codice sono autogenerati, posseggo infatti tutti gli enum in una mappa a partire da un xsd , e li creo con un ciclo ,ho i metadati .
    Il problema è che naturalmente il compilatore c++ mi da quest errore:
    codice:
    c:\IFCXML\Dom\test2\conversions\ifc.h(366): error C2365: 'continuous' : redefinition; previous definition was a 'enumerator'
            c:\IFCXML\Dom\test2\conversions\ifc.h(273) : see declaration of 'continuous'
    qual è il modo migliore di sistemare il tutto per voi?
    sapendo che questi enum vengono utilizzati col loro nome, senza namespace da una serie di classi anch esse autogenerate , quindi se si cambia il nome , questo va cambiato anche in tutte le classi .
    Avevo visto il modo di "fare partire" l'enum da un indice diverso impostando con un uguale l'offset nell enum.
    cosi:
    codice:
    enum pippoEnum
    {
        pippoa,
        pippob,
        pippoc
    
    };
    
    enum plutoEnum
    {
        pippoa = 5,
        pluto,
        pluto
    
    };
    puo ' essere una soluzione ?
    il problema è che le classi si riferiscono con pippoa a due enum diversi , quale si sceglie?
    insomma sono un po a corto di idee.
    magari un typedef?????
    grazie.

  2. #2
    Devi necessariamente includerle in un namespace/in una struct/in una class. Gli enum mettono i nomi in essi definiti nel namespace in cui sono dichiarati, per cui inevitabilmente se hai due enum nello stesso namespace questi non possono avere costanti con lo stesso nome.
    Se anche le classi sono autogenerate, cambia il generatore del loro codice per usare i valori degli enum qualificati con il nome del namespace in cui saranno contenuti.

    Per inciso, nel nuovo standard C++ esistono i cosiddetti "enum class", che invece, tra le altre cose, "si tengono dentro" i nomi delle costanti.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    capito.
    Ma il problema è che gli enum vengono estratti da un sorgente c# tramite reflection e il c# non ha il problema della ridefinizione del valore di un enum.
    Mi chiedevo se ci fosse un modo per aggirare questo ostacolo.
    per es tutti gli enum anche nello stesso namespace contengono solitamente il valore:"notdefined" e questo si ripete per tutti gli enum dandomi tonnellate di errori.

    anche al limite se fosse possibile non utilizzare gli enum o non so

  4. #4
    Ma scusa, perché fare una cosa del tipo
    codice:
    namespace IfcTimeSeriesDataTypeEnum
    {
    enum t { 
        continuous,
        discrete,
        discretebinary,
        piecewisebinary,
        piecewiseconstant,
        piecewisecontinuous,
        notdefined
    };
    }
    non va bene? Poi ti basterà fare:
    codice:
    IfcTimeSeriesDataTypeEnum::t nomeVariabile;
    per dichiarare una variabile, e
    codice:
    nomeVariabile = IfcTimeSeriesDataTypeEnum::continuous;
    per accedere ai valori dell'enum. Se le classi sono generate automaticamente ti basta fare giusto qualche piccola modifica al generatore.

    Se invece puoi usare C++0x, allora ti basta fare
    codice:
    enum class IfcTimeSeriesDataTypeEnum { 
        continuous,
        discrete,
        discretebinary,
        piecewisebinary,
        piecewiseconstant,
        piecewisecontinuous,
        notdefined,
    };
    e a quel punto le enumerazioni hanno scoping come in C#.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    grazie 1000.
    molto gentile.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    un altra cosa:
    io da xml ricevo una stringa con il valore di uno dei tipi enumerati dall'enum, è possibile assegnare ad un tipo:

    IfcTimeSeriesDataTypeEnum::t nomeVariabile;//variabile

    string = "continuous";//una stringa che leggo da un xml

    ora:
    nomeVariabile = IfcTimeSeriesDataTypeEnum::continuous.

    come posso assegnare alla variabile nomeVariabile il valore "continuous" dalla stringa "continuous" che leggo dal file di testo(xml in questo caso)?

    su google ho trovato varie soluzioni , tra cui una mappa per enum che fa la trascodifica, una soluzione che mi piace poco.

    esistono altre soluzioni ?

    grazie.

  7. #7
    I nomi delle enum cessano di esistere a compile-time, non c'è nulla di integrato nel linguaggio per fare quello che chiedi, devi per forza ricorrere a soluzioni del tipo che citavi. Piuttosto che una map comunque ha più senso uno switch, dato che tanto i componenti dell'enum sono tutti noti a compile time.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Puoi fare così:
    codice:
    /*
    
    $ g++ --version
    i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
    $ g++ -Wall -ansi -pedantic -Wextra -Wconversion main.cpp 
    $ ./a.out 
    eStatusBad
    eStatusGood
    eStatusUnknown
    
    */
    
    #include <iostream>
    
    typedef enum{
    	eStatusBad = 0,
    	eStatusGood,
    	eStatusUnknown
    } EStatus;
    
    const char * StatusToString (const EStatus theStatus){
    	const char * kVect []={
    		"eStatusBad",
    		"eStatusGood",
    		"eStatusUnknown"
    	};
    	return kVect [static_cast <int> (theStatus)];
    }
    
    int main (void){
    	std::cout << StatusToString (eStatusBad) << std::endl;
    	std::cout << StatusToString (eStatusGood) << std::endl;
    	std::cout << StatusToString (eStatusUnknown) << std::endl;
    	return 0;
    }
    ma chiaro, devi mantenere sincronizzate la enum e la StatusToString.

  9. #9
    Forse si può fare con delle macro.

    ... ma ripensandoci, dato che è tutto codice generato automaticamente, la sincronizzazione tra enum e StatusToString non è un problema, la gestirebbe comunque il tool che genera il codice.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    hai ragione MItaly il tool lo gestisco io quindi aggiungere due o tre righe di codice per enum non è un problema.
    Il problema è che io vorrei assegnare ad una var Estatus::t il valore che è scritto nel parametro strValue che puo essere per es : "eStatusBad" o "eStatusGood"(stringa) ecc...
    perchè questo valore è scritto in un xml e io devo caricare l'enum(di tipo Estatus::t) con quella stringa
    codice:
    namespace EStatus{
    	enum t{
    		eStatusBad = 0,
    		eStatusGood,
    		eStatusUnknown
    	} ;
    
            const Estatus ToEnum (const std::string strValue){
            .
            .
            .
    	}
    
    }
    grazie.

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.