2012-08-29 7 views
126

मान लीजिए हम एक enum की तरह है निम्नलिखित:सी में enums का उपयोग कैसे करें ++

enum Days {Saturday, Sunday, Tuesday,Wednesday, Thursday, Friday}; 

मैं इस enum का एक उदाहरण बना सकते हैं और एक उचित मूल्य के साथ प्रारंभ करना चाहते हैं, तो मैं कार्य करें:

Days day = Days.Saturday; 

अब मैं एक मौजूदा enum मूल्य के साथ अपने चर या उदाहरण जाँच करना चाहते हैं, तो मैं कार्य करें:

if (day == Days.Saturday) 
{ 
    std::cout<<"Ok its Saturday"; 
} 

कौन सा मुझे एक संकलन त्रुटि देता है:

if (day == Days.Saturday)   //Causes compilation error 

और

if (day == Saturday) 

:

error: expected primary-expression before ‘.’ token

तो स्पष्ट होना करते हुए कहा कि दोनों के बीच क्या अंतर है?

इन दोनों वास्तव में क्या संदर्भित करते हैं, उसमें ठीक है और एक संकलन त्रुटि का कारण बनता है?

+12

यह गूगल के लिए 'सी में enums का उपयोग कर ++ "उचित सिंटैक्स लगाने के लिए मुश्किल नहीं है। यह ध्यान देने योग्य है कि सी ++ 11 ने enums के साथ-साथ अंतर्निहित प्रकार निर्दिष्ट करने की क्षमता भी बनाई है। – chris

+1

मुझे पता है, मुझे पता है कि यह मुझे त्रुटि क्यों दे रहा है! – Breeze

+0

इसकी बुधवार यहां। आपके पास सी ++ कंपाइलर के लिए बहुत सी वाक्यविन्यास त्रुटियां हैं। 'एनम' से शुरू हो रहा है। –

उत्तर

221

इस कोड गलत है:

enum Days { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday}; 
Days day = Days.Saturday; 
if(day == Days.Saturday) 

क्योंकि दिन एक गुंजाइश, और न ही वस्तु नहीं है। यह एक प्रकार है। और प्रकार के पास सदस्य नहीं होते हैं। आपने जो लिखा है वह std::string.clear के बराबर है। std::string एक प्रकार है, इसलिए आप . पर इसका उपयोग नहीं कर सकते। आप कक्षा के इंस्टेंस पर . का उपयोग करते हैं।

दुर्भाग्य से, enums जादुई हैं और इसलिए समानता वहां रुक जाती है। क्योंकि कक्षा के साथ, आप सदस्य फ़ंक्शन में पॉइंटर प्राप्त करने के लिए std::string::clear कर सकते हैं, लेकिन सी ++ 03, Days::Sunday में अमान्य है। (जो दुखी है)। ऐसा इसलिए है क्योंकि सी ++ (कुछ हद तक) पीछे सी के साथ संगत है, और सी के पास कोई नामस्थान नहीं था, इसलिए वैश्विक नामस्थान में गणनाएं होनी चाहिए। तो वाक्य रचना बस है:

enum Days { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday}; 
Days day = Saturday; 
if(day == Saturday) 

सौभाग्य से, Mike Seymour का मानना ​​है कि इस सी ++ 11 में संबोधित किया गया। enum से enum class बदलें और इसे अपना दायरा मिल जाता है; इसलिए Days::Sunday केवल मान्य नहीं है, लेकिन Sunday तक पहुंचने का तरीका है। खुशी के दिन!

+183

सौभाग्य से, आपकी शिकायत सी ++ 11 में संबोधित की गई है। 'Enum' को 'enum class' में बदलें और इसे अपना दायरा मिल जाता है; इसलिए 'दिन :: रविवार' केवल वैध नहीं है, लेकिन 'रविवार' तक पहुंचने का एकमात्र तरीका है। खुशी के दिन! –

+7

को सी ++ त्रुटि संदेशों से प्यार होना चाहिए ... वे साबित करते हैं कि अच्छी प्रतिक्रिया देने के लिए भाषा बोझिल है। मैं इसे 'प्राथमिक अभिव्यक्ति' लेता हूं एक वस्तु या दायरा या कुछ अन्य चीज जो एक प्रकार नहीं है। शायद एक प्रकार एक 'माध्यमिक अभिव्यक्ति' है। और सी ++ डेवलपर क्या 'डॉट ऑपरेटर' कह सकता है सी ++ कंपाइलर केवल 'टोकन' कह सकता है। जब त्रुटि संदेशों को समझना मुश्किल हो जाता है तो मुझे लगता है कि भाषा के साथ कुछ गड़बड़ है। – Travis

+3

@ ट्राविस: http://en.cppreference.com/w/cpp/language/expressions#Primary_expressions। एक अभिव्यक्ति अभिव्यक्ति में पहली बात है, आमतौर पर एक नाम या चर या शाब्दिक। दूसरे भाग के लिए, मुझे '' 'के बीच एक बड़ा अंतर नहीं दिख रहा है। टोकन' और 'डॉट ऑपरेटर', यह एक टोकन के अलावा और ऑपरेटर नहीं है, और यह किसी नाम के बजाय सटीक प्रतीक दिखाता है। –

16

यह आपके enum चर घोषित करने और यह तुलना करने के लिए पर्याप्त होगा:

इस के
enum Days { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday}; 
Days day = Saturday; 
if(day == Saturday){ 
    std::cout<<"Ok its Saturday"; 
} 
+0

कहने में गलत क्यों है अगर (दिन == दिन। शनिवार)? वे वही होना चाहिए, तो संकलक इसके बारे में शिकायत क्यों कर रहा है? – Breeze

+1

@ होससेन आपके enum में घोषित मूल्य वर्ग या संरचना सदस्य चर के समान व्यवहार नहीं करते हैं। – mathematician1975

+2

@ होसेनिन का उपयोग करने के लिए यह सही वाक्यविन्यास नहीं है: क्योंकि 'दिन' कोई दायरा नहीं है, न ही ऑब्जेक्ट। यह एक प्रकार है। और प्रकार _themselves_ में सदस्य नहीं हैं। 'std :: string.clear' भी उसी कारण से संकलित करने में विफल रहता है। –

15

बहुत आप त्रुटियों संकलन देना चाहिए।

// note the lower case enum keyword 
enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday }; 
अब

, Saturday, Sunday, आदि उच्च-स्तरीय नंगे स्थिरांक के रूप में इस्तेमाल किया जा सकता है, और Days एक प्रकार के रूप में इस्तेमाल किया जा सकता:

Days day = Saturday; // Days.Saturday is an error 

और इसी तरह बाद में, परीक्षण करने के लिए:

if (day == Saturday) 
    // ... 

ये enum मूल्यों नंगे स्थिरांक की तरह हैं - वे संयुक्त राष्ट्र -scoped रहे - कंपाइलर से थोड़ा अतिरिक्त सहायता के साथ: (जब तक आप C++ 11 enum कक्षा का उपयोग नहीं कर रहे हैं) वे उदाहरण के लिए ऑब्जेक्ट या स्ट्रक्चर सदस्यों की तरह encapsulated नहीं हैं, और आप उन्हें के रूप में संदर्भित नहीं कर सकतेDays के सदस्य।

आप C++11 साथ जो खोज रहे हैं, जो परिचय एक enum class होगा:

enum class Days 
{ 
    SUNDAY, 
    MONDAY, 
    // ... etc. 
} 

// ... 

if (day == Days::SUNDAY) 
    // ... 

ध्यान दें कि यह सी ++ तरीके के एक जोड़े में सी से थोड़ा अलग है, एक है कि सी की आवश्यकता है enum कीवर्ड जब एक चर घोषित करने के उपयोग:

सी में
// day declaration in C: 
enum Days day = Saturday; 
+0

मैंने सवाल अपडेट किया है, मुझे लगता है कि यह अब स्पष्ट है कि मैं ठीक कहां हूं :) वैसे धन्यवाद :) – Breeze

2

Enums ++ नाम आप उन्हें दे, जब आप अपने enum-मूल्यों की घोषणा के नीचे दब पूर्णांकों की तरह हैं (यह एक परिभाषा केवल एक संकेत है कि यह कैसे नहीं है काम करता है)।

लेकिन वहाँ अपने कोड में दो त्रुटियाँ हैं:

  1. वर्तनी enum सभी लोअर केस
  2. आप शनिवार से पहले Days. जरूरत नहीं है।
  3. इस enum एक वर्ग में घोषित किया जाता है, तो का उपयोग if (day == YourClass::Saturday){}
+0

ओपी ने वर्तनी/मामला 16 बदल दिया शुरुआती पोस्ट के बाद कुछ मिनट ([संशोधन 1] (http://stackoverflow.com/revisions/12183008/1) [संशोधन 2] (http://stackoverflow.com/revisions/12183008/2))। –

3

दुःख की बात है enum के तत्वों 'वैश्विक' कर रहे हैं। आप day = Saturday करके उन्हें एक्सेस करते हैं। इसका मतलब है कि आपके पास enum A { a, b } ; और enum B { b, a } ; नहीं हो सकते हैं क्योंकि वे संघर्ष में हैं।

+2

जब तक आप सी ++ 11 में 'एनम क्लास' का उपयोग नहीं करते हैं, वह है। इससे पहले, आपको डमी कक्षाएं बनाना होगा। – chris

+0

सी ++ 11 नहीं पता। मुझे लगता है कि सवाल सी ++ को संदर्भित करता है। हां, कक्षाओं या नामस्थानों का उपयोग करके चाल चल जाएगी। – Grzegorz

+0

@Gzezegorz: मुझे लगता है कि क्रिस नए पेश किए गए एनम कक्षा का जिक्र कर रहा है जो दृढ़ता से टाइप किए गए enums प्रदान करता है। – Breeze

6

बजाय अगर-बयान, enums खुद को अच्छी तरह से उधार देने के बयान

मैं स्तर बिल्डर मैं अपने खेल के लिए निर्माण कर रहा हूँ में कुछ enum/स्विच संयोजनों का उपयोग स्विच करने के लिए के एक समूह का उपयोग कर।

संपादित करें: एक और बात, मुझे लगता है कि आप सिंटैक्स समान चाहते हैं;

if(day == Days.Saturday) 
etc 

आप C++ ऐसा कर सकते हैं:

EnumAppState.h

#ifndef ENUMAPPSTATE_H 
#define ENUMAPPSTATE_H 
enum eAppState 
{ 
    STARTUP, 
    EDIT, 
    ZONECREATION, 
    SHUTDOWN, 
    NOCHANGE 
}; 
#endif 

Somefile.cpp

#include "EnumAppState.h" 
eAppState state = eAppState::STARTUP; 
switch(state) 
{ 
case STARTUP: 
    //Do stuff 
    break; 
case EDIT: 
    //Do stuff 
    break; 
case ZONECREATION: 
    //Do stuff 
    break; 
case SHUTDOWN: 
    //Do stuff 
    break; 
case NOCHANGE: 
    //Do stuff 
    break; 
} 
:

if(day == Days::Saturday) 
etc 

यहाँ एक बहुत ही सरल उदाहरण है

+0

अच्छी बात यह है कि यदि आप किसी मामले को डालने से चूक गए हैं तो संकलक आपको बताएंगे। – chris

+0

क्या आप इस मामले में कक्षा enum का उपयोग नहीं करना चाहिए? – Breeze

+1

enum सी ++ में बस एक डेटाटाइप है, इसलिए मैंने एक .h फ़ाइल में ऊपर की तरह एक enum घोषित किया है, और उसके बाद उस फ़ाइल सहित जो भी .cpp फ़ाइल में आप इसका उपयोग करना चाहते हैं, वह आपको enum तक पहुंच प्रदान करेगा। बस ध्यान दिया कि मैं अपने .cpp उदाहरण में # शामिल करने के लिए भूल गया। संपादन। –

-12

सबसे पहले, एनम में 'ई' बनाएं, 'ई' को कम मामले के रूप में बनाएं।

दूसरा, 'दिन। शनिवार' में दूसरा, ड्रॉप प्रकार का नाम 'दिन'।

तीसरा ... खुद को एक अच्छी सी ++ पुस्तक खरीदें।

5

यह C++ काम नहीं करना चाहिए:

Days.Saturday 

दिन एक गुंजाइश या उद्देश्य यह है कि सदस्यों को आप डॉट ऑपरेटर के साथ उपयोग कर सकते हैं शामिल नहीं है। यह वाक्यविन्यास सिर्फ एक सी # -ism है और सी ++ में कानूनी नहीं है।

माइक्रोसॉफ्ट लंबे समय से एक सी ++ विस्तार है जो आपको गुंजाइश ऑपरेटर का उपयोग पहचानकर्ता एक्सेस कर सकता है बनाए रखा है:

enum E { A, B, C }; 

A; 
E::B; // works with Microsoft's extension 

लेकिन इस से पहले सी ++ 11 अमानक है। सी ++ 03 में एक enum में घोषित पहचानकर्ता केवल enum प्रकार के रूप में एक ही दायरे में मौजूद हैं।

A; 
E::B; // error in C++03 

सी ++ 11 यह कानूनी enum नाम के साथ enum पहचानकर्ता अर्हता प्राप्त करने के लिए बनाता है, और यह भी enum कक्षाएं, जो बजाय उन्हें आसपास के दायरे में रखने की पहचानकर्ता के लिए एक नया गुंजाइश बनाने परिचय देता है।

A; 
E::B; // legal in C++11 

enum class F { A, B, C }; 

A; // error 
F::B; 
8

आप अपनी इच्छानुसार स्कोप उपयोग करने के लिए एक चाल का उपयोग कर सकते हैं, बस इस तरह से enum की घोषणा:

struct Days 
{ 
    enum type 
    { 
     Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday 
    }; 
}; 

Days::type day = Days::Saturday; 
if (day == Days::Saturday) 
1

मुझे लगता है कि आपके जड़ मुद्दा :: के बजाय . का उपयोग, जो नाम स्थान का उपयोग करेगा।

प्रयास करें:

enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday}; 
Days day = Days::Saturday; 
if(Days::Saturday == day) // I like literals before variables :) 
{ 
    std::cout<<"Ok its Saturday"; 
} 
1

जबकि सी ++ (C++ 11 को छोड़कर) है enums, उनमें मान "लीक" कर रहे हैं ग्लोबल नेम स्पेस में।
आप उन्हें लीक (और enum प्रकार का उपयोग करने की जरूरत नहीं) नहीं करना चाहते हैं, पर विचार करें:

class EnumName { 
    public: 
     static int EnumVal1; 
     (more definitions) 
}; 
EnumName::EnumVal1 = {value}; 
if ([your value] == EnumName::EnumVal1) ... 
1

आप प्रबलता से टाइप किये Enumerations, एक सुविधा के लिए देख रहे हैं सी ++ 11 मानक में उपलब्ध है। यह गुंजाइश मूल्यों के साथ कक्षाओं में गणना बदल जाता है।

अपने खुद के कोड उदाहरण का उपयोग करना, यह है:

enum Days {Saturday, Sunday, Tuesday,Wednesday, Thursday, Friday}; 
    Days day = Days::Saturday; 

    if (day == Days::Saturday) { 
    cout<<" Today is Saturday !"<<endl; 
    } 
    //int day2 = Days::Sunday; // error ! invalid 

:: का उपयोग करता है, तो एक सी ++ मानक पहले सी ++ 11 को लक्षित के रूप में enumerations के लिए accessors असफल हो जायेगी। लेकिन कुछ पुराने कंपाइलर्स इसका समर्थन नहीं करते हैं, साथ ही कुछ आईडीई सिर्फ इस विकल्प को ओवरराइड करते हैं, और पुराने सी ++ एसडीडी सेट करते हैं।

आप जीसीसी का उपयोग कर रहे हैं, तो सक्षम सी + के साथ 11 -std = C++ 11 या -std = gnu11

खुश रहें!

1

यदि आप अभी भी सी ++ 03 का उपयोग कर रहे हैं और enums का उपयोग करना चाहते हैं, तो आपको नामस्थान के अंदर enums का उपयोग करना चाहिए। उदाहरण के लिए:

namespace Daysofweek{ 
enum Days {Saturday, Sunday, Tuesday,Wednesday, Thursday, Friday}; 
} 

आप नाम स्थान की तरह बाहर enum उपयोग कर सकते हैं,

Daysofweek::Days day = Daysofweek::Saturday; 

if (day == Daysofweek::Saturday) 
{ 
    std::cout<<"Ok its Saturday"; 
} 

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

  • कोई संबंधित समस्या नहीं^_^