2012-06-12 9 views
5

Estoy usando una biblioteca que tiene clases con varias enumeraciones. He aquí un ejemploUso de enumeraciones de una clase (C++)

class TGNumberFormat 
{ 
    public: 
    // ... 
    enum EAttribute { kNEAAnyNumber 
    kNEANonNegative 
    kNEAPositive 
    }; 
    enum ELimit { kNELNoLimits 
    kNELLimitMin 
    kNELLimitMax 
    kNELLimitMinMax 
    }; 
    enum EStepSize { kNSSSmall 
    kNSSMedium 
    kNSSLarge 
    kNSSHuge 
    }; 
    // etc... 
}; 

En el código que tengo para hacer referencia a estos como TGNumberFormat::kNEAAnyNumber por ejemplo. Estoy escribiendo una GUI que usa estos valores muy a menudo y el código se está poniendo feo. ¿Hay alguna forma de que pueda importar estas enumeraciones y simplemente escriba kNEAAnyNumber? Realmente no espero que ninguno de estos nombres se superponga. He intentado varias formas de utilizar la palabra clave using y ninguna compilará.

+4

me gustaría utilizar un typedef locales a la función (por ejemplo 'typedef TGNumberFormat NF;', lo que permite, por ejemplo, 'NF :: kNELLimitMin') . Sin embargo, diría que es mejor escribir los nombres. –

+0

'struct X: TGNumberFormat {};'. Entonces puede usarlos como 'X :: kNEAAnyNumber'. No te recomiendo que hagas esto, ya que 'TGNumberFormat' (ostensiblemente) tiene más significado que cualquier nombre corto que se te ocurra para' X'. – Praetorian

Respuesta

8

Si está utilizando estas constantes en su código, podría ser beneficioso crear su propio encabezado que redefine los valores en un espacio de nombres. A continuación, puede using ese espacio de nombres. No necesita redefinir todos los valores, solo los nombres de los enumeradores. Por ejemplo,

namespace TGEnumerators 
{ 
    static EAttribute const kNEAAnyNumber(TGNumberFormat::kNEAAnyNumber); 
    // etc. 
} 

Como alternativa, puede typedef TGNumberFormat a un nombre más corto en las funciones o archivos de origen en los que utilice con frecuencia. Por ejemplo,

typedef TGNumberFormat NF; 
NF::EAttribute attribute = NF::kNEAAnyNumber; 

yo diría que el último método es superior, y si se utiliza juiciosamente al ámbito de bloque, es una buena práctica. Sin embargo, para usar en un archivo, creo que sería preferible usar los nombres completos de los enumeradores, para mayor claridad.

+0

+1 No puedo contar cuántas veces he visto un enumerador desnudo y me pregunté de dónde venía porque estaba oculto por un 'typedef' o' using' astuto. –

+1

Solo una pequeña observación: para redifinición de valor (su primer método), creo que es mejor usar 'static const EAttribute' en lugar de plain' EAttribute'. – Synxis

+0

En el ámbito del espacio de nombres ¿de qué sirve hacer 'static'? –

0

Si su uso C++ 11 se puede utilizar la palabra clave auto para deducir el tipo:

//the compiler will see auto and know to use: TGNumberFormat::EAttribute 
auto attribute = TGNumberFormat::kNEAAnyNumber; 

compilado con: g ++ -std = C++ 0x -o main.cpp principal

Si no está utilizando C++ 11, considere el uso de typedefs como se menciona en @James McNellis
No se recomiendan el uso de macros porque no obedecerán las reglas de scope-- typedefs will.

0

Una otra manera que es posible, pero implica un poco más de trabajo en la delantera es definir un lote de consts que luego utiliza en su lugar:

por ejemplo,

const TGNumberFormat::EAttribute AnyNumber = TGNumberFormat::kNEAAnyNumber; 
const TGNumberFormat::EAttribute NonNegative = TGNumberFormat::kNEANonNegative; 
... 

attribute = AnyNumber; 
0

dos soluciones:

  1. vivir con ella.
  2. #define AnyNumber TGNumberFormat::kNEAAnyNumber

* corre a esconderse ... *

Cuestiones relacionadas