2010-05-06 13 views
7

मैंने कक्षा के सदस्यों को पॉइंटर्स के बारे में पढ़ा है, लेकिन मैंने कभी उन्हें किसी भी व्यावहारिक अनुप्रयोगों में उपयोग नहीं किया है। क्या कोई समझा सकता है कि ऐसे पॉइंटर्स के उपयोग के मामले क्या हैं? क्या इस तरह के पॉइंटर्स रखना वास्तव में आवश्यक है?कक्षा के सदस्यों के लिए पॉइंटर्स क्या हैं?

उदा।

class abc 
{ 
public: 
    int a; 
    abc(int val) { a = val; } 
}; 

int main() 
{ 
    int abc::*data; 
    abc obj(5); 

    data = &abc::a; 

    cout << "Value of a is " << obj.*data << endl; 

    return 0; 
} 

उपर्युक्त उदाहरण में। इस तरह से 'ए' का मूल्य क्यों उपयोग किया जाता है? कक्षा के सदस्यों को पॉइंटर्स का उपयोग करने का क्या फायदा है?

उत्तर

9

एक सूचक करने वाली किसी सदस्य या सूचक-टू-सदस्य-समारोह का सबसे बड़ा लाभ यह आप

  • एक विशिष्ट उदाहरण के लिए बाध्य करने के लिए सही दूर
  • की जरूरत नहीं है की जरूरत नहीं है कि है सदस्य नामों पर कोई प्रतिबंध लगाने के लिए, केवल प्रकार का मिलान करना होगा।

इसका उपयोग उदाहरण के लिए किया जा सकता है। कॉल-पीठ या अमूर्त एल्गोरिदम:

std::map<int,int> m; 
m.insert(std::make_pair(1,2)); 
m.insert(std::make_pair(3,4)); 
m.insert(std::make_pair(5,6)); 
std::ptrdiff_t s = 
    std::count_if(m.begin(), m.end(), 
        boost::bind(&std::map<int,int>::value_type::first, _1) > 2); 
std::cout << s << std::endl; // 2 

नोट Boost.Bind, Boost.Function और उनके TR1 समकक्ष पहले से ही अच्छी तरह से है कि संपुटित है कि आप के लिए। एक निश्चित डिग्री के लिए वर्तमान मानक में जैसे <functional> में टूल भी शामिल हैं।

+0

'std :: mem_fun()' et al। पॉइंटर-टू-सदस्य पर भरोसा करें। – wilhelmtell

+0

हां, लेकिन वे उपयोग को समाहित करते हैं - मुझे थोड़ी देर के लिए पॉइंटर्स-टू-सदस्य घोषित करने की शायद ही कभी आवश्यकता है। –

+0

प्रदर्शन की स्पष्टता के लिए, शायद मैंने 'मानचित्र :: ऑपरेटर [] 'का उपयोग किया होगा:' insert' और 'make_pair' संयोजन इतना verbose है: p अच्छा उत्तर धन्यवाद :) –

2

आप MFC का इस्तेमाल किया है, तो आप सदस्य समारोह अवधारणा के लिए संकेत देखेंगे भारी (आंतरिक) प्रयोग किया जाता है

DECLARE_MESSAGE_MAP, BEGIN_MESSAGE_MAP, END_MESSAGE_MAP Message Maps

0

देखें प्रश्न मुझे लगता है: "क्या सूचक करता है सदस्य डेटा के लिए डेटा के लिए सरल सूचक में जोड़ें? " और एकमात्र उत्तर जो मैं सोच सकता हूं वह स्पष्ट अर्थ का स्तर है: हम में कक्षा में डेटा इंगित कर रहे हैं।

अब मैं इरादे के कुछ अतिरिक्त दस्तावेज़ीकरण प्रभावी ढंग से कुछ मूल्य देख सकता हूं। एक उदाहरण मैंने देखा है कि काफी शक्तिशाली हो सकता है जब हमारी "कक्षा" वास्तव में एक विरासत सी संरचना है। अब हमारे पास उस संरचना का कोई स्थानीय तरीका नहीं है, इसलिए कुछ पॉइंटर्स जो स्पष्ट रूप से उस संरचना से जुड़े हुए हैं, हमारे कोड को स्पष्ट कर सकते हैं।

+1

यदि आप कक्षा आवृत्ति और चर दोनों निर्दिष्ट करते हैं, तो आपके पास एक सामान्य सूचक (पता पूरी तरह निर्दिष्ट है)। यह तब होता है जब आप चर निर्दिष्ट करते हैं लेकिन क्लास इंस्टेंस नहीं करते हैं कि आपको पॉइंटर-टू-सदस्य मिलता है, जो कि उदाहरण की शुरुआत से ऑफसेट है, जहां वह चर संग्रहीत होता है। कक्षा के किसी भी उदाहरण में चर को दूर करने और चर का उपयोग करने के लिए पर्याप्त जानकारी है। –

0

सूचक करने वाली सदस्य सभी सी ++ सुविधाओं, कुछ आप पहले से ही शुद्ध सी

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

पॉइंटर्स-टू-सदस्य-फ़ंक्शन थोड़ा और जटिल हैं। पहली नज़र में, वे साधारण फ़ंक्शन पॉइंटर्स की तरह हैं जो जानते हैं कि छुपे हुए 'इस' सूचक को कैसे पास किया जाए। लेकिन वर्चुअल फ़ंक्शन एक साधारण विचार को बहुत जटिल बनाते हैं।

और वर्चुअल बेस क्लासेस सभी पॉइंटर्स-टू-सदस्य को बहुत जटिल बनाते हैं। यह ऐसा कुछ नहीं है जिसे आप सरल सी संरचनाओं का उपयोग करके स्वयं कोड करना चाहते हैं। लेकिन जटिल मामले दुर्लभ हैं।

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