2013-05-09 8 views
5

मैंने इंटरनेट की खोज की और पाया कि कुछ लोगों ने कहा कि गैर स्थैतिक सदस्य फ़ंक्शन स्थिर सदस्य फ़ंक्शन या डेटा तक पहुंच सकता है। फिर मैंने इसे सत्यापित करने के लिए एक कार्यक्रम लिखा।क्या गैर स्थैतिक सदस्य फ़ंक्शन स्थिर सदस्य फ़ंक्शन या डेटा तक पहुंच सकते हैं?

#include <iostream> 
class test 
{ 
public: 
    static int a; 
    void printa() 
    { 
     std::cout<<a; 
    } 
}; 

int main(int argc, const char * argv[]) 
{ 
    test m; 
    m.printa(); 

    return 0; 
} 

कोड लिंकर त्रुटियां उत्पन्न करता है!

Undefined symbols for architecture x86_64: 
    "test::a", referenced from: 
     test::printa() in main.o 
+0

के संभावित डुप्लिकेट (http: // stackoverflow।com/प्रश्न/8612206/लिंकर-त्रुटि जब-का उपयोग कर स्थैतिक-सदस्य) – AnT

+0

यहाँ समान समस्या है और इसके समाधान के [यहाँ] [1] [1]: http: // stackoverflow .com/प्रश्न/8034568/अनिर्धारित-प्रतीकों-आर्किटेक्चर-x86-64-जो-आर्किटेक्चर-चाहिए-i-use – Uahmed

+0

[संभावित स्थिर सदस्यों को प्रारंभ करना] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/185844/प्रारंभिक-निजी-स्थैतिक-सदस्य) –

उत्तर

7

static एक क्लास के भीतर के रूप में एक चर घोषणा में अच्छी तरह से, केवल एक घोषणा, है।

आप की जरूरत करने के लिए रूप में अच्छी तरह परिभाषित चर, एक भी संकलन इकाई में इस लाइन को जोड़ने जिसका अर्थ है:

int test::a = 0;

अधिक सटीक होना: एक संकलन इकाई मूल रूप से एक .cpp फ़ाइल है। आपको उस पंक्ति को सीधे हेडर फ़ाइल में रखना चाहिए, अन्यथा आपको विपरीत त्रुटि मिल जाएगी: "की एकाधिक परिभाषा ..."।

यह आपके द्वारा शुरू किए जाने के बाद, आपके चर को 0 पर प्रारंभ करने के बाद भी शुरू होगा।

यदि आप अपनी कक्षा घोषणा के तहत यह लाइन डालते हैं, तो यह आपकी समस्या को ठीक करेगा (इस विशिष्ट स्थिति में: इसे हेडर फ़ाइल में लिखना न भूलें)।

+2

"इसे हेडर फ़ाइल में न डालें" जोड़ने के लायक है, क्योंकि सभी को यह नहीं पता कि "संकलन इकाई" का अर्थ क्या है। – Elazar

+1

अच्छा बिंदु। मैं इसे अपने उत्तर में जोड़ दूंगा। – Nbr44

0

आपको स्थिर डेटा सदस्य उदाहरण को परिभाषित करना होगा। class test के रूप में और बाद class test की परिभाषा ही नाम स्थान दायरे में मूल रूप से कहीं भी सीधे एक लाइन को शामिल करें ...

int test::a; 

... main() ऊपर, या main() के तहत ...।

+0

इससे कोई फर्क नहीं पड़ता कि इसे कहां परिभाषित किया जाएगा। – Elazar

+0

@ एलिज़र: यह एक चक्रीय तर्क है, क्योंकि यदि आप इसे कहीं अवैध रखने की कोशिश करते हैं तो इसे परिभाषित नहीं किया जाएगा ;- पी। उपरोक्त 'मुख्य' का मेरा सुझाव यह सुनिश्चित करना था कि 'मुख्य()' (जो कि एक और घोषणा के तहत) के भीतर एक परिभाषा * प्रयास नहीं की गई थी, न ही 'कक्षा परीक्षण' से पहले या अंदर .... –

+0

@elazar जो नहीं है एकदम सच। कक्षा की घोषणा कि यह सदस्य होने की जरूरत है। – jrok

2

क्योंकि आप केवल, test::a घोषित किया है कि यह नहीं परिभाषित:

#include <iostream> 
class test 
{ 
    ... 
}; 

int test::a = 1; //Needs a definition! 
1

आप केवल static डेटा सदस्य घोषित किया है। आपने इसे परिभाषित नहीं किया है।

आपको इसे परिभाषित करने के लिए int test:: a; जैसे कुछ करने की आवश्यकता है।

this देखें भी

गैर स्थिर सदस्य स्थिर डेटा सदस्यों का उपयोग करने की अनुमति दी जाती है। रिवर्स की अनुमति नहीं है क्योंकि स्थैतिक सदस्य किसी ऑब्जेक्ट

1

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

class Animal 
{ 
    static int leg; 
    int Data; 
    public: 
     int Display(); 

}; 

int Animal::leg=20; // Need to define the static member 

int Animal::Display() 
    { 
     cout<<"A static value :"<<leg<<endl; 
     leg =40; 
     cout<<"A static value :"<<leg<<endl; 
    } 


int main(int argc, char** argv) 
{ 
Animal a; 
a.Display(); 
return 0; 
} 

अधिक विस्तार के लिए इस ब्लॉग देखें: [जब स्थिर सदस्यों का उपयोग कर लिंकर त्रुटि]
http://www.aticleworld.com/

संबंधित मुद्दे