2012-09-12 21 views
5

"Foo" sınıfında (aşağıda) tanımlanan bir dizi enum değerleri var. Ben de Baz numaralandırma değerleri kapsamını azaltmak için bir yapı kullanıyorumErişim değerleri C++ 98 ve C++ 11

namespace Fii 
{ 
    class Foo 
    { 
     struct Bar 
     { 
      enum Baz 
      { 
       BAZ1, 
       BAZ2, 
       BAZ3 
      }; 
     }; 
    }; 
}; 

gösterisi gibi ilgili değerlerin bir grup vardır.

Amacım, bir enum türünden bir değişkene bir değer atamaktır. Yukarıdaki sınıf tanımını kullanarak, tek bunu yapabilirsiniz:

İlk bakışta
  • , MyValue bir Fii :: Foo olarak başlatıldı gibi görünüyor :::

    Fii::Foo::Bar::Baz myValue = Fii::Foo::Bar::BAZ1 (Works in both C++98 and C++11) 
    

    Ancak, ben hissediyorum Bar ancak bu enum ebeveyn (bu durumda Bar)

Kime grupla ilgili sabitler için kesmek sırf olduğunu daha hazır hale, II kodunu yeniden çarpanlarına: Bu yeni sınıf tanımını kullanarak

namespace Fii 
{ 
    class Foo 
    { 
     enum Baz 
     { 
      BAZ1, 
      BAZ2, 
      BAZ3 
     }; 
    }; 
}; 

, tek bunu yapabilirsiniz:

Fii::Foo::Baz myValue = Fii::Foo::Baz::BAZ1 (Works in C++11 only) 
Fii::Foo::Baz myValue = Fii::Foo::BAZ1 (Should work on C++98 and C++11 - not tested) 

Q1) Neden Fii :: Foo olduğunu :: Bar: : Baz myValue = Fii :: Foo :: Baz :: BAZ1 sadece C++ 11 üzerinde çalışıyor? C++ 98

Q2) FII :: fan :: Baz MyValue = FII :: fan :: Baz :: BAZ1 yazmak için bir yol var? Sınıf tanımında istediğiniz değişiklikleri yapmaya izin verilir.

Çevre: - Xcode 4 - - Mac OS OS class enums ekleyen 10.8

cevap

5

juanchopanza cevabı en ...

S2: C++ 98 yılında Fii :: Foo :: Baz MyValue = Fii yazmak için bir yol yoktur :: Foo :: Baz :: BAZ1? Sınıf tanımında istediğiniz değişiklikleri yapmaya izin verilir.

namespace Fii 
{ 
    class Foo 
    { 
     class Baz 
     { 
      public: 
      enum E { BAZ1, BAZ2, BAZ3 }; 
      Baz(E e) : e_(e) { } 
      operator const E() const { return e_; } 
      private: 
      E e_; 
     }; 
    }; 
} 

Açıklama: gibi

şey Fii::Foo::Baz::BAZ1 için bir numaralandırma için geçerli bir referans olması için C++ 03, Baz bir namespace veya class/struct/union olmalıdır. Ancak, Baz'in kendi numaralandırma türü olduğu gibi görünmesini sağlamaya çalışıyoruz, BAZ1 mevcut değerlerden biri. Bunu yapmak için, Baz'ı kendi kapsamı içerisinde beyan edilen numaralardan herhangi birini depolayabilen kullanıcı tanımlı bir tür (sınıf/yapı) yapmalıyız.Bu nedenle, geçerli değeri kaydetmek için bir veri elemanı, değeri ayarlamak için bir kurucu, sayım değerini gizli olarak gösterecek bir operatör, Baz nesnelerini kullanarak kodda her yerde e_ koduna gerek duymadan Bazı get() const işlevini çağırın.

+0

Bu kod parçasının neden gerekli olduğunu açıklayabilir misiniz? Baz (E e): e_ (e) {} işleç yapısı E() const {return e_; özel: E e_; –

+0

@DavidAndreoletti: Yukarıdaki kodda, Baz bir "kullanıcı tanımlı tür" - nesne örnekleri her biri tek bir E 'değerini yöneten bir sınıftır. Daha sonra sormak istediğiniz kod, sayımlardan birini depolayan kurucu, nesnenin ne zaman bir "Baz" ile ne yapacağını bilmediği bir ifadede nesne göründüğünde örtük olarak bir "E" değeri sağlayan bir işleçtir. E değişkenini saklayan üye değişkeni. Anlaşıldı mı? - Daha fazla açıklama/örnekler için çekinmeyin .... –

+0

Önerinizi denedim ve gayet iyi çalışıyor. Bu yardım kodunun okunabilirliğini ve kodun sürekliliğini engellemediğini düşünüyor musunuz? –

6

C++ 11 C++ 11 desteği ile Clang derleyici. Ayrıca burada gördüğünüz şey olan eski tarz enum değerlerine erişmenin yeni bir yolunu da ekler. Q1 için geçerli

enum Foo { FOO1, FOO2, FOO3 }; // old-style enum 

Foo f1 = Foo::FOO1; // OK in C++11, error in C++98. 
Foo f2 = FOO1; // OK in C++98 and C++11 (for backward compatibility)