2011-07-06 15 views
7

निम्नलिखित सी ++ परिभाषाओं के साथ:मैं गलत enum तत्व क्यों निर्दिष्ट नहीं कर सकता, लेकिन गलत enum तत्व के खिलाफ तुलना कर सकते हैं?

enum EnumA { 
    EA_Element = 1 
}; 

enum EnumB { 
    EB_Element = 10 
}; 

निम्नलिखित कोड संकलन नहीं और है कि केवल समझ में आता है:

EnumA variable; 
variable = EB_Element; // won't compile 

लेकिन निम्नलिखित कोड संकलित करता है:

EnumA variable = EA_Element; 
if(variable == EB_Element) { //will compile 
} 

हालांकि यह कोई समझ नहीं ले सकता है - विभिन्न enums की तुलना की जाती है और इस तरह की कोड गलत है।

इन समान रूप से समान स्थितियों को सी ++ में अलग-अलग क्यों संभाला जाता है?

+2

इच्छा को संकलित नहीं करना चाहिए: 'variable = EB_Element;'? – Donotalo

+0

@ डोनोटलो: फिक्स्ड, धन्यवाद। – sharptooth

उत्तर

4

यह तर्क सही है, मैंने देखा है कि enum प्रकार किसी भी enum प्रकार से तुलना की जा सकती है। ऐसा इसलिए है क्योंकि तुलनात्मक उद्देश्य के लिए, enum चर और मान को अभिन्न प्रकार में परिवर्तित किया जाना चाहिए (जैसे int)। कुछ कंपाइलर raise the warning करते हैं।

इस तरह के तर्क unsigned int, int, size_t आदि के बीच तुलना के लिए सच धारण कर सकते हैं, लेकिन हो सकता है वे सभी एक ही कारण के लिए एक संकलक चेतावनी तक सीमित हैं।

हालांकि, इस समस्या को enum class के साथ सी ++ 0x में संबोधित किया गया है (उन्होंने संगतता बनाए रखने के लिए मौजूदा enum व्यवहार को नहीं बदला है)।

2

यह असंभव नहीं है, यह सिर्फ इतना है कि आपका कंपाइलर उन्हें दो अलग-अलग डेटा प्रकार मानता है जब वे दोनों पूर्णांक होते हैं। तो एक साधारण टाइपकास्ट इस मुद्दे को हल करेगा।

EnumA variable; 
variable = (EnumA)EB_Element; 
+1

कास्ट की आवश्यकता नहीं है। – Donotalo

+0

मैं नहीं देखता क्यों नहीं। – Drake

+0

मेरी टिप्पणी संपादित करने से पहले थी। – Donotalo

6

क्योंकि यह संकलन होगा "डिफ़ॉल्ट enums तक अंकगणितीय ऑपरेशनों के लिए पूर्णांक में बदल रही हैं।" (इन: सी ++ प्रोग्रामिंग भाषा)

1

सी ++ में आपका स्वागत है!

कुछ के लिए भी मजेदार इस प्रयास करें:

#include <string> 

int main(int argc, const char *argv[]) 
{ 
    std::string s; 
    s = 3.141592654; 
    return 0; 
} 

यह क्यों संकलित करता है? कारण यह है कि भाषा के नियम ऐसा कहते हैं।

इस भयानक मामले में इस उदाहरण के संकलन के बारे में "आधिकारिक" स्पष्टीकरण यह है कि std::string::operator+=(char) (आईएमओ ठीक और व्यावहारिक दृष्टिकोण से तार्किक) और "इसलिए" char से असाइनमेंट (आईएमओ अजीब गैर- -sequitur)। लेकिन चार्स इनट्स (अजीब, लेकिन सी विरासत) हैं और युगल को अंतर्निहित रूप से इनट्स (अजीब, लेकिन सी विरासत) में परिवर्तित किया जा सकता है। इसलिए सी ++ में यह एक स्ट्रिंग को डबल असाइन करने के लिए अजीब (लेकिन कानूनी) है।

यदि आपको पता नहीं था तो बुरा मत मानना, अधिकांश सी ++ प्रोग्रामर जो मैंने दिखाए हैं, इस बात से परेशान थे कि क्यों ऐसा बकवास संकलित होता है और अन्य अर्थात् या कंपाइलर कीड़े के बारे में सोचा जाता है।

आपके प्रश्न के मामले में कारण यह है कि कुछ संदर्भों में इंट्स (जैसे उपयोग मामलों पर विरासत की वजह से) हैं, लेकिन किसी अन्य संदर्भ में इनट्स की तरह नहीं। यह बेतुका है लेकिन यह मानक जनादेश है।

यदि आप इस स्पष्ट रूप से तर्क की अनुपस्थिति से असहज महसूस करते हैं तो कृपया याद रखें कि सी ++ ज्यादातर लंबे इतिहास का परिणाम है और यहां तक ​​कि एक समिति (!) भी तर्क है कि वास्तव में इसके साथ बहुत कुछ नहीं करना है। इसका यह भी अर्थ है कि कोई सी ++ का अध्ययन करने से बचने के लिए तर्क का उपयोग नहीं कर सकता है: इससे कोई फर्क नहीं पड़ता कि आप कितने बुद्धिमान हैं, आप ऐतिहासिक दुर्घटनाओं और समिति के राजनीतिक निर्णयों का अनुमान लगा सकते हैं।

उच्च सी ++ जटिलता, कई स्थानों में तर्क के इस अभाव और undefined behavior daemons बजाय runtime error angels की उपस्थिति भी क्या IMO मूल रूप से है प्रयोगों के द्वारा C++ सीखने बाहर नियम।

एक अच्छी किताब (या कुछ) चुनें और इसे कवर करने के लिए कवर (उन्हें) कवर करें ... दुर्भाग्य से कोई दूसरा रास्ता नहीं है। मेरे सुझाव हैं: "सी ++ प्रोग्रामिंग भाषा" (स्ट्रॉस्ट्रप), "प्रभावी सी ++" & "अधिक प्रभावी सी ++" (मेयर्स), "सी ++ एफएक्यू" (क्लाइन/लोमो/गिरौ)।

सी ++ अपने लिए एक सुंदर शक्तिशाली और अच्छा हथियार है, लेकिन गलत पक्ष से इसका संपर्क करें और यह आपके दुःस्वप्न का सबसे खराब हो सकता है। यह मानते हुए कि आप तर्क का उपयोग कर इसे समझ सकते हैं एक गलत दृष्टिकोण है (और इसलिए नहीं क्योंकि आपका तर्क कमजोर है, लेकिन क्योंकि सी ++ सिर्फ तर्क नहीं है)।

+0

-1, आपने इस सवाल का जवाब नहीं दिया है, उदाहरण के इस सवाल पर कोई असर नहीं है, और तर्क के साथ सब कुछ करने के लिए सब कुछ है। –

+0

उत्तर दोनों मामलों के लिए पहले से ही था (क्योंकि मानक ऐसा कहता है) और मैंने सोचा कि सी ++ को समझते समय तर्क की शक्ति को अधिक महत्व देने की गलती के बारे में चेतावनी देना महत्वपूर्ण था। यदि आपने इसे बेहतर महसूस किया है तो मैंने वैसे भी एक और विस्तृत स्पष्टीकरण जोड़ा है। मुझे सी ++ पसंद है लेकिन यदि आप कहते हैं कि यह एक तार्किक भाषा है तो आईएमओ आप अभी भी फैनबॉय मंच में हैं। काम करने वाले सी ++ कोड की कुछ सौ हजार लाइनें लिखने के बाद वापस आएं और चलो फिर से बात करें। – 6502

+0

ओह, मैंने सी ++ के अपने उचित हिस्से से अधिक लिखा है, और मैं एक प्रशंसक नहीं हूं। 'S = 3.14159 के बारे में; हां यह बदसूरत है। हालांकि, फ्लोटिंग पॉइंट से पूर्णांक तक प्रत्येक चरण को चार से असाइनमेंट तक ठीक है। आप सहमत हैं '= some_char; 'ठीक है। ध्यान दें कि 's = = some_char;' एक खाली स्ट्रिंग के मामले में 's = some_char; 'जैसा ही प्रभाव है - इसलिए' ऑपरेटर = (char) 'प्रदान करना सही अर्थ बनाता है। आपका उदाहरण उदाहरण देता है कि संगठन कोड समीक्षा क्यों करते हैं। सिर्फ इसलिए कि कोड का एक हिस्सा पूरी तरह मान्य है इसका मतलब यह नहीं है कि यह उच्च स्वर्ग तक गंध नहीं करता है। –

संबंधित मुद्दे