2012-11-23 27 views
18

यहाँ एक न्यूनतम काम कर उदाहरण हैस्थिर सदस्य फ़ंक्शन _declared_ स्थिर क्यों है, लेकिन _defined_ अन्यथा C++ में?</p> <p>आह:

class A{ 
     static int a_member_function(); 
}; 

A.cpp

#include "A.h" 
int A::a_member_function(){return 5;} 


int main(){ return 1;} 

इस कोड को संकलित करता है तथा रन है, लेकिन, मुझे लगता है कि:

static int A::a_member_function(){return 5;} 

सी के स्थिर सदस्य फ़ंक्शन को परिभाषित करने के लिए आसानी से उपयोग किया जा सकता है वास्तव में, ऐसा लगता है कि यह वास्तव में इस आवश्यकता के लिए उपयोगी हो सकता है, क्योंकि यह .cpp फ़ाइल के पाठक को याद दिलाएगा कि a_member_function स्थिर है।

बहरहाल, यह स्पष्ट रूप से काम नहीं करता है:

error: cannot declare member function ‘static int A::a_member_function()’ to have static linkage [-fpermissive] 

तो यह क्यों काम नहीं करता है? इस फैसले के पीछे तर्क क्या है?

उत्तर

23

पीछे की वजह सी ++ भावना है जो इसके कीवर्ड की संख्या को कम करने और कम करने के लिए है और सी: static के साथ पिछड़े संगतता को उस स्थिति में पूरी तरह से अलग अर्थ है।

यह सभी सी में वापस भविष्यवाणी करता है सी में "स्थैतिक" फ़ंक्शंस वे संकलन इकाई (एसी फ़ाइल) के लिए अद्वितीय हैं। उन्हें अन्य संकलन इकाइयों द्वारा उपयोग नहीं किया जा सकता है (यह सी में encapsulation करने का एक तरीका है)। यह उपयोग अभी भी सी ++ में मान्य है। आप अपने दायरे को सीमित करने के लिए वैश्विक चर के लिए भी ऐसा ही कर सकते हैं।

हालांकि, सी ++ में आप सदस्य कार्यों को static के रूप में अलग-अलग कारणों से घोषित करना चाहते हैं: ये कार्य कक्षा से संबंधित हैं, लेकिन आवश्यकता वर्ग और चलाने के उदाहरण की आवश्यकता नहीं है (मुझे यकीन है कि आप पहले ही जानते हैं, मैं बस कोशिश कर रहा हूं पूरा होने के लिए)।

static के रूप में सदस्य फ़ंक्शन को परिभाषित करना एक विरोधाभास का कारण बन जाएगा: उस फ़ंक्शन को इसकी अनुवाद इकाई के बाहर एक्सेस किया जाना चाहिए।

सी और सी ++ के बीच कीवर्ड पुन: उपयोग का एक और मामला है,कीवर्ड C++ 11 में कीवर्ड है, लेकिन यह समस्या होने की संभावना कम है।

नोट: एक ही बात virtual कीवर्ड जो घोषणा और न परिभाषा में मौजूद है के साथ होता है।

+0

आह। किसी तरह की भावना बनाता है। धन्यवाद! –

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

  • कोई संबंधित समस्या नहीं^_^