2009-02-05 7 views
57

मैं अपनी कक्षा में से किसी एक विधि के अंदर enum के पूर्ण योग्य नाम का उपयोग कर रहा हूं। लेकिन मुझे संकलक चेतावनी मिल रही है जो "चेतावनी C4482: गैर मानक विस्तार का उपयोग किया गया: enum 'Foo' योग्य नाम में उपयोग किया जाता है"। सी ++ में, क्या हमें योग्य नाम के बिना enums का उपयोग करने की आवश्यकता है? लेकिन आईएमओ, वह बदसूरत लग रहा है।अंदरूनी प्रकारों का उपयोग करना - कंपाइलर चेतावनी C4482 सी ++

कोई विचार?

+5

आपके पास जावा अनुभव है जो मुझे लगता है;) – hhafez

+1

:) हाँ। जावा और सी #। असल में, यह एकमात्र विशेषता है जिसे मैंने इन दोनों की तुलना में सी ++ में बदसूरत महसूस किया। –

+6

यदि आप उस तरह के वाक्यविन्यास चाहते हैं तो आप केवल नामस्थान नमूना {enum {BLAH0, BLAH1}} कर सकते हैं और फिर इसे नमूना :: BLAH0 – BigSandwich

उत्तर

53

हां, enums एक नया "नेमस्पेस" नहीं बनाते हैं, enum में मान सीधे आसपास के क्षेत्र में उपलब्ध हैं। तो आप पाते हैं:

enum sample { 
    SAMPLE_ONE = 1, 
    SAMPLE_TWO = 2 
}; 

int main() { 
    std::cout << "one = " << SAMPLE_ONE << std::endl; 
    return 0; 
} 
11

हां। संकल्पनात्मक enum एक प्रकार, और उस प्रकार के संभावित मूल्य परिभाषित करता है। भले ही यह प्राकृतिक लगता है, enum foo { bar, baz }; को परिभाषित करने के लिए और फिर foo::baz देखें int::1 का संदर्भ देने जैसा ही है।

+0

लेकिन, हालांकि आप foo :: baz (और चेतावनी प्राप्त कर सकते हैं) का उपयोग कर सकते हैं, आप वास्तव में int :: 1 –

+3

@ सिमॉन का उपयोग नहीं कर सकते: आपको केवल विजुअल स्टूडियो पर यह चेतावनी मिलती है, जो इसे एक कंपाइलर एक्सटेंशन के रूप में लागू करता है। जीसीसी नहीं है; जब तक कि आप C++ 11 के रूप में संकलित नहीं हो रहे हैं (जहां यह कानूनी वाक्यविन्यास है)। –

35

यह साफ है, की जगह बनाने के लिए:

enum Fruit { 

    ORANGE = 0, 
    BANANA = 1 

}; 

साथ
namespace Fruit { 

    enum { //no enum name needed 

     ORANGE = 0, 
     BANANA = 1 

    }; 

}; 

... 

int f = Fruit::BANANA; //No warning 
+2

मुझे यह दृष्टिकोण पसंद है। (मैं जावा से भी आ रहा हूं।) मैं योग्यता वाले नामों के नाम का ज्ञान नहीं समझता। मुझे तर्क जानने में दिलचस्पी होगी। –

+8

मुझे इस दृष्टिकोण को पसंद नहीं है, क्योंकि चर का प्रकार यह सुझाव नहीं देता है कि यह एक enum है। – qub1n

14

sth सवाल का जवाब करता है, यह पता नहीं था कि कैसे मैं हमेशा enums का उपयोग किया है। भले ही वे संख्याओं के लिए कम या ज्यादा नाम हैं, फिर भी मैंने हमेशा उन प्रकारों को परिभाषित करने के लिए उपयोग किया है जिनके पास केवल कुछ मान हो सकते हैं।

enum वर्ग का हिस्सा है, तो है कि उपभोक्ताओं को स्पष्ट रूप से एक enum संदर्भ की पहचान में मदद करता है:

class Apple { 
    enum Variety { 
    Gala, 
    GoldenDelicious, 
    GrannySmith, 
    Fuji 
    } 
    ... 
}; 

फिर उपभोक्ताओं enum के सक्षम घोषित उदाहरणों होगा, पैरामीटर के रूप में पारित, और उन्हें योग्य जब संदर्भित प्रकारों में से एक।

unsigned int GetCountOfApples(Apple::Variety appleVariety); 
... 
fujiCnt = GetCountOfApples(Apple::Fuji); 

कभी कभी तुम एक वर्ग या एक ही कक्षा में दो enums के बाहर एक enum चाहते हैं, और आप की तरह क्या Poy था कुछ कर सकते हैं। हालांकि आप enum प्रकार का संदर्भ नहीं दे पाएंगे, इसलिए बस इसे नाम दें।

namespace Color { 
    enum ColorEnum { 
    Blue, 
    Red, 
    Black 
    }; 

अब enum का उपयोग कर और मूल्यों काम करेगा की तरह:

Color::ColorEnum firstColor = Color::Blue; 
Color::ColorEnum secondColor = Color::Red; 

if(firstColor == secondColor) 
.... 

अब उन्हें में एक ही नाम के साथ विभिन्न enums होने के लिए होता है अगर, वे हमेशा वे किस प्रकार कर रहे हैं के साथ योग्य हो जाएगा। फिर आप जुआरी के बारे में पूछने वाले संभाल सकते हैं।

void Function(Sample eSample); 
Sample m_eSample; 

और:

BananaColorEnum banCol = BananaColor::Yellow; 
TomatoColorEnum tomCol = TomatoColor::Yellow; 
7

स्पष्ट तरीका मैं यह कर पाया है के रूप में इस तरह के

namespace Samples 
{ 
    enum Value 
    { 
     Sample1, 
     Sample2, 
     Sample3 
    }; 
} 
typedef Samples::Value Sample; 

फिर enum समारोह और चर परिभाषा में आप typedef उपयोग कर सकते हैं परिभाषित करने है अपनी .cpp फ़ाइल में आप चर निर्दिष्ट करने के लिए नेमस्पेस का उपयोग कर सकते हैं:

void Function(Sample eSample) 
{ 
    m_eSample = Samples::Sample1; 
    eSample = Samples::Sample2; 
} 
8

namespace Company 
{ 
    typedef int Value; 
    enum 
    { 
     Microsoft= 0, 
     APPLE = 1, 
    }; 
}; 

namespace Fruit 
{ 
    typedef int Value; 
    enum 
    { 
     ORANGE = 0, 
     BANANA = 1, 
     APPLE = 2, 
    }; 
}; 

... 

Fruit::Value f = Fruit::BANANA; //No warning 
Company::Value f = Company::APPLE; //is different value then Fruit::APPLE 

यह जीसीसी और एमएस कंपाइलर और मैक पर काम करता है।और लाभ यह है कि आप नेमस्पेस ऑपरेटर का उपयोग कर सकते हैं और संघर्ष पारित कर सकते हैं। थोड़ा नुकसान यह है कि फल के बजाय, आपको फल :: मूल्य लिखना होगा। यह बड़ी परियोजना में अधिक उपयोगी है जब आप नहीं जानते कि अन्य वर्ग में कौन सी चीजें हैं।

यदि इसके बजाय सी ++ 11 का उपयोग करना संभव है, तो यह अधिक सरल है, क्योंकि enum :: नेमस्पेस वाक्यविन्यास तब संभव है।

+0

यदि आप इसमें कुछ स्पष्टीकरण जोड़ सकते हैं तो आपकी पोस्ट अधिक मूल्यवान होगी। :) – ForceMagic

+2

मैंने एक स्पष्टीकरण अपडेट किया है। – qub1n

+0

बहुत अच्छा जवाब। सरल और साफ – deeJ

1

व्यक्तिगत रूप से, मुझे लगता है कि यह एक कंपाइलर बग है। मैं बहुत समय के लिए सी ++ का उपयोग कर रहा हूं। अफसोस की बात है, ओपी में कोई नमूना कोड नहीं। जावा लोगों द्वारा एक enum की व्याख्या वास्तव में सही आईएमओ था। मेरा, इस तरह था ...

class Foo { 
    enum tMyEnum { eFirstVal = 0, eSecondVal = 1}; 
    // ... 
    tMyEnum m_myVal; 
}; 
void Foo::MyMethod() { 
    if(m_myVal == tMyEnum::eFirstVal) { 
// ... 
    } 
} 

मैंने भी कोशिश की, Foo :: tmyEnum :: eFirstVal। क्वालिफायर के बिना, संकलित सबकुछ।

0

मुझे एक ही समस्या थी और मैं अभी तक सी ++ 11 का उपयोग नहीं कर रहा हूं। मैं खुद को पूरी तरह से योग्य नामस्थान भी पसंद करता हूं।

मैंने इस विशेष चेतावनी को अक्षम कर दिया। मुझे यकीन है कि लोग इस विचार को नापसंद करेंगे लेकिन कुछ आभारी होंगे ..

#pragma warning(disable : 4482) 
संबंधित मुद्दे