2011-06-09 37 views
9

C++ 'bildirimi ve yönergesini kullanarak nasıl çalıştığını iyi anladım. Ancak, bu konuda güldüm ... Belki bu mümkün değil mi? Benim enum değişkenler kalite zorunda kalmamak istiyorum:C++ Ad alanı 'bir sınıf için' bildiren 'kullan' enum

namespace Foo { 
    class MyClass { 
     public: 
     enum MyEnum { X, Y, Z }; 
    } 
} 

Ve şimdi, bu ad dışından, ben gibi şeyler yapabilmek istiyorum:

using Foo::MyClass.MyEnum; 
MyEnum letter = MyEnum::x; 

Ama görünüşe göre bu şekilde değil yapmak için? Bahse girerim bu mümkün, ancak benim notasyon yanlış ... Ayrıca Foo :: MyClass :: MyEnum kullanmayı denedim, ancak derleyici Foo :: MyClass'ın bir isim alanı olduğunu düşünüyor.

Eklendi: Gördüğünüz gibi, bu Bu doğrudan cevap vermez

Foo::MyClass::MyEnum value = Foo::MyClass::X; 
+0

"using" 'ı nereye koymaya çalışıyorsunuz? Bir sınıfın içinde mi yoksa? –

+0

[enum ile bildirimi kullanarak?] Olası bir kopyası (http://stackoverflow.com/questions/438192/using-declaration-with-enum) –

+0

@Kiril, İçinde OLMAYAN farklı bir sınıfta bulunan bir yöntemin içinde Foo ad alanı. – Jmoney38

cevap

1

C++ 03, enum türlerini tam olarak desteklemiyor, ancak bir MSVC uzantısı. C++ 0x bu standardı yapacak ve C++ 0x içinde using ve enum yapabildiğinize inanıyorum. Ancak, C++ 03'te, sorununun çözülebileceğine inanmıyorum.

+0

Ne dedi ki :) – ptpaterson

4

... tamamen her şeyi beyan etmek zorunda can sıkıcı hale gelir, ancak tuş vuruşlarını tasarruf istiyorsanız deneyebilirsiniz bunun yerine typedef kullanarak.

typedef Foo::MyClass::MyEnum MyClassEnum; 

Bu arada, your question has been asked on Stack Overflow before gibi görünüyor. Bu sorunun cevabı Gönderen: A sınıfı bir ad alanı tanımlamıyor

, nedenle "kullanılarak" burada geçerli değildir.

+0

Sanırım nokta ('.')' '' aftert 'MyClass' –

+0

@Kiril ile değiştirmelisiniz: Bunu işaretlediğiniz için teşekkürler. Sanırım kopyalama ve yapıştırma için aldığım bu. :) –

+0

Bu yazıyı yayınlamadan önce okudum, ancak sınıfın bir ad alanı içinde olduğu ve bir ad alanı dışındaki istemcinin söz konusu özel enum içermek istediği kaygımı ele almıyor gibi görünüyor. Sayımın otomatik olarak yerel kapsama getirilmeyeceğini anlıyorum, bu iyi. – Jmoney38

1

Çok fazla uğraştıktan sonra derlemek için aşağıdakileri aldım. Yazmadığın en yakın adresin olacağını düşünüyorum.

namespace Foo { 
    class MyClass { 
     public: 
      enum MyEnum { X, Y, Z }; 
    }; 
}; 

namespace Foo2 { 
    using Foo::MyClass; 

    class AnotherClass { 
     public: 

      AnotherClass(){ 
       MyClass::MyEnum value = MyClass::X; 
      } 
    }; 
}; 

int main(){ 

    return 1; 
} 

Ayrıca temel sınıf olarak Sınıfım kullanabilirsiniz ama bunun Yapmak istediğiniz şey şüphe ediyorum.

namespace Foo2 { 
    using namespace Foo; 
    class AnotherClass : public MyClass{ 
     public: 
      AnotherClass(){ 
       MyEnum value = X; 
      } 
    }; 
}; 

Bu ayrıca bazı iyi bilgilere de sahiptir. namespaces for enum types - best practices

+0

Kendimden atladım ve sonra ne yaptığınızı yanlış anladım. – ptpaterson

+0

Girdi için teşekkürler - Ancak, dediğiniz gibi, MyCnum'u MyClass'ın kapsam operatörünü kullanmadan kullanmayı tercih ederim.Ancak çaba için puan :-) – Jmoney38