2011-12-19 29 views
6

Tôi đã sao chép chương trình này từ một cuốn sách thực hành C++. Chuyện gì đang xảy ra đằng sau hậu trường?Tìm hiểu về các toán tử con trỏ tới thành viên

Sản lượng dự kiến ​​là:

tổng = 30 tổng = 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

"-> *" là một toán tử thay vì hai.Vì vậy, họ không thể được tách ra. Bạn KHÔNG THỂ viết "-> *". – fefe

+0

vấn đề đó được giải quyết. ai đó có thể giải thích nó làm việc xin vui lòng? –

+0

Xóa thẻ "visual-studio", vì nó không phải là vấn đề cụ thể đối với trình biên dịch – iammilind

Trả lời

1

Vấn đề là thêm vì khoảng trắng tại op-> *pf:

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

tôi nghĩ rằng @fefe có probab ly cho biết lý do trong nhận xét. ->* là một toán tử đơn lẻ, tương tự như .*. Vì vậy, nếu những 2 được tách ra, sau đó nó sẽ dẫn đến cú pháp khác nhau, trong đó cung cấp cho trình biên dịch lỗi.

+0

tôi đọc ở đâu đó rằng C++ không làm phiền về khoảng trắng. hãy thử nếu nó hoạt động. –

+0

vâng nó hoạt động :) bây giờ những gì đang xảy ra. –

+3

@ jeet.mg: toán tử là '-> *'. Bạn không thể đặt khoảng trống ở bất cứ nơi nào bạn thích (như 'dele te' không giống như' delete') – Mat

1

Hãy xem Pointer to class data. Và đối với lỗi, -> * là toán tử, bạn không thể đặt dấu cách giữa chúng.

+0

......................... cool :) –

1

iammilind đặt cược tôi vào lỗi; op-> *pf phải được thay đổi để bạn có ->* với tư cách là một nhà điều hành duy nhất - một số pointer to member operator (không thể tìm thấy liên kết tốt hơn). Khoảng trống trong op ->* pf hoàn toàn hợp lệ.

Điều này tương tự đối với một cái gì đó như i++; ++ là một nhà điều hành duy nhất và sẽ gây ra lỗi nếu bạn thử và có i+ +.

Bây giờ cho những gì nó đang làm. Ví dụ là một con trỏ đến một hàm thành viên. pf đang được khai báo là hàm thành viên của class M, có hai đối số int với loại trả về void. Nó đang được khởi tạo để trỏ đến hàm M::set_xy.

Bên main:

  • n là loại M, do đó để sử dụng pf gọi set_xy của n bạn muốn sử dụng .* điều hành: (n.*pf)(10, 20);. Tương đương với n.set_xy(10, 20);.

  • Kể từ op là loại M* (một con trỏ đến một đối tượng M), bạn sẽ cần phải sử dụng các nhà điều hành ->* và gọi hàm được trỏ đến bởi pf như: (op->*pf)(30, 40);, tương đương với op->set_xy(30, 40);

Bên sum:

  • các ví dụ đơn giản của con trỏ đến các biến thành viên/Ví dụ, như trái ngược với functi thành viên . Nó chỉ đơn giản là chứng minh làm thế nào bạn sẽ thêm cùng nhau m.xm.y bằng cách sử dụng các loại con trỏ.
Các vấn đề liên quan