2009-11-22 3 views
21

C++ продолжает удивлять меня. Сегодня я узнал об операторе -> *. Он перегружен, но я не знаю, как его вызывать. Мне удается перегрузить его в моем классе, но я не знаю, как его назвать.Что такое -> * оператор в 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; 
} 

редактировать:

Благодаря ответу. Для вызова перегруженной функции я пишу

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: Обновление структуры для отражения нового основного. – 2009-11-22 20:07:41

ответ

10

Перегруженный ->* оператор является бинарным оператором (в то время как .* не Перегружаемые). Это интерпретируется как обычный бинарный оператор, так что у вас оригинальный корпус для того, чтобы вызвать этот оператор вы должны сделать что-то вроде

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

Что вы читаете в ответе Петра в относится к встроенным операторов, а не к вашему перегруженному. То, что вы называете в своем добавленном примере, также является встроенным оператором, а не вашим перегруженным. Чтобы вызвать перегруженного оператора, вы должны сделать то, что я делаю в моем примере выше.

+0

Ваше право на ответ Петра, но с ним я понял, как вызвать перегруженного оператора, как показано в моем отредактированном вопросе – 2009-11-22 20:05:03

+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); 
Смежные вопросы