2009-11-22 24 views
21

सी ++ मुझे आश्चर्यचकित करता है। आज मुझे -> * ऑपरेटर के बारे में पता चला। यह अधिभार योग्य है लेकिन मुझे नहीं पता कि इसे कैसे शुरू किया जाए। मैं इसे अपनी कक्षा में अधिभारित करने का प्रबंधन करता हूं लेकिन मुझे कोई संकेत नहीं है कि इसे कैसे कॉल करें।सी ++ में ऑपरेटर -> * ऑपरेटर क्या है?

struct B { int a; }; 

struct A 
{ 
    typedef int (A::*a_func)(void); 
    B *p; 
    int a,b,c; 
    A() { a=0; } 
    A(int bb) { b=b; c=b; } 
    int operator + (int a) { return 2; } 
    int operator ->* (a_func a) { return 99; } 
    int operator ->* (int a) { return 94; } 
    int operator * (int a) { return 2; } 
    B* operator ->() { return p; } 


    int ff() { return 4; } 
}; 


void main() 
{ 
    A a; 
    A*p = &a; 
    a + 2; 
} 

संपादित करें:

जवाब देने के लिए धन्यवाद। अतिभारित समारोह कॉल करने के लिए मैं लिख

void main() 
{ 
    A a; 
    A*p = &a; 
    a + 2; 
    a->a; 
    A::a_func f = &A::ff; 
    (&a->*f)(); 
    (a->*f); //this 
} 
+0

सरल: 'एक -> * 42; अतिभारित इस मामले में ऑपरेटर' – sellibitze

+0

नहीं, आप न बुलाया जाए। आप जो कहते हैं वह अंतर्निहित है। आपके अधिभारित ऑपरेटर को दूसरे पैरामीटर के रूप में 'int' की आवश्यकता होती है। – AnT

+0

@AndreyT: नए मुख्य को प्रतिबिंबित करने के लिए संरचना को अद्यतन करना। –

उत्तर

10

अतिभारित ->* ऑपरेटर एक द्विआधारी ऑपरेटर है (जबकि .* overloadable नहीं है)। यह एक साधारण द्विआधारी ऑपरेटर के रूप में व्याख्या की है तो आप क्रम में है कि ऑपरेटर आप की तरह

A a; 
B* p = a->*2; // calls A::operator->*(int) 

क्या आप पायोत्र के जवाब में पढ़ा निर्मित ऑपरेटरों पर लागू होता है कुछ करने के लिए कॉल करने के लिए मूल मामला है, अपने अधिभारित नहीं है। आपके द्वारा जोड़े गए उदाहरण में आप जो भी कहते हैं वह अंतर्निहित ऑपरेटर है, न कि आपके अधिभारित। ओवरलोडेड ऑपरेटर को कॉल करने के लिए आपको उपरोक्त मेरे उदाहरण में जो करना है वह करना है।

+0

पियटर उत्तर के बारे में आपका अधिकार लेकिन इसके साथ मुझे पता चला कि ओवरलोडेड ऑपरेटर को कैसे कॉल किया जाए जैसा कि मेरे संपादित प्रश्न –

+2

+1 में दिखाया गया है। मैं पियेटर के ऊपर भी उभरा होता। लेकिन यह लीक :) –

15

बस .* की तरह, ->* सदस्यों के लिए संकेत के साथ प्रयोग किया जाता है। पॉइंटर्स-टू-सदस्यों को समर्पित एक संपूर्ण अनुभाग on C++ FAQ LITE है।

#include <iostream> 

struct foo { 
    void bar(void) { std::cout << "foo::bar" << std::endl; } 
    void baz(void) { std::cout << "foo::baz" << std::endl; } 
}; 

int main(void) { 
    foo *obj = new foo; 
    void (foo::*ptr)(void); 

    ptr = &foo::bar; 
    (obj->*ptr)(); 
    ptr = &foo::baz; 
    (obj->*ptr)(); 
    return 0; 
} 
1

किसी अन्य opperator की तरह, आप भी यह स्पष्ट रूप से कॉल कर सकते हैं:

a.operator->*(2); 
संबंधित मुद्दे