2009-08-19 7 views
5

ठीक है, मैं सी ++ में नया हूं। मुझे बजेर्ने की किताब मिली, और मैं कैलकुलेटर कोड का पालन करने की कोशिश कर रहा हूं।सी ++ enum से

हालांकि, संकलक इस खंड के बारे में त्रुटि बाहर थूकना है:

:

calc.cpp:42: error: invalid conversion from ‘char’ to ‘token_value’ 

token_value एक enum कि जैसा दिखता है:

token_value get_token() 
{ 
    char ch; 

    do {  // skip whitespace except '\n' 
     if(!std::cin.get(ch)) return curr_tok = END; 
    } while (ch!='\n' && isspace(ch)); 

    switch (ch) { 
     case ';': 
     case '\n': 
      std::cin >> WS;  // skip whitespace 
      return curr_tok=PRINT; 
     case '*': 
     case '/': 
     case '+': 
     case '-': 
     case '(': 
     case ')': 
     case '=': 
      return curr_tok=ch; 
     case '0': case '1': case '2': case '3': case '4': case '5': 
     case '6': case '7': case '8': case '9': case '.': 
      std::cin.putback(ch); 
      std::cin >> number_value; 
      return curr_tok=NUMBER; 
     default:   // NAME, NAME=, or error 
      if (isalpha(ch)) { 
       char* p = name_string; 
       *p++ = ch; 
       while (std::cin.get(ch) && isalnum(ch)) *p++ = ch; 
       std::cin.putback(ch); 
       *p = 0; 
       return curr_tok=NAME; 
      } 
      error("bad token"); 
      return curr_tok=PRINT; 
} 

त्रुटि इसे बाहर थूकना है यह है

enum token_value { 
    NAME,  NUMBER,  END, 
    PLUS='+', MINUS='-', MUL='*', DIV='/', 
    PRINT=';', ASSIGN='=', LP='(', RP=')' 
}; 
token_value curr_tok; 

मेरा सवाल है, मैं ch (cin से), संबंधित enum में कैसे परिवर्तित करूं मूल्य?

उत्तर

7

आप परोक्ष एक enum को char से डाली नहीं कर सकते हैं - आप इसे स्पष्ट रूप से क्या करना है:

return curr_tok = static_cast<token_value> (ch); 

लेकिन सावधान रहें!

curr_tok = static_cast<token_value>(ch); 

कारण यह है कि यह एक पूर्णांक प्रकार परिवर्तित करने के लिए खतरनाक है है: अपने enum उसका कोई भी मान अपने char से मेल खाते हैं, तो यह परिणाम :)

1

आप एक स्पष्ट कलाकारों की जरूरत का उपयोग करने के लिए मुश्किल हो जाएगा एक enum के लिए। यदि मान enum के लिए मान्य नहीं है तो व्यवहार अपरिभाषित है। तो भाषा आपको एक अंतर्निहित रूपांतरण के साथ गलती से ऐसा करने नहीं देती है। स्पष्ट रूपांतरण का अर्थ यह है कि "मुझे पता है कि मैं क्या कर रहा हूं, और मैंने जांच की है कि मान मान्य है"।

-1
return curr_tok=(token_value)ch; 
+2

सी – ChrisW

+0

के बजाय सी ++ का उपयोग करते समय नए स्टाइल कास्ट (यानी 'static_cast' इत्यादि) का उपयोग करना पसंद करें या यदि आप सी-स्टाइल कास्ट्स का उपयोग करना चाहते हैं, तो उन्हें कन्स्ट्रक्टर सिंटैक्स का उपयोग करके रडार के नीचे छीन लें: 'curr_tok = टोकन_वल्यू (सी) '। आपकी शैली मार्गदर्शिका के लेखक एकल-तर्क रचनाकारों पर प्रतिबंध लगाने से पहले दो बार सोच सकते हैं, भले ही उन्हें केवल सी-स्टाइल कास्ट का उपयोग करके बुलाया जा सके। ;-) –

4

ध्यान दें कि समाधान दिया (यानी एक static_cast उपयोग करने के लिए आपको बता) काम सही ढंग से सिर्फ इसलिए जब enum प्रतीकों को परिभाषित किया गया, प्रतीकों (जैसे PLUS) एक भौतिक/संख्यात्मक मान जो करने के लिए होता है करने के लिए परिभाषित किया गया अंतर्निहित चरित्र मान के बराबर हो (उदाहरण के लिए '+')।

एक और तरीका है निर्दिष्ट करने के लिए स्विच/मामला बयानों का उपयोग किया जाएगा (एक डाली का उपयोग किए बिना) स्पष्ट रूप से enum मूल्य हर किरदार के मूल्य के लिए लौट आए, जैसे:

case '*': 
     return curr_tok=MUL; 
    case '/': 
     return curr_tok=DIV; 
0

मुझे लगता है कि मैं करने की कोशिश नहीं होता स्पष्ट रूप से enum प्रतीकों के मान सेट करें और इसके बजाय अपने स्विच स्टेटमेंट में प्रत्येक प्रतीक के लिए एक केस लिखें। अगर ऐसा कुछ गलत हो जाता है और प्रत्येक प्रतीक के लिए एक केस लिखने का प्रदर्शन लागत इतना कम हो जाता है, तो यह संभवतः डीबग करना कठिन होगा, जब तक कि आप किसी भी तरह के बेहद कम अंत एम्बेडेड सिस्टम के लिए लिख रहे हों और शायद अभी भी इसके लायक नहीं है)।