2010-10-20 21 views
56

मैं स्कॉट मेयर्स 'Effective C++ पढ़ रहा हूं। वह गुण कक्षाओं के बारे में बात कर रहा है, मुझे समझ में आया कि मुझे संकलन समय के दौरान वस्तु के प्रकार को निर्धारित करने की आवश्यकता है, लेकिन मैं वास्तव में इन वर्गों के बारे में उनकी व्याख्या को समझ नहीं पा रहा हूं? (तकनीकी दृष्टि से)कक्षाएं कैसे काम करती हैं?

उत्तर

45

शायद आप किसी प्रकार का जादू की उम्मीद कर रहे हैं जो प्रकार के गुणों को काम करता है। उस मामले में, निराश हो - कोई जादू नहीं है। टाइप प्रकार मैन्युअल रूप से प्रत्येक प्रकार के लिए परिभाषित हैं। उदाहरण के लिए, iterator_traits पर विचार करें, जो टाइटरफ़ीस (उदा। value_type) इटरेटर के लिए प्रदान करता है।

उन्हें का उपयोग करके आप

iterator_traits<vector<int>::iterator>::value_type x; 
iterator_traits<int*>::value_type y; 
// `x` and `y` have type int. 

लिख सकते हैं लेकिन यह काम करने के लिए, वहाँ वास्तव में एक स्पष्ट परिभाषा<iterator> हैडर, जो कुछ इस तरह पढ़ता में कहीं है:

template <typename T> 
struct iterator_traits<T*> { 
    typedef T value_type; 
    // … 
}; 

यह आंशिक विशेषज्ञताiterator_traitsT* के प्रकार के प्रकार के प्रकार है, यानी पॉइंटर्स कुछ सामान्य प्रकार।

उसी नस में, iterator_traits अन्य iterators के लिए विशिष्ट हैं, उदा। typename vector<T>::iterator। प्रभावी ढंग से सिद्धांत और कार्यान्वयन के संयोजन के लिए

+4

कोई जादू के लिए +1। हालांकि, क्या कुछ लक्षण नहीं हैं (उदाहरण के लिए सी ++ 0x मानक लाइब्रेरी में) जिन्हें विश्वसनीय रूप से केवल भाषा का उपयोग करके परिभाषित नहीं किया जा सकता है, और इसे कंपाइलर से काम करने के लिए विशेष "जादुई" सहायता चाहिए? – UncleBens

+0

@UncleBens: मुझे नहीं पता कि कौन से लक्षण सी ++ 0x परिभाषित करता है लेकिन मुझे यकीन है कि सी ++ 0x से पहले ऐसा कोई गुण मौजूद नहीं है। –

+2

* अब * एक प्रकार का जादू ['std :: underlying_type'] (http://en.cppreference.com/w/cpp/types/underlying_type) में काम कर रहा है? – Wolf

38

गुण कक्षाएं ऑब्जेक्ट के प्रकार को निर्धारित करती हैं। इसके बजाए, वे एक प्रकार के बारे में अतिरिक्त जानकारी प्रदान करते हैं, आमतौर पर विशेषता के अंदर टाइपिफ या कॉन्स्टेंट को परिभाषित करके।

+5

+1। –

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