2016-07-19 15 views
5

संकलन/लिंकिंग प्रक्रिया के बारे में कई संदर्भ हैं, लेकिन मुझे एक और ठोस समस्या में दिलचस्पी है: कक्षा का संकलन।कक्षा का संकलन कैसे काम करता है?

प्रश्न उठता है क्योंकि आम तौर पर आप उपयोग करने से पहले चीजों को जानना आवश्यक है। उदाहरण के लिए: यदि आप पहले घोषित नहीं किया गया है तो आप फ़ंक्शन को कॉल नहीं कर सकते हैं।

कक्षाओं में, यह वैसे ही नहीं किया जाता है। आप प्रकट होने से पहले एक सदस्य का उपयोग कर सकते हैं। कंपाइलर क्या करता है? क्या मानक संकलन के पिछले चरण के बारे में कुछ कहता है?

अधिक विशिष्ट होने के लिए, निम्न उदाहरण दिखाता है कि हम नीचे परिभाषित सदस्यों का उपयोग कैसे कर सकते हैं।

#include <iostream> 

class EvenOdd { 
public: 
    EvenOdd(): value(0) {} 

    void assignEven(unsigned v) { 
     if (v>0 && v%2==1) { 
     std::cout << "Wrong call... is odd" << std::endl; 
     assignOdd(v); 
     } 
     else { 
     std::cout << "Right..." << v << " is Even" << std::endl; 
     value= v; 
     } 
    } 
    void assignOdd(unsigned v) { 
     if (v>0 && v%2==0) { 
     std::cout << "Wrong call... is even" << std::endl; 
     assignEven(v); 
     } 
     else { 
     std::cout << "Right..." << v << " is Odd" << std::endl; 
     value= v; 
     } 
    } 
private: 
    unsigned value; 
}; 

int main() 
{ 
    EvenOdd a; 
    std::cout << "Do it right..." << std::endl; 
    a.assignEven(2); 
    std::cout << "doing it wrong..." << std::endl; 
    a.assignEven(3); 
} 

हम भी इनलाइन कार्यों के बारे में आगे के प्रश्न जोड़ सकता है, के रूप में कॉल की बात के बाद परिभाषित किया जा सकता है और संकलक समस्याओं के बिना हल कर सकते हैं। मुझे लगता है कि जवाब संबंधित है।

अद्यतन: मुझे पता है कि संकलन/लिंकेज में कई कदम हैं। दूसरी ओर, यदि संकलक एक फ़ंक्शन परिभाषित बेलो को कॉल करने को स्वीकार करता है तो यह है कि संकलक ने कुछ अर्थों में कोड को समेकित किया है। सवाल यह है कि ¿किस प्रकार का पिछला चरण पहले किया जाता है? इसके अलावा ... मानक के किस हिस्से में हमें किसी सदस्य को परिभाषित करने के लिए संबंधित कुछ मिलता है?

यह जानने के लिए कि कंपाइलर कैसे काम करता है बहुत रोचक है क्योंकि इसे फ़ंक्शन बोले (कम से कम, शीर्षलेख) के बारे में विवरण जानना है जो वास्तव में संकलित करने के अनुरूप है। यहां तक ​​कि डेटा सदस्य को संकलित करना पड़ता है क्योंकि आपको

से ऊपर के फ़ंक्शन के संदर्भ में अपना प्रकार जोड़ना होगा, यह कोड की तरह काम करता है लेकिन यह उपर्युक्त उदाहरण के अनुरूप नहीं है क्योंकि दोनों फ़ंक्शन सदस्य एक-दूसरे को कॉल करते हैं। यह डेटा सदस्यों को पुन: व्यवस्थित करने जैसा है और कार्यों का शीर्षलेख संकलक द्वारा माना जाने वाला कोड हो सकता है।

+0

संकलन में एक से अधिक कदम हैं। – axiac

+1

@axiac हाँ, लेकिन ओपी इसके बारे में पता है। मुझे लगता है कि वे वास्तव में पूछते हैं कि एक समारोह के लिए पूर्व घोषणा करने की आवश्यकता क्यों है, लेकिन कक्षा के सदस्य के लिए नहीं। यह असंगत प्रतीत होता है। – luk32

+0

धन्यवाद @ luk32, यह सवाल है! – EFenix

उत्तर

7

मानक

एक वर्ग वर्ग विनिर्देशक के समापन } में एक पूरी तरह से परिभाषित ऑब्जेक्ट प्रकार (3.9) (या पूर्ण प्रकार) माना जाता है कहते हैं। वर्ग सदस्य-विनिर्देश के भीतर, वर्ग को फ़ंक्शन निकायों, डिफ़ॉल्ट तर्क, अपवाद-विनिर्देशों और डिफ़ॉल्ट सदस्य प्रारंभकर्ताओं (नेस्टेड कक्षाओं में ऐसी चीजों सहित) के रूप में पूर्ण माना जाता है। अन्यथा इसे अपने वर्ग के सदस्य-विनिर्देश के भीतर अपूर्ण माना जाता है।

यह विशेष रूप से इसका मतलब है कि एक सदस्य कार्य निकाय इसके नीचे घोषित कक्षा के सदस्यों को संदर्भित कर सकता है। मानक इस बात पर ध्यान नहीं देता कि कार्यान्वयन कैसे प्राप्त करते हैं। एक संभावित विधि सदस्य कार्य निकायों और वर्ग के समापन ब्रेस तक ऊपर निर्दिष्ट अन्य तत्वों के अर्थपूर्ण विश्लेषण स्थगित करना होगा।

0

कक्षाओं के भीतर कार्य पहुंचने और संशोधित कर सकते हैं (जब तक कार्य स्थिर नहीं होता) डेटा सदस्यों को घोषित किए बिना, क्योंकि डेटा सदस्यों को कक्षा में पहले ही घोषित किया जाता है। आपकी प्रतिक्रिया में क्यों कार्य में कक्षा में घोषणा की आवश्यकता नहीं है।

+0

दुर्भाग्य से 5 मिनट देर से ... (y) – hsqureshi

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