2009-11-22 7 views
21

C++ continue de me surprendre. Aujourd'hui, j'ai découvert l'opérateur -> *. C'est surchargeable mais je n'ai aucune idée de comment l'invoquer. Je parviens à le surcharger dans ma classe mais je n'ai aucune idée de comment l'appeler.Qu'est-ce qu'un opérateur -> * en 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; 
} 

modifier:

Merci à la réponse. Pour appeler la fonction surchargée i écrire

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

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

+0

Non, vous n'appelez pas l'opérateur surchargé dans ce cas. Ce que vous appelez est le built-in. Votre opérateur surchargé nécessite un 'int' comme deuxième paramètre. – AnT

+0

@AndreyT: Mise à jour de la structure pour refléter la nouvelle main. –

Répondre

10

L'opérateur ->* surchargé est un opérateur binaire (alors que .* est pas surchargeable). Il est interprété comme un opérateur binaire ordinaire, donc en vous cas d'origine afin d'appeler cet opérateur que vous devez faire quelque chose comme

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

Qu'est-ce que vous lisez dans la réponse du Piotr applique au opérateurs intégrés, pas à votre surchargé. Ce que vous appelez dans votre exemple ajouté est également l'opérateur intégré, pas votre opérateur surchargé. Pour appeler l'opérateur surchargé, vous devez faire ce que je fais dans mon exemple ci-dessus.

+0

Votre droite à propos de réponse piotr mais avec elle j'ai compris comment appeler l'opérateur surchargé comme indiqué dans ma question éditée –

+2

+1. J'aurais aussi mis le pied chez Piotr. Mais ça fuit :) –

15

Tout comme .*, ->* est utilisé avec des pointeurs vers des membres. Il y a toute une section on C++ FAQ LITE dédiée aux pointeurs aux membres.

#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

Comme tout autre opperator, vous pouvez également appeler explicitement:

a.operator->*(2);