2008-10-12 42 views
99

पर समाधान नहीं किया गया बाह्य प्रतीक बहुत सीधे शब्दों में:स्थिर वर्ग के सदस्यों

मैं एक वर्ग है कि ज्यादातर स्थिर सार्वजनिक सदस्य होते हैं, इसलिए मैं समूह समान कार्य एक साथ है कि अभी भी अन्य वर्गों/कार्य से कहा जा सकता है।

वैसे भी, मैंने अपने वर्ग सार्वजनिक दायरे में दो स्थैतिक हस्ताक्षरित चार चर परिभाषित किए हैं, जब मैं एक ही कक्षा के निर्माता में इन मानों को संशोधित करने का प्रयास करता हूं, तो मुझे संकलन में "अनसुलझा बाहरी प्रतीक" त्रुटि मिल रही है।

class test { 

    public: 

     static unsigned char X; 
     static unsigned char Y; 

     ... 

     test(); 
}; 

test::test() { 
    X = 1; 
    Y = 2; 
} 

मैं सी ++ में नया हूं इसलिए मुझे आसान बनाएं। मैं ऐसा क्यों नहीं कर सकता?

उत्तर

112

आप एक्स के अपने घोषणाओं मैच के लिए परिभाषाओं को जोड़ने के लिए और

unsigned char test::X; 
unsigned char test::Y; 

कहीं भूल वाई। तुम भी एक स्थिर सदस्य

unsigned char test::X = 4; 

प्रारंभ करने में चाहते हो सकता है और फिर से, आप ऐसा कर परिभाषा (आमतौर पर एक CXX फ़ाइल में) में घोषणा में नहीं है (जो एक एच फ़ाइल में अक्सर होता है)

+1

आप शीर्ष लेख-केवल पुस्तकालय लिख रहे हैं, तो आप इस तकनीक का उपयोग कर सकते हैं cpp फ़ाइल से बचने के लिए: http://stackoverflow.com/questions/11709859/how-to-have-static डाटा-सदस्यों में एक हेडर-केवल-पुस्तकालय – ShitalShah

54

कक्षा घोषणा में स्टेटिक डेटा सदस्यों की घोषणा उनकी परिभाषा नहीं है। उन्हें परिभाषित करने के लिए आपको डुप्लिकेट प्रतीकों से बचने के लिए .CPP फ़ाइल में ऐसा करना चाहिए।

एकमात्र डेटा जिसे आप घोषित और परिभाषित कर सकते हैं वह अभिन्न स्थिर स्थिरांक है। (enums के मान निरंतर मूल्यों के साथ ही इस्तेमाल किया जा सकता)

आप अपने कोड के पुनर्लेखन के लिए चाहते हो सकता है के रूप में:

class test { 
public: 
    const static unsigned char X = 1; 
    const static unsigned char Y = 2; 
    ... 
    test(); 
}; 

test::test() { 
} 

आप (आप स्थैतिक चर संशोधित करने के लिए दूसरे शब्दों जब में क्षमता है चाहते हैं यह उनके स्थिरांक के रूप में घोषित करने के लिए) अनुचित है, तो आप आप निम्नलिखित तरीके से .H और .CPP के बीच कोड को अलग कर सकते हैं:

एच:

class test { 
public: 

    static unsigned char X; 
    static unsigned char Y; 

    ... 

    test(); 
}; 

सीपीपी:

unsigned char test::X = 1; 
unsigned char test::Y = 2; 

test::test() 
{ 
    // constructor is empty. 
    // We don't initialize static data member here, 
    // because static data initialization will happen on every constructor call. 
}