2012-06-12 8 views
5

Używam biblioteki, która ma klasy z wieloma wyliczeniami. Oto przykładUżywanie wyliczeń z klasy (C++)

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

W kodzie muszę odnosić się do nich jak TGNumberFormat::kNEAAnyNumber na przykład. Piszę GUI, który bardzo często wykorzystuje te wartości, a kod staje się brzydki. Czy istnieje sposób, w jaki mogę zaimportować te wyliczenia i po prostu wpisać kNEAAnyNumber? Nie oczekuję, że którekolwiek z tych nazw się pokryją. Próbowałem różnych sposobów użycia słowa kluczowego using i żadne nie będzie się kompilować.

+4

użyłbym typedef lokalny do funkcji (np 'typedef TGNumberFormat NF;', pozwalając np 'NF :: kNELLimitMin') . Chociaż twierdzę, że lepiej jest wpisywać nazwiska. –

+0

'struct X: TGNumberFormat {};'. Następnie możesz użyć ich jako 'X :: KNEAAnyNumber'. Nie polecam tego, ponieważ 'TGNumberFormat' (pozornie) ma większe znaczenie niż jakakolwiek krótsza nazwa, którą wymyślisz dla' X'. – Praetorian

Odpowiedz

8

Jeśli używasz tych stałych w całym kodzie, może być korzystne utworzenie własnego nagłówka, który zredefiniuje wartości w przestrzeni nazw. Możesz następnie using tej przestrzeni nazw. Nie musisz ponownie definiować wszystkich wartości, tylko nazwy modułów wyliczających. Na przykład,

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

Alternatywnie można typedef TGNumberFormat do krótszej nazwy funkcji lub w plikach źródłowych, gdzie używają go często. Na przykład:

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

Twierdzę, że to drugie podejście jest lepsze i jeśli jest używane rozważnie w zakresie blokowym, jest dobrą praktyką. Jednak w celu użycia w pliku, myślę, że lepiej byłoby użyć pełnych nazw modułów wyliczających, dla jasności.

+0

+1 Nie mogę policzyć, ile razy widziałem nagiego modułu wyliczającego i zastanawiałem się, skąd się wzięło na Ziemi, ponieważ zostało ukryte przez podstępne "typedef" lub "używanie". –

+1

Tylko mała uwaga: dla redifinacji wartości (twoja pierwsza metoda), myślę, że lepiej jest użyć 'static const EAttribute' zamiast zwykłego' EAttribute'. – Synxis

+0

W zakresie przestrzeni nazw, jaki jest sens jego "statycznego"? –

0

Jeśli używając C++ 11 można użyć słowa kluczowego auto wydedukować typ:

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

skompilowany z: g ++ -std = C++ 0x -o main main.cpp

Jeśli nie używasz C++ 11, rozważ użycie typedefs, jak wspomina @James McNellis
używanie makr nie jest zalecane, ponieważ nie będą przestrzegane zasady zasięgu - typedefs będzie.

0

Innym sposobem jest to możliwe, ale wymaga nieco więcej pracy z przodu jest określenie partii consts które następnie użyć zamiast:

przykład

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

attribute = AnyNumber; 
0

dwa rozwiązania:

  1. z tym żyć.
  2. #define AnyNumber TGNumberFormat::kNEAAnyNumber

* Działa na okładce ... *

Powiązane problemy