मुझे पता है कि आप आमतौर पर एक .cpp फ़ाइल के भीतर से एक स्थिर सदस्य चर प्रारंभ करते हैं। लेकिन मेरा सवाल है: आप पर क्यों हैं? सी ++ स्थैतिक सदस्य चर प्रारंभ करने के लिए आप _have_ क्यों करते हैं?
#include <vector>
using namespace std;
class A {
public:
static vector<int> x;
};
main() {
int sz = A::x.size();
}
यह एक संकलक त्रुटि देता है: undefined reference to 'A::x'
हालांकि, इस:
#include <vector>
using namespace std;
class A {
public:
static vector<int> x;
};
// Initialize static member
vector<int> A::x;
main() {
int sz = A::x.size();
}
compiles और ठीक चलाता
यहाँ एक उदाहरण है।
मैं समझ सकता हूं कि क्या मैं डिफ़ॉल्ट कन्स्ट्रक्टर के अलावा किसी अन्य का उपयोग कर वेक्टर शुरू कर रहा था, लेकिन मैं नहीं हूं। मैं सिर्फ आकार 0 के एक वेक्टर चाहता हूँ। निश्चित रूप से, किसी भी स्थिर सदस्यों को प्रोग्राम प्रारंभिकरण पर स्मृति आवंटित करनी होगी, तो संकलक केवल डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग क्यों नहीं करता है?
+1 लेकिन आपको डुप्लिकेट में से एक को हटाना चाहिए। वस्तुओं के लिए, आरएआईआई परिभाषा का परिणाम प्रारंभिक बनाता है (भले ही केवल डिफ़ॉल्ट कन्स्ट्रक्टर द्वारा)। क्या यह कच्चे पॉइंटर्स, बिल्टिन प्रकारों जैसे 'int' के लिए काम करता है? –
मेरा मतलब था कि यदि आप चाहते हैं तो आप वहां प्रारंभिक जोड़ सकते हैं। मैं परिशुद्धता जोड़ दूंगा। – Klaim
@ स्टेव पीओडी प्रकार कन्स्ट्रक्टर केवल वाक्य रचनात्मक हैं, इसलिए हाँ यह काम करता है, लेकिन यह वास्तव में कुछ भी नहीं करता है (या इससे भी अधिक सटीक होने के लिए, इसे कुछ भी करने की अनुमति नहीं है - सी ++ मानक द्वारा)। –