2009-11-22 6 views
21

C++ überrascht mich weiterhin. Heute habe ich von dem Operator -> * erfahren. Es ist überladbar, aber ich habe keine Ahnung, wie ich es aufrufen soll. Es gelingt mir, es in meiner Klasse zu überlasten, aber ich habe keine Ahnung, wie ich es nennen soll.Was ist -> * Operator in C++?

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; 
} 

edit:

Dank der Antwort. So rufen Sie die überladene Funktion schreiben i

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

einfach: 'a -> * 42;' – sellibitze

+0

Nein, Sie nicht die überladenen Operator in diesem Fall nennen. Was Sie anrufen, ist der eingebaute. Ihr überladener Operator benötigt einen "int" als zweiten Parameter. – AnT

+0

@AndreyT: Aktualisierung der Struktur, um die neue Hauptversion widerzuspiegeln. –

Antwort

10

Der überladene ->* Operator ist ein binärer Operator (während .* nicht überladbaren). Es ist, als ein gewöhnlicher binärer Operator interpretiert, so in Sie ursprünglichen Fall, um diesen Operator wie etwas zu tun haben, zu nennen

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

Was Sie in der Piotr Antwort lesen gilt für die Einbau- Betreiber, nicht zu deiner überladenen. Was Sie in Ihrem zusätzlichen Beispiel nennen, ist auch der eingebaute Operator, nicht Ihr überladener. Um den überladenen Operator aufzurufen, müssen Sie das tun, was ich in meinem obigen Beispiel getan habe.

+0

Ihr Recht über Piotr Antwort, aber mit ihm habe ich herausgefunden, wie man den überladenen Operator wie in meiner bearbeiteten Frage –

+2

+1 angezeigt. Ich hätte auch Piotrs aufgewertet. Aber es leckt :) –

15

Genau wie .* wird ->* mit Zeigern auf Elemente verwendet. Es gibt einen ganzen Abschnitt on C++ FAQ LITE für Zeiger auf Mitglieder.

#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

Wie jede andere opperator, Sie können es auch explizit aufrufen:

a.operator->*(2);