2011-04-16 15 views
6

मैं एक enum बनाने लेकिन अंत में किसी को उस enum करने पर जोड़ना चाहता है कहो, क्या करता है? पूर्व:एक enum विस्तार?

blah.hpp 
enum PizzaDressing { 
DRESSING_OLIVES = 0, 
DRESSING_CHEESE = 1 
}; 

और मेरे FunkyPizza कक्षा में, वहाँ काली मिर्च टॉपिंग हो सकता है।

तो मैं स्पष्ट रूप से मूल enum को संशोधित किए बिना मिर्च जोड़ सकते हैं?

धन्यवाद

+0

संभव डुप्लिकेट विरासत] (http://stackoverflow.com/questions/644629/base-enum-class-inheritance) – DuckMaestro

उत्तर

3

के बाद से enums आम तौर पर संकलक में पूर्णांक में से कुछ आकार के रूप में नियंत्रित किया जाता है, तुम सब करने के लिए है बाद में

कर रहा है
enum PizzaDressing 
{ 
    Olives = 0, 
    Cheese = 1, 
    Pepperoni = 2 
}; 

या आप इसे

enum PizzaDressing 
{ 
    Olives = 0, 
    Cheese = 1, 
    Pepperoni 
}; 

आप सकता है, अगर उन में से कोई भी किसी कारण से स्वीकार्य है, गणित (Cheese + 1) का उपयोग गिनती करने के लिए अनुमति दे सकता है। आप एनम के साथ लगभग किसी भी तरह से एक संख्यात्मक मूल्य के साथ खेल सकते हैं।

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

मुझे लगता है कि यह डाले के साथ एक और प्रगणक में एक गणन उपयोग करने के लिए, कानूनी वाक्य रचना है, लेकिन मैं इसे करने की कोशिश कभी नहीं किया है। यह काम कर सकते हैं, लेकिन एक तरह से बदसूरत है:

enum PizzaDressing 
{ 
    Olives = 0, 
    Cheese = 1 
}; 

enum OtherPizzaDressings 
{ 
    Start = (OtherPizzaDressings)PizzaDressing::Cheese; 
    Pepperoni 
}; 
2

एक "गतिशील enum" के रूप में जाना जाएगा कि। मेरे सबसे अच्छे ज्ञान के लिए, ऐसा कुछ भी C++ में मौजूद नहीं है। हालांकि, हम C++ का उपयोग करते हुए और नहीं कर रहे हैं के बाद से सी, आप कुछ इस तरह कर सकता है:

#include <string> 
#include <map> 

std::map<std::string, int> myMap; 
myMap["DRESSING_OLIVES"] = 0; 
myMap["DRESSING_CHEESE"] = 1; 
myMap["PEPPER_TOPPING"] = 2; 
+4

यह ध्यान दिया जाना चाहिए कि एक मानचित्र का उपयोग करने का भूमि के ऊपर एक सादे 'enum' का उपयोग कर की तुलना में बहुत बड़ा है। 'map' निष्पादन के दौरान गतिशील रूप से निर्मित और बनाए रखा गया डेटा संरचना है:' map' तत्व पर प्रत्येक पहुंच एक फ़ंक्शन कॉल है। 'enum' एक नया संकलन समय प्रकार है, जो 'int' के रूप में जटिल है। – lvella

+0

+1: अच्छा कॉल .. –

+0

हाँ, तार के इस नक्शे एक सामान्य enum की तुलना में बेहद धीमी गति से किया जाएगा। और सी # में कोई गतिशील enum नहीं है (मुझे पता होना चाहिए; मैंने उस समस्या के लिए कामकाज लिखा: http://www.codeproject.com/KB/cs/symbol.aspx) – Qwertie

0

आप गतिशील रूप से, एक enum संशोधित नहीं कर सकते क्योंकि यह केवल संकलन समय पर हल हो गई एक नए प्रकार परिभाषित करता है। वे प्रोग्रामर के लिए निमोनिक्स हैं, संकलन पर उन्हें संख्याओं में अनुवादित किया जाता है।

कहा, आप जो कुछ भी आप चाहते हैं प्रतिनिधित्व करने के लिए मूल enum द्वारा नहीं किया किसी भी संख्या का उपयोग कर सकते हैं:

PizzaDressing a; 
a = (PizzaDressing)5; 
+0

लेकिन फिर आप बस हर जगह संख्याओं का उपयोग कर सकते हैं। तो बात क्या है?बुराई-जाति हाथ से ऐसा करने के बजाय, इसका ट्रैक रखने के लिए कंपाइलर/भाषा सुविधाओं का उपयोग करना बेहतर होगा। – SasQ

+0

मुझे नहीं पता। मुझे नहीं पता कि आप क्या करने की कोशिश कर रहे हैं। मैं बस कंपाइलर सुविधा समझा रहा हूं ताकि कोई यह तय कर सके कि आगे बढ़ना और इसका उपयोग कैसे करें। हो सकता है कि किसी के पास 'नक्शा ' हो, जहां कुछ नामों के मूल्य 100 से ऊपर गतिशील रूप से परिभाषित किए गए हैं, और 100 को देखते हुए एक स्थिर रूप से परिभाषित 'enum' है। वैसे भी, यह एक प्रोग्रामर बन सकता है और भाषा के अपने पक्ष में उपयोग की असीमित संभावनाओं से केवल एक ही स्थिति है। – lvella

4

इस के सबसे करीब है कि आप क्या चाहते: Base enum class inheritance

[आधार enum वर्ग के
+0

क्षमा करें थ्रेड नेक्रोमैंसी, लेकिन मुझे ज़ोर देना चाहिए कि स्वीकार्य उत्तर वर्णनों की तुलना में यह एक बेहतर तरीका है। यह enum को इस तरह से विस्तारित करने की अनुमति देता है जो विस्तारित मानों को पुराने कार्यों में पारित करना असंभव बनाता है जो उन्हें संभाल नहीं सकते हैं। – antipattern

+0

@antipattern: SO पर कोई धागा necromancy नहीं है, क्योंकि कोई धागे, केवल प्रश्न, उत्तर और टिप्पणियां नहीं हैं;)। – rubenvb