2010-12-01 7 views
9

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

+0

जब तक आप जिस इंटरफ़ेस की बात करते हैं, उस प्रकार की सभी ऑब्जेक्ट्स के लिए आम नहीं है, जिसे आप परिभाषित कर रहे हैं, सदस्य चर में आपके पास क्या उपयोग किया जाता है? उस वैरिएबल स्टेटिक कॉन्स को कॉल करना संकलक को बताने का तरीका है कि चर के प्रकार के प्रत्येक ऑब्जेक्ट में चर सामान्य है। – vpit3833

+0

मैं कन्स्ट्रक्टर में प्रारंभ करने से बचने की कोशिश कर रहा हूं, जो सदस्य चर के लिए डिफ़ॉल्ट मान दे रहा है। – Sulla

+1

देखें http://stackoverflow.com/questions/370283/why-cant-i-have-a-non-integral-static-const-member-in-a-class और http://stackoverflow.com/questions/ कुछ अच्छी जानकारी के लिए 3575580/rationale-behind-static-const-सदस्य-प्रारंभिक-वाक्यविन्यास। – sje397

उत्तर

8

तर्क सी ++ की "निम्न-स्तर" प्रकृति है। यदि यह अनुमति देगा, तो कंपाइलर को सभी रचनाकारों के लिए प्रारंभिक कोड उत्पन्न करना होगा जो डेवलपर को पूरी तरह से स्पष्ट नहीं है।

बेस क्लास कन्स्ट्रक्टर स्पष्ट रूप से लागू नहीं होने पर भी व्युत्पन्न कक्षा के निर्माण पर बेस कक्षाओं के सदस्यों को प्रारंभ करना आवश्यक हो सकता है।

स्टेटिक कॉन्स अभिन्न चर को ऑब्जेक्ट सृजन पर इंटिलाइजेशन की आवश्यकता नहीं है।

+0

क्योंकि यह वही रहता है, संकलक बस स्थिरांक को उनके मूल्यों से प्रतिस्थापित कर सकता है। – Tomas

+0

मेरा उत्तर देखें - स्थिर का अर्थ है कि यह प्रति-उदाहरण नहीं है, और जैसा कि कन्स्ट्रक्टर से संबंधित नहीं है। – EboMike

+0

स्टेटिक कॉन्स इंटीग्रल केवल एक बार शुरू होते हैं, और प्रत्येक बार उस वर्ग का ऑब्जेक्ट नहीं बनाया जाता है। –

3

मैं सिर्फ आपको ऐसा करने की कोशिश कर रहे हैं अनुमान लगा रहा हूँ:

class foo { 
    int m_iX = 5; 
}; 

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

आप ऐसा कर सकते हैं:

class foo { 
    enum { 
     CONSTANT = 8 
    }; 
}; 

यह आपको foo::CONSTANT उपयोग करने के लिए अनुमति देता है। यह काम करता है क्योंकि यह प्रति-उदाहरण के बजाय प्रति-वर्ग होगा।

इसी तरह, आप यह कर सकते हैं:

class foo { 
    static int sm_iX; 
}; 
सीपीपी में

:

int foo::sm_ix = 5; 

फिर, यह करने के लिए प्रति-वर्ग, नहीं प्रति-उदाहरण के लिए, और इस तरह प्रासंगिक नहीं है एक वास्तविक उदाहरण का निर्माण।

बोनस - यदि आप इस int const घोषित करते हैं, तो कई कंपाइलर संकलन-समय पर इसका मूल्यांकन कर सकते हैं। (यानी: गैर स्थिर, गैर लागत)

0

अरुण,

मेरा मानना ​​है कि अपने प्रश्न
Compiler Error C2864

से संबंधित है को प्राप्त करने के लिए आप क्या करना चाहते हैं, सी ++ आप उदाहरण के विशिष्ट सदस्यों प्रारंभ करने की आवश्यकता है या तो निर्माता में शरीर या प्रारंभिक सूची।

4

स्थिर प्रतिबंध मौजूद है क्योंकि सी ++ निर्माता initializers का उपयोग करता है गैर स्थिर डेटा सदस्यों प्रारंभ करने में:

struct Example { 
    int n; 
    Example() : n(42) {} 
}; 

स्थिरांक प्रतिबंध मौजूद है क्योंकि स्थिरांक मामले विशेष रूप से व्यवहार किया जाता है, ताकि स्थिर (बजाय दूसरी तरह के आसपास की तुलना में) कॉन्स अभिन्न सदस्यों को आम तौर पर माना जा सकता है जैसे उनके पास आंतरिक संबंध था, नामस्थान स्कोप (सी ++ 03 §7.1.5.1p2, यदि आप रुचि रखते हैं) पर कॉन्स्ट चर के समान हैं। यह मुख्य रूप से अभिन्न स्थिर अभिव्यक्तियों जैसे कि सरणी आकारों में सदस्यों का उपयोग करने के लिए फायदेमंद है।

11

क्योंकि वर्तमान मानक में इसकी अनुमति नहीं है। According to Bjarne, आप इसे C++ 0x में करने में सक्षम होंगे। यदि आपको वास्तव में इसकी आवश्यकता है, तो संकलक को C++ 0x (-std=c++0x पर जीसीसी में सेट करने का प्रयास करें) और देखें कि आपका कंपाइलर इसका समर्थन करता है या नहीं।