2014-09-22 9 views
12

बनाने/स्क्रीन पर बक्से अद्यतन करने के लिए एक वर्ग को लागू करते हुए मैं एक स्थिर सदस्य समारोह सुनिश्चित करें कि कोई वर्तमान में दृश्यमान बक्से ओवरलैप (सभी वर्तमान में दृश्यमान बक्से को एक स्थिर सूचक सरणी से इसकी जानकारी लेने)एक स्थिर सदस्य फ़ंक्शन केवल कक्षा परिभाषा के अंदर स्थैतिक घोषित क्यों किया जा सकता है और इसकी परिभाषा में भी नहीं?

करता है कि जोड़ना चाहते थे

class Box 
{ 
public: 
    // ... 
    static void arrangeOverlappingBoxes(); 
}; 

static void Box::arrangeOverlappingBoxes() 
{ 
    // ... 
} 

मैं काफी हैरान हूँ कि यह एक त्रुटि C2724 उत्पन्न था: 'स्थिर' फ़ाइल दायरे में परिभाषित सदस्य कार्यों पर नहीं किया जाना चाहिए मेरी प्रारंभिक कोड निम्नलिखित संरचना था।

कुछ परीक्षण, गूगल और त्रुटि के साथ

, मैं पता लगा कि मेरे समारोह परिभाषा कीवर्ड static, अर्थात खोना चाहिए यह किया जाना चाहिए

void Box::arrangeOverlappingBoxes() 
{ 
    // ... 
} 

अभी तक मैं कोई सुराग नहीं क्या इस के पीछे तर्क हो सकता है। ऐसा लगता है कि वर्ग परिभाषा और इसकी परिभाषा में इसकी घोषणा के लिए एक अलग फ़ंक्शन हेडर होना असंवेदनशील और भ्रमित है। इस के लिए कोई कारण है?

उत्तर

7

आपका वर्ग परिभाषा (हेडर फाइल में) समारोह जो कुछ भी साथ propreties जरूरी हैं प्रदान करेगा:

  • स्थिर
  • inlined
  • आभासी

यह देखते हुए कि हर आगे वस्तु होगा .h का उपयोग करके अपनी कक्षा परिभाषा को देखें, फिर यह समझ में आता है कि इन गुणों को परिभाषित किया जाना चाहिए।

इसके अलावा, कक्षा से प्रत्येक कार्य व्युत्पन्न कक्षाओं में इसकी संपत्ति का उल्लेख करेगा (उदाहरण के लिए आपको केवल अपनी बेस क्लास में विनाशक आभासी घोषित करने की आवश्यकता है, हर बाद की विरासत विनाशक को वर्चुअल के रूप में ले जाएगी)।

आपके कार्यान्वयन निकाय में इन गुणों को फिर से शुरू करने का कोई मतलब नहीं है।

दोनों .h और .cpp फ़ाइलों में फ़ंक्शन प्रॉपर्टीज घोषित करने के लिए वास्तव में समस्याओं का आवंटन होगा। इस परिदृश्य की कल्पना करें: आप एक .h फ़ाइल में वर्चुअल के रूप में फ़ंक्शन घोषित करते हैं, और .cpp फ़ाइल में स्थिर के रूप में। कंपाइलर उस समारोह को क्या करेगा? वर्चुअल या स्थिर? (या अधिक संकलन त्रुटि की संभावना है, लेकिन संकलक त्रुटि आपको केवल आपके .cpp फ़ाइल में शीर्षलेख में घोषणा करने के लिए आग्रह करेगी। आप "स्थिर" या "वर्चुअल" के अनुसार फ़ंक्शन को अधिभारित नहीं कर सकते हैं)।

+0

आपके उत्तर के लिए धन्यवाद लेकिन मुझे अभी भी अभी तक बिंदु नहीं मिलता है। संकलक को केवल गुणों के समान संकलित करने के लिए प्रोग्राम किया जा सकता है, जैसे पैरामीटर बराबर होना चाहिए (वास्तव में, जावा सिंटैक्स को इस तरह से होना आवश्यक है)। तो आप क्यों कहेंगे कि इसका कोई मतलब नहीं है? मेरी विनम्र राय में, यह बहुत समझ में आता है: यदि आप अपनी सीपीपी फ़ाइल में देखते हैं (मान लें कि आपकी कक्षा परिभाषा हेडर में है), तो आप तुरंत देखते हैं कि फ़ंक्शन स्थिर है और उदाहरण के लिए, यह पॉइंटर नहीं है अपने हेडर फ़ाइल में देखने के बिना। –

+0

इस बारे में सोचें: यदि आपको .cpp और .h दोनों में फ़ंक्शन प्रकार निर्दिष्ट करने की अनुमति दी गई तो क्या समस्याएं उत्पन्न होंगी? आप देखेंगे कि कंपाइलर वास्तव में आपके .cpp में उसी प्रॉपर्टी के साथ फ़ंक्शन को लागू करने के लिए मजबूर करेगा, जैसा कि हेडर फ़ाइल में है, अन्यथा आपको एक अनसुलझा बाहरी प्रतीक लिंकेज त्रुटि मिलेगी (याद रखें कि सभी बाह्य वर्गों की परिभाषा के साथ लिंक शीर्षलेख से कार्य)। इसलिए यह इस संपत्ति को सीपीपी फ़ाइल में घोषित करने के लिए अनुकूल होगा।सी ++ उतना ही जटिल है जितना कि, अतिरिक्त चुनौतियों की आवश्यकता नहीं है;)। – MichaelCMS

+0

आपकी संपादित टिप्पणी के संबंध में: आप या तो "स्थिर" या ऐसे विशेषताओं को रेखांकित करने के लिए नामकरण सम्मेलनों या टिप्पणियों का उपयोग कर सकते हैं। जब मैं विधि प्रकारों की बात करता हूं तो आप व्यक्तिगत रूप से हेडर फाइलों में देखते हैं (आप घोषणा करते हैं और परिभाषा पर जाते हैं) ... शायद यह शैली का मामला है – MichaelCMS

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

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