2009-08-25 11 views
8

वीसी ++ में जब मुझे कक्षा सदस्य चर के लिए बाध्य सरणी निर्दिष्ट करने की आवश्यकता होती है तो मैं इसे इस तरह से करता हूं:क्या सभी सी ++ कंपाइलर्स एक स्थिर कॉन्स इंट क्लास सदस्य चर का उपयोग सरणी के रूप में करने की अनुमति देते हैं?

 class Class { 

private: 
    static const int numberOfColors = 16; 
    COLORREF colors[numberOfColors]; 
}; 

(कृपया मुझे std :: vector का उपयोग करने के बारे में न बताएं)

इस तरह मेरे पास स्थिरता है जिसे लूप-स्टेटमेंट बाधाओं को निर्दिष्ट करने के लिए कक्षा कोड में और बाद में एक सरणी के रूप में उपयोग किया जा सकता है और साथ ही यह कहीं और दिखाई नहीं दे रहा है।

सवाल यह है कि क्या static const int सदस्य चर के इस उपयोग को केवल वीसी ++ द्वारा अनुमत किया गया है या क्या यह आमतौर पर अन्य व्यापक कंपाइलर्स द्वारा अनुमत है?

+8

"कृपया मुझे std :: vector का उपयोग करने के बारे में न बताएं" - नहीं, यह उचित नहीं होगा। आपको 'std :: tr1 :: array' का उपयोग करना चाहिए। ':)' – sbi

उत्तर

4

हाँ, यह 100% कानूनी है और पोर्टेबल होना चाहिए। सी ++ मानक 5.19 में इस कहते हैं - लगातार भाव "(जोर मेरा): सरणी सीमा (8.3.4, 5.3.4) के रूप में:

कई स्थानों में, सी ++ भाव है कि एक अभिन्न या गणना स्थायी करने के लिए मूल्यांकन की आवश्यकता है , केस-एक्सप्रेशन (6.4.2), बिट-फील्ड लम्बाई (9 .6) के रूप में, गणक प्रारंभकर्ता (7.2), स्थिर सदस्य प्रारंभकर्ता (9.4.2) के रूप में, और अभिन्न या गणना गैर-प्रकार के टेम्पलेट तर्क (14.3) के रूप में ।

constant-expression: 
    conditional-expression 

एक अभिन्न निरंतर अभिव्यक्ति केवल शाब्दिक (2.13), प्रगणक, स्थिरांक चर या अभिन्न के स्थिर डेटा सदस्यों या गणन प्रकार के साथ प्रारंभ शामिल कर सकते हैं निरंतर अभिव्यक्ति (8.5), अभिन्न या गणना प्रकारों के गैर-प्रकार टेम्पलेट पैरामीटर, और आकार अभिव्यक्तियों का आकार।

ऐसा कहा जाता है कि ऐसा लगता है कि वीसी 6 इसका समर्थन नहीं करता है। एक अच्छा कामकाज के लिए StackedCrooked's answer देखें। असल में, मैं आम तौर पर इस प्रकार की चीज़ के लिए enum विधि स्टैक्ड क्रुक्ड उल्लेख पसंद करता हूं।

एक एफवाईआई के रूप में, "static const" तकनीक वीसी 9, जीसीसी 3.4.5 (मिनजीडब्ल्यू), कॉमौ और डिजिटल मंगल में काम करती है।

और भूल नहीं है कि यदि आप एक "` स्थिर स्थिरांक ' "सदस्य का उपयोग करें, आप need a definition for it in addition to the declaration कडाई के साथ होगा। हालांकि, लगभग सभी कंपाइलर्स आपको इस मामले में परिभाषा छोड़ने से दूर जाने देंगे।

1

मैंने उस साल की पोर्टेबिलिटी के बारे में परेशान करना बंद कर दिया है। शायद अभी भी कंपाइलर्स हैं जो इसका समर्थन नहीं करते हैं, लेकिन मैंने हाल ही में उनमें से किसी से मुलाकात नहीं की है।

13

यह व्यवहार C++ मानक के अनुसार मान्य है। कोई हालिया कंपाइलर इसका समर्थन करना चाहिए।

6

यह एक दशक से अधिक समय के लिए मानक सी ++ रहा है। यह वीसी द्वारा भी समर्थित है - आप और क्या चाहते हैं? (@Neil: सनसीसी के बारे में क्या? :^>)

6

मेरा मानना ​​है कि विजुअल स्टूडियो 2005 और उससे परे इसका समर्थन करता है। एक्सकोड सी ++ कंपाइलर भी (यह वास्तव में जीसीसी है)।

यदि आप सुरक्षित रहना चाहते हैं तो आप हमेशा पुराने एनम हैक का उपयोग कर सकते हैं जिसे मैंने प्रभावी सी ++ से सीखा। यह इस प्रकार है:

class Class { 

private: 
    enum { 
     numberOfColors = 16 
    }; 
    COLORREF colors[numberOfColors]; 
}; 

आशा इस मदद करता है।

+0

यहां तक ​​कि वीएस 2 के 3 इसका समर्थन करता है। – sharptooth

+0

यदि आप सी ++ कोड से काम कर रहे हैं, तो enum 'hack' आवश्यक नहीं होना चाहिए, लेकिन यदि आप सी में या वीसी ++ 6 में काम करने की घोषणा करना चाहते हैं, तो यह #define का उपयोग करने की अधिक सामान्य विधि से बेहतर है मेरी राय। –

2

मुझे पूरा यकीन है कि यह जीसीसी और सोलारिस के साथ भी काम करेगा, लेकिन मैं इस समय इसे सत्यापित नहीं कर सकता। इसलिए

Class<5> c; 

है कि आप अपने आवेदन में ठीक एक बफर आकार तक सीमित नहीं हैं:

भविष्य में आप इस तरह विचार का विस्तार कर सकते हैं:

template<int size> 
class Class { 
private: 
    COLORREF colors[size]; 
}; 

और इस तरह इसका इस्तेमाल।

+0

आप एक जादू संख्या का उपयोग कर रहे हैं, जो सवाल बचने की कोशिश कर रहा था। –

+0

@Neil: हालांकि, उपरोक्त जादू संख्या 5 को उस वर्ग से 'स्थिर स्थिरांक int 'द्वारा प्रतिस्थापित किया जा सकता है जिसे' सी 'स्वयं का सदस्य मिल सकता है। – quamrana

-1

आईएसओ सी ++ speicifcation का संदर्भ देकर इस तरह के सवालों का जवाब देना संभव है लेकिन लोगों को पढ़ने और पढ़ने के लिए मुश्किल है।

  • माइक्रोसॉफ्ट विजुअल स्टूडियो 2005 और ऊपर एक अपेक्षाकृत अनुरूप सी ++ दिया गया है: मैं सबसे सरल जवाब दो बातों पर टिका है लगता है। यदि यह आपको कुछ करने की अनुमति देता है, संभावनाएं मानक हैं।
  • सामान :: कोशिश करने के लिए जीसीसी कंपाइलर प्राप्त करने के लिए कोड :: ब्लॉक जैसे कुछ डाउनलोड करें। यदि यह एमएस और जीसीसी में काम करता है, तो वास्तव में, इसकी मानक संभावनाएं हैं।
+0

spec प्राप्त करना बहुत आसान है ($ 30 के लिए): http://stackoverflow.com/questions/81656/where-do-i-find-the-current-x-standard/83763#83763 spec को पढ़ना एक अलग है कहानी, लेकिन गंभीर सी ++ prgrammers शायद समय-समय पर इसे संदर्भित करना चाहिए: http://stackoverflow.com/questions/1123455/should-every-c-programmer-read-the-iso- मानक-to-become- व्यावसायिक –

13

यह वैध सी ++ है और अधिकांश (सभी?) उचित आधुनिक कंपाइलर्स इसका समर्थन करते हैं।आप को बढ़ावा देने का उपयोग कर रहे हैं, तो आप BOOST_STATIC_CONSTANT मैक्रो के रूप में इस सुविधा के लिए पोर्टेबल समर्थन प्राप्त कर सकते हैं:

class Class { 
private: 
    BOOST_STATIC_CONSTANT(int, numberOfColors = 16); 
    COLORREF colors[numberOfColors]; 
}; 

मैक्रो static const int numberOfColors = 16 करने के लिए विस्तारित किया गया है संकलक इस का समर्थन करता है, अन्यथा यह enum { numberOfColors=16 }; के रिसॉर्ट।

3

अन्य उत्तर आप समारोह निम्नलिखित स्थिर alocated सरणियों में तत्वों की संख्या तय करते हैं का उपयोग कर सकते इसके अलावा:

template<typename T, size_t length> 
size_t arrayLength(T (&a)[length]) 
{ 
    return length; 
}