2015-02-24 26 views
5

Aşağıda gösterildiği gibi bir sınıf bildiriminde tanımlandığında static enum ve enum tanımları arasındaki fark nedir?C++ bir sınıfta statik enum vs enum bildirme

class Example 
{ 
    Example(); 
    ~Example(); 

    static enum Items{ desk = 0, chair, monitor }; 
    enum Colors{ red = 0, blue, green }; 
} 

Ayrıca, bir sınıftaki türleri tanımladığımızdan, bunlara ne diyoruz? Bir sınıfta bir değişken tanımladığımda, ona bir üye değişkeni diyoruz.

+0

Hangi derleyiciyi kullanıyorsunuz? Eğer bu derleme, 'statik' olarak burada çok anlamlı olmazsa beni şaşırtacaktır. – swalog

+0

C++ 11 kullanıyorsanız, 'enum class' kullanmayı düşünün. – Dai

+0

"Statik" belirteci bir enum bildirimi içinde geçerli değil. Bu derlememeli. –

cevap

7

static, enum bildirimlerine uygulanamaz, bu nedenle kodunuz geçersizdir. N3337 itibaren

, §7.1.1/5 [dcl.stc] static belirteci sadece değişkenlerin ve işlevlerin isimleri ve anonim sendikalara uygulanabilir

...

Bir enum beyanı bunların hiçbiri değildir.

enum'un bir örneğini oluşturabilir ve isterseniz bunu static yapabilirsiniz. Bu durumda items yılında

class Example 
{ 
    enum Items{ desk = 0, chair, monitor }; 
    static Items items; // this is legal 
}; 

tıpkı diğer static data member gibidir.


Bu bir MSVC bug; Bağlantılı hata raporundan, derleyicinin, enum bildirimlerinde hem static hem de register depolama belirticilerine izin vereceği anlaşılıyor. Hata düzeltildi, bu yüzden VS2015'te düzeltme yapılabilir.

+0

Yine de, buradaki "statik" in neden bu bildirimde beyan edilen 0 veri kümesine uygulanmasına izin verilmediğini merak ediyorum. Sonuçta, eğer static enum Öğeler {...} item; 'ise, geçerli olur. – Brian

+0

@Brian Ne demek istediğini anlamıyorum * 0 veri kümesi *. Ya bir veri üyesi var ya da yok, ve eğer yoksa, depolama belirteci ne için geçerli olacak? – Praetorian

+0

Bir dizi 0 veri üyesine sahip olmanız nedeniyle, aslında başlangıç ​​için bir set oluşturmanız gerekir. “Enum” özelliğini kullanmak, eğer bir tane oluşturursanız, bir kümenin nasıl görüneceğini anlatmak gibidir. Aslında, örneğinizin aksine, bir şey oluşturmuyor. – NoseKnowsAll

0

static bir C++ depolama belirtecidir. Sınıfın bu üyesinin değeri, sınıfın tüm örnekleri için aynı olduğu anlamına gelir. Burada enumlar hakkında özel bir şey yok.

DÜZENLEMEK: static etiketi wiki'sinin bir açıklaması var. Tam olarak bu konuda.

EDIT2: Kodunuzu yanlış okudum. Statik bir numara yok. Değeri tutan bir enum türünün statik değişkenine sahip olabilirsiniz.

+0

Bir 'enum' değişken değildir. –

+0

evet, ancak bir kodlamada kodlanmış durumu saklayan bir değişken var. –

+0

Ama o bunları sormuyor. –