2012-06-12 15 views
5

से enums का उपयोग करके मैं एक पुस्तकालय का उपयोग कर रहा हूं जिसमें कई enums के साथ कक्षाएं हैं। यहाँ एक उदाहरणकक्षा (सी ++)

class TGNumberFormat 
{ 
    public: 
    // ... 
    enum EAttribute { kNEAAnyNumber 
    kNEANonNegative 
    kNEAPositive 
    }; 
    enum ELimit { kNELNoLimits 
    kNELLimitMin 
    kNELLimitMax 
    kNELLimitMinMax 
    }; 
    enum EStepSize { kNSSSmall 
    kNSSMedium 
    kNSSLarge 
    kNSSHuge 
    }; 
    // etc... 
}; 

कोड मैं उदाहरण के लिए TGNumberFormat::kNEAAnyNumber के रूप में इन का उल्लेख करने के लिए है में है। मैं एक जीयूआई लिख रहा हूं जो इन मानों का अक्सर उपयोग करता है और कोड बदसूरत हो रहा है। क्या कोई तरीका है कि मैं इन enums आयात कर सकते हैं और बस kNEAAnyNumber टाइप करें? मैं वास्तव में इनमें से किसी भी नाम को ओवरलैप करने की उम्मीद नहीं करता हूं। मैंने using कीवर्ड का उपयोग करने के विभिन्न तरीकों का प्रयास किया है और कोई भी संकलित नहीं होगा।

+4

मैं समारोह के लिए एक typedef स्थानीय का प्रयोग करेंगे (जैसे 'typedef TGNumberFormat एनएफ;', अनुमति देता है, जैसे, 'एनएफ :: kNELLimitMin') । हालांकि, मैं तर्क दूंगा कि नामों को टाइप करना बेहतर है। –

+0

'संरचना एक्स: टीजीएनंबरफॉर्मैट {}; '। फिर आप उन्हें 'एक्स :: केएनईएएनएनंबर' के रूप में उपयोग कर सकते हैं। मैं आपको ऐसा करने की अनुशंसा नहीं करता, क्योंकि 'टीजीएनंबरफॉर्मैट' (स्पष्ट रूप से) 'एक्स' के लिए जो भी छोटा नाम आता है उससे अधिक अर्थ रखता है। – Praetorian

उत्तर

8

यदि आप अपने कोड में इन स्थिरांक का उपयोग कर रहे हैं, तो यह आपके स्वयं के शीर्षलेख को बनाने के लिए फायदेमंद हो सकता है जो नामस्थान में मानों को फिर से परिभाषित करता है। फिर आप using नामस्थान कर सकते हैं। आपको सभी मूल्यों को फिर से परिभाषित करने की आवश्यकता नहीं है, केवल गणक के नाम। उदाहरण के लिए,

namespace TGEnumerators 
{ 
    static EAttribute const kNEAAnyNumber(TGNumberFormat::kNEAAnyNumber); 
    // etc. 
} 

वैकल्पिक रूप से, आप TGNumberFormat कार्य या जहां आप इसे अक्सर उपयोग स्रोत फ़ाइलों में एक छोटा नाम करने के लिए typedef कर सकते हैं। उदाहरण के लिए,

typedef TGNumberFormat NF; 
NF::EAttribute attribute = NF::kNEAAnyNumber; 

मैं बहस चाहते हैं बाद दृष्टिकोण बेहतर है, और यदि ब्लॉक गुंजाइश पर विवेकपूर्ण तरीके से इस्तेमाल, एक अच्छा अभ्यास है। हालांकि, एक फ़ाइल में उपयोग के लिए, मुझे लगता है कि स्पष्टता के लिए, गणक के पूर्ण नामों का उपयोग करना बेहतर होगा।

+0

+1 मैं गिनती नहीं कर सकता कि मैंने कितनी बार एक नंगे गणक को देखा है और आश्चर्य किया है कि पृथ्वी पर यह कहां से आया था क्योंकि यह एक चुस्त 'टाइपपीफ' या 'उपयोग' से छिपा हुआ था। –

+1

बस एक छोटी टिप्पणी: मूल्य पुनर्वितरण (आपकी पहली विधि) के लिए, मुझे लगता है कि सादे 'EAttribute' के बजाय' स्थिर कॉन्स EAttribute' का उपयोग करना बेहतर है। – Synxis

+0

नामस्थान क्षेत्र पर इसे 'स्थैतिक' बनाने का क्या मतलब है? –

0

अपने का उपयोग कर C++ 11 तुम प्रकार निकालना कीवर्ड ऑटो का उपयोग कर सकते हैं: जी ++ -std = C++ 0x -ओ मुख्य main.cpp

:

//the compiler will see auto and know to use: TGNumberFormat::EAttribute 
auto attribute = TGNumberFormat::kNEAAnyNumber; 

साथ संकलित

आप C++ 11 का उपयोग नहीं कर रहे हैं, के रूप में @James McNellis
मैक्रो का उपयोग कर ने उल्लेख किया अनुशंसित नहीं हैं क्योंकि वे करेंगे scope-- typedefs के नियमों का पालन नहीं करेंगे typedefs उपयोग करने पर विचार।

0

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

उदा

const TGNumberFormat::EAttribute AnyNumber = TGNumberFormat::kNEAAnyNumber; 
const TGNumberFormat::EAttribute NonNegative = TGNumberFormat::kNEANonNegative; 
... 

attribute = AnyNumber; 
0

दो समाधान:

  1. इसके साथ रहते हैं।
  2. #define AnyNumber TGNumberFormat::kNEAAnyNumber

* कवर के लिए चलाता है ... *

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