2012-06-12 17 views
5

Bir dizi enum içeren sınıfları olan bir kitaplık kullanıyorum. İşte örneğin TGNumberFormat::kNEAAnyNumber olarak adlandırıyoruz zorunda kodunda bir örnekSınıftan (C++) yararlanılıyor

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

bu. Bu değerleri çok sık kullanan bir GUI yazıyorum ve kod çirkinleşiyor. Bu enumları içe aktarmanın ve sadece kNEAAnyNumber yazmanın bir yolu var mı? Bu isimlerin herhangi birinin üst üste gelmesini beklemiyorum. using anahtar sözcüğünü kullanmanın çeşitli yollarını denedim ve hiçbiri derlenmeyecek.

+4

Ben işleve bir typedef yerel kullanmak istiyorsunuz ... kapak için çalıştırır (örneğin 'typedef TGNumberFormat NF;', izin, mesela, 'NF :: kNELLimitMin') . Yine de, isimleri yazmak daha iyi olduğunu iddia ediyorum. –

+0

yapı X: TGNumberFormat {}; '. Sonra onları 'X :: kNEAAnyNumber' olarak kullanabilirsiniz. Bunu yapmamanızı tavsiye etmiyorum, çünkü “TGNumberFormat” (görünüşte), “X” için bulduğunuz daha kısa bir addan daha fazla anlam taşıyor. – Praetorian

cevap

8

Bu sabitlerin tümünü kodunuzda kullanıyorsanız, bir ad alanındaki değerleri yeniden tanımlayan kendi başlığınızı oluşturmak yararlı olabilir. Daha sonra bu ad alanı using olabilir. Tüm değerleri, sadece sayımcıların isimlerini yeniden tanımlamanıza gerek yoktur. Örneğin,

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

Alternatif olarak, işlevler veya sık kullanmayı kaynak dosyalarında daha kısa isme TGNumberFormat typedef edebilirsiniz. Örneğin,

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

Ben ikinci yaklaşım üstündür ve blok kapsamda mantıklı kullanılırsa, ince bir uygulama olduğunu iddia ediyorum. Bununla birlikte, bir dosyada kullanım için, açıklık için sayımcıların tam isimlerinin kullanılması tercih edilir.

+0

+1 Çıplak sayımcıyı kaç kez gördüğümü ve dünyanın neresinde geldiğini merak ettim, çünkü sinsi bir "typedef" veya "using" ile gizlenmişti. –

+1

Sadece küçük bir açıklama: değer redifinasyonu için (ilk yönteminiz), düz 'EAttribute' yerine 'statik const EAttribute' kullanmak daha iyi olduğunu düşünüyorum. – Synxis

+0

Ad alanı kapsamı, onu "statik" yapmanın amacı nedir? –

0

senin kullanarak C++ 11 türü anlamak için anahtar kelime otomatik kullanabiliyorsanız: g ++ -std = C++ 0x -o ana main.cpp

:

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

ile derlenmiş

Eğer C++ 11 kullanmıyorsanız, @James McNellis
tarafından belirtildiği gibi typedefs kullanmayı düşünün makroları kullanmayın çünkü kapsam kurallarına uymayacaklar - typedefs will.

0

mümkündür ama biraz daha yukarı çalışmak ön daha sonra yerine kullanmak consts toplu tanımlamaktır içeren bir diğer yolu:

örn

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

attribute = AnyNumber; 
0

İki çözümleri:

  1. onunla yaşa.
  2. #define AnyNumber TGNumberFormat::kNEAAnyNumber

* *

İlgili konular