2013-10-09 19 views
5

Kodum içinde birkaç yerde enum kullanmaya başlamak istiyorum, ancak derleyiciden önceki beyanlarla ilgili bir sorunum var. Şu anda enumların nasıl bildirildiği en mantıklı:Kapsamlı enumlar için en iyi alternatif - Ön C++ 11

Böyle bir durumdan kaçınmanın en iyi yolu nedir?

enum score_methods_t {NONE,ABS_FROM_PERFECT,ERROR_SQUARED}; 
enum scale_methods_t {NONE,CASES_MULTIPLIER,RANGE_MULTIPLIER}; 

Sadece her şeyi benzersiz mi, yoksa alan adıyla mı kapsamalıyım? Bir sınıf içinde enum türlerini kullanmak istiyorum ve NONE en açıklayıcı isim!

Ayrıca enumların çarpışmasının sebebi de aslında thay sadece kaputun altındaki #defines'tir.

cevap

10

, ben kullandı:

struct score_methods { enum type { NONE, ABS_FROM_PERFECT, ERROR_SQUARED }; }; 

hangi gerçek enum türünde ve score_methods::NONE vb. için her zaman score_methods::type var demektir veya değerler.

Ayrıca, hayır, yalnızca farklı ad alanlarına veya sınıflara (yukarıda görüldüğü gibi) ekleyebileceğiniz gibi, bunlar yalnızca #define s değildir ve bu, ön işlemcinin yapamadığı/tutamayacağı bir şeydir.

+0

Bu yaklaşımı kullanarak, değişken türlerini, sınıf üyelerini, enum türünün işlev bağımsız değişkenlerini nasıl beyan edersiniz? – ulidtko

+0

@ulidtko ':: type',' score_methods :: type' içinde olduğu gibi. Bu, C++ 11 öncesi ödeme bedeli. :) –

+0

Evet ... Aynı enum türünde bir "score_methods :: value" üyesi bildirebilir ve örtülü struct assignment operatörünü kullanabilir miyiz? Bu bana daha güvenli bir şekilde görünüyor. – ulidtko

4

Hep bir sınıfta Çeteleler koyabilirsiniz:

struct Score 
{ 
    enum Method { None, AbsFromPerfect, ErrorSquared }; 
}; 

Kullanımı: Ön C++ 11 zamanlarda

void foo(Score::Method m); 

foo(Score::None); 
+0

Bu, "enum class" gibi güvenilir değildir, değil mi? Yani 'foo (15)' gibi yazım hataları yazdı ve iyi bir derleme yaptı. – ulidtko

+0

@ulidtko: Hayır, [bu derleme olmaz] (http://ideone.com/6wWorj), enumlar için alışılmış dönüşüm kuralları nedeniyle. –