2011-12-19 17 views
6

Skopiowałem ten program z książki ćwiczeń w języku C++. Co dzieje się za kulisami?Opis operatorów Wskaźnika-do-członka

oczekiwany wynik to:

suma = 30 suma = 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

"-> *" to jeden operator zamiast dwóch.Więc nie można ich rozdzielić. NIE MOŻNA pisać "-> *". – fefe

+0

ten problem został rozwiązany. Czy ktoś może wyjaśnić, że działa, proszę? –

+0

Usuwanie znacznika "visual-studio", ponieważ nie jest to problem specyficzny dla kompilatora – iammilind

Odpowiedz

1

Problem jest z powodu dodatkowa spacja w op-> *pf:

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

I think @fefe ma probab Powiedziałem powód w komentarzu. ->* to pojedynczy operator, podobny do .*. Zatem jeśli te 2 są rozdzielone, to spowoduje to inną składnię, co spowoduje błąd kompilatora.

+0

Czytałem gdzieś, że C++ nie zawraca sobie głowy obszarami białymi. spróbujmy, jeśli to działa. –

+0

tak to działa :) teraz co się dzieje. –

+3

@ jeet.mg: operator to '-> *'. Nie możesz umieścić spacji w dowolnym miejscu (np. 'Dele te' to nie to samo co' delete') – Mat

1

Spójrz na Pointer to class data. I dla błędu, -> * jest operatorem, nie można umieścić spacji między nimi.

+0

......................... fajnie :) –

1

iammilind Założę się do błędu; op-> *pf musi być zmieniony, aby ->* razem jako jeden operator - pointer to member operator (nie można znaleźć lepszego łącza). Biała spacja w op ->* pf jest całkowicie poprawna.

To samo dotyczy czegoś takiego jak i++; ++ jest pojedynczym operatorem i spowoduje błąd, jeśli spróbujesz i uzyskasz i+ +.

Teraz za to, co robi. Przykładem jest wskaźnik dla funkcji członka. pf jest zadeklarowana jako funkcja składowa class M, która przyjmuje dwa argumenty: int z typem zwracanym void. Został zainicjowany, aby wskazać funkcję M::set_xy.

Wewnątrz main:

  • n jest typu M, dlatego w celu wykorzystania pf zadzwonić set_xy z n chcesz użyć operatora .*: (n.*pf)(10, 20);. Odpowiada to n.set_xy(10, 20);.

  • Od op jest typu M* (wskaźnik do obiektu M), musisz użyć operatora ->* i wywołania funkcji wskazywanej przez pf jak: (op->*pf)(30, 40);, co jest równoznaczne z op->set_xy(30, 40);

Wewnątrz sum:

  • przykłady są po prostu wskaźników do zmiennych członek/instancji, w przeciwieństwie do zarejestrował functi ons. Po prostu pokazuje, jak dodać razem m.x i m.y używając tych typów wskaźników.