c++ - हरण - पूर्णांक संख्या क्या होती है




कक्षा परिभाषा में स्थिर कॉन्स पूर्णांक सदस्यों को परिभाषित करना (5)

सी ++ स्थिर कॉन्स सदस्यों को कक्षा के भीतर परिभाषित करने की अनुमति देता है

नहीं, 3.1 §2 कहते हैं:

एक घोषणा एक परिभाषा है जब तक कि यह फ़ंक्शन के शरीर (8.4) को निर्दिष्ट किए बिना फ़ंक्शन घोषित करता है, इसमें बाहरी विनिर्देशक (7.1.1) या एक लिंक-विनिर्देश (7.5) और न तो प्रारंभकर्ता और न ही कोई कार्यकर्ता होता है, यह एक स्थिर डेटा घोषित करता है एक वर्ग परिभाषा में सदस्य (9.4), यह एक वर्ग नाम घोषणा (9.1) है, यह एक अपारदर्शी-घोषणा-घोषणा (7.2) है, या यह एक टाइप-एप घोषणा (7.1.3) है, एक घोषणा-घोषणा (7.3। 3), या एक उपयोग निर्देश (7.3.4)।

मेरी समझ यह है कि सी ++ स्थिर कॉन्स सदस्यों को कक्षा के अंदर परिभाषित करने की इजाजत देता है जब तक कि यह एक पूर्णांक प्रकार न हो।

फिर, निम्न कोड मुझे एक लिंकर त्रुटि क्यों देता है?

#include <algorithm>
#include <iostream>

class test
{
public:
    static const int N = 10;
};

int main()
{
    std::cout << test::N << "\n";
    std::min(9, test::N);
}

मुझे जो त्रुटि मिलती है वह है:

test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status

दिलचस्प बात यह है कि अगर मैं std :: min पर कॉल को टिप्पणी करता हूं, तो कोड संकलित और लिंक ठीक है (भले ही परीक्षण :: एन को पिछली पंक्ति पर भी संदर्भित किया गया हो)।

क्या हो रहा है के बारे में कोई विचार?

मेरा संकलक लिनक्स पर जीसीसी 4.4 है।


ऐसा करने का एक और तरीका, पूर्णांक प्रकारों के लिए, कक्षा में enums के रूप में स्थिरांक परिभाषित करना है:

class test
{
public:
    enum { N = 10 };
};

सिर्फ int नहीं है। लेकिन आप वर्ग घोषणा में मूल्य को परिभाषित नहीं कर सकते हैं। यदि आपके पास है:

class classname
{
    public:
       static int const N;
}

.h फ़ाइल में आपके पास होना चाहिए:

int const classname::N = 10;

.cpp फ़ाइल में।


सी ++ 11 के रूप में आप (और आप चाहते हैं) का उपयोग कर सकते हैं:

static constexpr int N = 10;

जो आपको एक .cpp फ़ाइल में निरंतर परिभाषित करने की आवश्यकता नहीं है।


मेरी समझ यह है कि सी ++ स्थिर कॉन्स सदस्यों को कक्षा के अंदर परिभाषित करने की इजाजत देता है जब तक कि यह एक पूर्णांक प्रकार न हो।

आप सही प्रकार के हैं। आपको कक्षा घोषणा में स्थिर कॉन्स इंटीग्रल को प्रारंभ करने की अनुमति है लेकिन यह परिभाषा नहीं है।

http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/cplr038.htm

दिलचस्प बात यह है कि अगर मैं std :: min पर कॉल को टिप्पणी करता हूं, तो कोड संकलित और लिंक ठीक है (भले ही परीक्षण :: एन को पिछली पंक्ति पर भी संदर्भित किया गया हो)।

क्या हो रहा है के बारे में कोई विचार?

std :: min कॉन्स संदर्भ द्वारा इसके पैरामीटर लेता है। यदि यह उन्हें मूल्य से ले जाता है तो आपको यह समस्या नहीं होगी, लेकिन आपको संदर्भ की आवश्यकता होने के बाद भी आपको एक परिभाषा की आवश्यकता है।

यहां अध्याय / कविता है:

9.4.2 / 4 - यदि एक static डेटा सदस्य const अभिन्न या const गणना प्रकार का है, तो कक्षा परिभाषा में इसकी घोषणा एक स्थिर-प्रारंभकर्ता निर्दिष्ट कर सकती है जो एक अभिन्न निरंतर अभिव्यक्ति (5.1 9) होगी। उस स्थिति में, सदस्य अभिन्न निरंतर अभिव्यक्तियों में प्रकट हो सकता है। सदस्य को अभी भी नामस्थान स्कोप में परिभाषित किया जाएगा यदि इसका उपयोग प्रोग्राम में किया जाता है और नामस्थान स्कोप परिभाषा में प्रारंभकर्ता नहीं होना चाहिए।

एक संभावित कामकाज के लिए चू का जवाब देखें।





definition