2011-12-19 27 views
6

मैंने इस प्रोग्राम को सी ++ अभ्यास पुस्तक से कॉपी किया है। दृश्यों के पीछे क्या चल रहा है?पॉइंटर-टू-सदस्य ऑपरेटरों को समझना

उम्मीद उत्पादन होता है:

राशि = 30 योग = 70

#include<iostream> 
using namespace std; 

class M 
{ 
    int x; 
    int y; 
public: 
    void set_xy(int a, int b) 
    { 
     x=a; 
     y=b; 
    } 
    friend int sum(M m); 
}; 

int sum (M m); 
//so far so good, problem begins from here. what's happening after here? 
{        
    int M ::*px = &M ::x; 
    int M ::*py = &M ::y; 
    M *pm =&m; 
    int s= m.*px+ pm->*py; 
    return s; 
} 

int main() 
{ 
    M n; 
    void (M :: *pf)(int, int) = &M ::set_xy; 
    (n.*pf)(10, 20); 
    cout <<"sum=" << sum(n) << endl; 

    M *op= &n; 
    (op-> *pf)(30,40); 
    cout << "sum=" << sum(n)<< endl; 

    cin.ignore(); 
    getchar(); 
    return 0; 
} 
+0

"-> *" दो के बजाय एक ऑपरेटर है।तो वे अलग नहीं किया जा सकता है। आप लिख नहीं सकते "-> *"। – fefe

+0

कि समस्या हल हो गई है। क्या कोई इसे समझाने की व्याख्या कर सकता है? –

+0

टैग "विजुअल-स्टूडियो" को हटा रहा है, क्योंकि यह संकलक – iammilind

उत्तर

1

समस्या की वजह से अतिरिक्त व्हाइटop-> *pf पर है:

(op->*pf)(30,40); // ok 

मैं लगता है @fefe probab है ly टिप्पणी में कारण कहा। ->* एक एकल ऑपरेटर है, .* के समान। इसलिए, यदि वे 2 अलग हैं, तो इसके परिणामस्वरूप विभिन्न वाक्यविन्यास होंगे, जो संकलक त्रुटि देता है।

+0

मैंने कहीं पढ़ा है कि सी ++ सफेद रिक्त स्थान के बारे में परेशान नहीं है। आइए कोशिश करें कि यह काम करता है। –

+0

हाँ यह काम कर रहा है :) अब क्या हो रहा है। –

+3

@ jeet.mg: ऑपरेटर '-> *' है। आप कहीं भी रिक्त स्थान नहीं डाल सकते हैं (जैसे 'dele te'' delete' के समान नहीं है) – Mat

1

Pointer to class data पर एक नज़र डालें। और त्रुटि के लिए, -> * एक ऑपरेटर है, आप उनके बीच एक जगह नहीं डाल सकते हैं।

+0

......................... शांत :) –

1

iammilind मुझे त्रुटि के लिए शर्त; op-> *pf को बदला जाना चाहिए ताकि आपके पास एक ही ऑपरेटर के रूप में ->* एक साथ हो - pointer to member operator (बेहतर लिंक नहीं मिला)। op ->* pf में व्हाइटस्पेस पूरी तरह से मान्य है।

यह i++ जैसे कुछ के लिए समान है; ++ एक एकल ऑपरेटर है और यदि आप कोशिश करते हैं और i+ + है तो एक त्रुटि होगी।

अब यह क्या कर रहा है इसके लिए। उदाहरण सूचक के सदस्य फ़ंक्शन का है। pf को class M के सदस्य फ़ंक्शन के रूप में घोषित किया जा रहा है, जिसमें void रिटर्न प्रकार के साथ दो int तर्क होते हैं। इसे M::set_xy फ़ंक्शन पर इंगित करने के लिए प्रारंभ किया जा रहा है।

main के अंदर: (n.*pf)(10, 20);:

  • n इसीलिए उसे pf उपयोग करने के लिए n की set_xy कॉल करने के लिए आप .* ऑपरेटर का उपयोग करेंगे में, प्रकार M की है। यह n.set_xy(10, 20); के बराबर है। (op->*pf)(30, 40);, जो op->set_xy(30, 40);

के बराबर है:

  • op के बाद प्रकार M* (एक M वस्तु के लिए एक सूचक), तो आपको ->* ऑपरेटर का उपयोग और कॉल समारोह के रूप में pf द्वारा की ओर इशारा करने की आवश्यकता होगी की है

    sum के अंदर:

    • उदाहरण के रूप में सदस्य कामकाज करने का विरोध किया, बस सदस्य/उदाहरण चर के संकेत के हैं ऑन। यह बस प्रदर्शित करता है कि आप m.x और m.y को उन प्रकार के पॉइंटर्स का उपयोग करके कैसे जोड़ देंगे।