2012-03-09 10 views
13

क्या आपको कक्षा के अंदर या बाहर enums घोषित करना चाहिए यदि कहा गया enums केवल वर्ग सदस्य कार्यों में उपयोग किया जाता है?क्या आपको कक्षा के अंदर या बाहर enums घोषित करना चाहिए?

namespace nspace 
{ 

// need to append OC, as this pollutes the current namespace 
enum OUTSIDE_CLASS {OC_POINTS, OC_LINES, OC_LINE_LOOP, :::}; 
enum OTHER_ENUM {OE_POINTS}; 
class VertexBuffer 
{ 
public: 
    enum INSIDE_CLASS {POINTS, LINES, LINE_LOOP, :::}; 
    void foo(OUTSIDE_CLASS e); 
    void bar(INSIDE_CLASS e); 
} 
}; 

// usage 
nspace::VertexBuffer v; 
v.foo(nspae::VB_POINTS); 
v.bar(nspace::VertexBuffer::POINTS); // more pedantic 
+7

सभी [कोडिंग-शैली] प्रश्नों के साथ, जवाब "यह निर्भर करता है।" –

+2

किसी के पास इस से थोड़ा अधिक अंतर्दृष्टि हो सकती है, लेकिन मेरी रणनीति हमेशा कुछ खुलासा नहीं करती है जब तक कि इसे उजागर करने की आवश्यकता न हो। (दूसरे शब्दों में, अगर यह आंतरिक रूप से उपयोग किया जाता है, तो इसे आंतरिक रखें।) – Corbin

+0

सामान्य रूप से कोडिंग शैली के प्रश्नों के साथ, कोई निश्चित उत्तर नहीं है।वैश्विक दायरे को प्रदूषित करना आम तौर पर विवादित घोषणाओं के जोखिम के कारण एक अच्छा विचार नहीं है, लेकिन यदि आप अपने "अपने" नामस्थान में रहते हैं, तो यह कड़ाई से वरीयता का मामला है। –

उत्तर

14

वास्तविक लक्ष्य दायरे को प्रदूषित करने से बचने के लिए है (या तो वैश्विक या नामस्थान) और संबंधित मानों को एक साथ समूहबद्ध करने में मदद करें (आईडीई में स्वत: पूर्णता के साथ सुंदर सामान काम करता है)।

सी ++ 11 के साथ, आप दृढ़ता से घोषणा कर सकते हैं का उपयोग कर टाइप किया enums:

enum class MyEnum { 
    Value0, 
    Value1 
}; 

जो जरूरी रूप MyEnum::Value0 (और नहीं Value0) लागू कर रहे हैं।

सी में 03 ++, आप कम या ज्यादा के साथ इस का अनुकरण कर सकते हैं:

struct MyEnum { 
    enum Type { 
    Value0, 
    Value1 
    }; 
}; 

लेकिन फिर enum के प्रकार MyEnum::Type जो आसानी से अलग है।

आलसी विकल्प सिर्फ एक वर्ग में यह डंप करने के लिए है, लेकिन मैं अभी भी एक दायरे वाला enum घोंसला बनाने से, यहां तक ​​कि एक वर्ग के भीतर पक्ष, बस यह स्पष्ट है कि उन मूल्यों ढीला नहीं हैं बनाने के लिए, लेकिन इसके बजाय परस्पर संबंधित हैं

+1

-1 "यह वैश्विक दायरे को प्रदूषित करने से बचता है।" नहीं, यह नहीं है, लेकिन अगर यह घोषणा वैश्विक दायरे में होनी चाहिए (जिसे इसे शायद ही कभी करना है), तो प्रदूषण को कई नामों (enum मानों) के बजाय एक ही नाम (प्रकार का नाम) में घटा दिया जाता है। –

+1

@ चीयर्संधथ-अल्फ: सही, मेरी विचार ट्रेन से बचे हुए, असली इरादा परिचय में व्यक्त किया गया था * दायरे को प्रदूषित करने से बचें (या तो वैश्विक या नामस्थान) *। मैं हमेशा नामस्थानों का उपयोग करने की अनुशंसा करता हूं ... उम्मीद है कि स्क्रिप्ट जैसे प्रोग्राम (सी ++ में, हाँ!) शायद ही कभी इसकी आवश्यकता होती है। –

+1

ठीक है, डाउनवोट –

8

अगर केवल अपने वर्ग के सदस्यों enum का उपयोग यह वर्ग के अंदर enum घोषित करने के लिए बेहतर है।
यह अनावश्यक प्रतीक नाम & भी
यह वर्ग के उपयोगकर्ताओं के लिए अधिक सहज ज्ञान युक्त है की वजह से प्रदूषण से नाम स्थान/वैश्विक अंतरिक्ष बचाता है, यह उपयोगकर्ता को पता है कि enum केवल वर्ग द्वारा उपयोग किया जाएगा मदद करता है।

सामान्य नियम आप का पालन करना चाहिए है:
एक गुंजाइश (वैश्विक/नाम स्थान) जो तक पहुँचा नहीं किया जाएगा (& इसलिए जरूरत नहीं) है कि क्षेत्र में किसी भी प्रतीक न जोड़ें।

+0

-1 वैश्विक नामस्थान इन-क्लास घोषणा के लिए एकमात्र विकल्प नहीं है। –

+0

@ चीयर्संधथ.-अल्फ: जवाब यह नहीं कहता कि वैश्विक नामस्थान वर्ग घोषणा में एक विकल्प है, यह सिर्फ इतना कहता है कि इस मामले में यह एक अच्छा विचार क्यों नहीं है। मैं थोड़ी उलझन में हूं कि आप यहां क्या कर रहे हैं। –

+0

"यह प्रदूषण से वैश्विक अंतरिक्ष को रोकता है" इस धारणा के बिना समझ में नहीं आता कि वैश्विक नामस्थान एकमात्र विकल्प है। –

0

जैसा कि मैथ्यूयू एम ने उल्लेख किया है, सी ++ 11 में Strongly typed enumerations का उपयोग करें।

सी ++ 03 में उन्हें अनुकरण करने का एक अच्छा तरीका नामस्थानों में enums को लपेटना है। यह struct में लपेटने से बेहतर है क्योंकि उस नामस्थान में ऐसे कार्य हो सकते हैं जो तर्क-निर्भर नाम लुकअप का उपयोग करके पाई जा सकें। उदा .:

namespace MyEnum { 
    enum Type { 
    Value0, 
    Value1 
    }; 

    std::ostream& operator<<(std::ostream&, Type); 
    std::istream& operator>>(std::istream&, Type&); 
} 

MyEnum::Type value; 
std::cout << value; // uses the overload from MyEnum 
std::cin >> value; // uses the overload from MyEnum 
+0

-1 हटा दिया गया है "यह बेहतर है क्योंकि" होना चाहिए "मुझे पसंद है"। उदाहरण के लिए, मैं structs में लपेटना पसंद करता हूं क्योंकि कक्षाओं के अंदर structs टाइप किया जा सकता है (आप कक्षा के अंदर "नेमस्पेस का उपयोग" नहीं कर सकते हैं)। जिस तरह से मैंने लिखा है वह ठीक है, लेकिन अगर मैं दावा करता हूं कि मेरी प्राथमिकता किसी और की प्राथमिकता है तो यह बेहतर है या फिर यह गलत अर्थ होगा। –

+0

जैसा कि अल्फ ने कहा था, मैं 'typedef' क्षमता के लिए structs का उपयोग करना पसंद करता हूं। नामस्थान में फ़ंक्शंस रखना जिसमें एनम निवास युक्त संरचना एडीएल के लिए पर्याप्त है। –

+0

@Alf: 'typedef' और 'नेमस्पेस का उपयोग करके' अलग-अलग चीजें करते हैं, इसलिए यह स्पष्ट नहीं है कि आपने उनकी तुलना क्यों की, आप पसंद कर सकते हैं समझाने के लिए। मैंने "बेहतर" लिखा और समझाया कि कैसे। –

0

यह निर्भर करता है। कार्यान्वयन विवरण के संपर्क को कम करने के लिए प्रयास करें। जैसे नामस्थानों और/या कक्षाओं और/या अलग-अलग संकलित कार्यान्वयन फ़ाइलों में चीजें संलग्न करें। और जैसा कि उम्मीद है कि बहुत स्पष्ट हो जाता है, वैश्विक नामस्थान और कक्षा में बिल्कुल एकमात्र विकल्प नहीं हैं। यानी, कक्षा में कुछ घोषित करना एक्सपोजर को कम करने का एकमात्र तरीका नहीं है (तब कुछ और तरीके क्या हैं? --- ओह, ठीक है, इस उत्तर की तीसरी वाक्य याद रखें)।

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

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