2011-05-09 20 views
5
enum options {Yes,No}; 

class A{ 
    int i; 
    string str; 
    options opt; 
}; 


int main{ 
    A obj; 
    obj.i=5; 
    obj.str="fine"; 
    obj.opt="Yes"; // compiler error 
} 

const char * nasıl seçilir?Numaraları belirtilen türlere atama

obj.opt="Yes"; 

girişimleri C++ automagicallylar sizin için dönüştürmez bir enum türü, bir dize hazır bilgi (bambaşka tipi) atamak için:

cevap

13

Sadece

obj.opt=Yes; 

Bu kod yok.

Seçmek için const char * nasıl seçilir?

, benim çeteleler bu gibi dönüşümler yapmak için etrafında serbest işlevler kümesi tutmak için yani bir isim alanı içinde benim Çeteleler sarmak edeceğiz ve çalışma için bazı işlevleri sağlamak gibi Bunu manuel yapmanız gerekecek onlarla: Artık

namespace options 
{ 
    enum Enum {Yes,No,Invalid}; 
    Enum FromString(const std::string& str); 
    // might also add ToString, ToInt, FromInt to help with conversions 
} 

Enum FromString(const std::string& str) 
{ 
    if (str == "Yes") 
    { 
     return Yes   
    } 
    else if (str == "No") 
    { 
     return No; 
    } 
    return Invalid; //optionally throw exception 
} 

yapabileceğiniz:

class A{ 
    int i; 
    string str; 
    options::Enum opt; // notice change here 
}; 

... 


obj.opt=options::FromString("Yes"); 

Yani görebilirsiniz C++ çeteleler muhtemelen diğer dillerdeki size çeteleler tüm çan ve ıslık vermeyin. Bir şeyi manuel olarak dönüştürmeniz gerekecek.

+0

Ben, sadece hata ayıklama günlükleri okumak gibi geçmek kolaydır (hepsi kez sağlanmaktadır sadece bu yüzden bir makro enum oluşturma sarılmış ettik aslında) ve dize dönüştürme işlevlerine/sağlayabileceği parametreler (ayrıştırılacak). –

1

Bunu yapamazsınız. Bazı dize karşılaştırmalarını kullanmanız ve ayarlamanız gerekecektir.

3

Numaralamalar dizeleri değil, bir enum değeri bir dize olmadığından sadece

obj.opt = Yes; 
3

değer verir. Bu doğrudur: Senin durumunda

int main{ 
    A obj; 

    obj.opt=Yes; 
} 
1

sen const char* için enum "dönüştürmek" olabilir. İhtiyacınız olan her şey makro oluşturmak. Örneğin: #define ENUM_TO_CSTR(x) #x ve ardından obj.opt=ENUM_TO_CSTR(Yes).

Bu makro, ilettiğiniz her şeyi C benzeri dizeye dönüştürür. Değişken değeri değil, sadece adını değiştirmez!

int x = 10; cout << ENUM_TO_CSTR(x) << endl;

öyle kullanırken dikkatli olmak, ekranda x (değil 10) yazdırmak Will!

0

"Evet" atamaya çalıştığınızda, enum seçeneklerinden enum sabitini değil, bir dize değeri atamaya çalıştığınız anlamına gelir.

obj.opt = Yes; 

obj dan opt değerini yazdırmayı deneyin: Yerine sözdizimini kullanın enum endeksleri 0. Evet başlamak beri, Sen 0 olarak çıktı alacak

cout << obj.opt; 

0 ve No 1'dir .