2012-03-30 41 views
5

Tôi đã đọc một C++ hướng dẫn cơ bản khi tôi phải đối mặt vớigì là :: * trong C++

::* 

trong đoạn mã sau. Tôi có thể biết điều đó là:

class A { 
public: 
protected: 
    int i; 
}; 


class B : public A { 
    friend void f(A*, B*); 
    void g(A*); 
}; 

void f(A* pa, B* pb) { 
// pa->i = 1; 
    pb->i = 2; 

// int A::* point_i = &A::i; 
    int A::* point_i2 = &B::i; 
} 

void B::g(A* pa) { 
// pa->i = 1; 
    i = 2; 

// int A::* point_i = &A::i; 
    int A::* point_i2 = &B::i; 
} 

void h(A* pa, B* pb) { 
// pa->i = 1; 
// pb->i = 2; 
} 

int main() { } 

dựa trên C++ của tôi kiến ​​thức cho đến nay, tôi không thể hiểu được cái gì đó như

int A::* point_i2 

bạn có thể giúp tôi không?

cảm ơn bạn.

+6

Hướng dẫn C++ cơ bản? Không có "cơ bản" C++ bất cứ điều gì nên được bao gồm các con trỏ thành viên. Bạn có liên kết đến hướng dẫn đó không? –

+0

@NicolBolas có thể không rất cơ bản :) http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr129.htm – rahman

Trả lời

6

point_i2 là con trỏ tới thành viên. Nó có nghĩa là nó trỏ đến biến thành viên int được khai báo trong lớp A.

3
int A::* point_i2 = &B::i; 

Sau này khi bạn có một ngẫu nhiên A hoặc B đối tượng, bạn có thể truy cập các thành viên đó point_i2 điểm để

B b; 
b.*point_i2 = ...; 

Sau khi khởi tạo ở trên của point_i2, điều này sẽ thay đổi b.i.

Hãy suy nghĩ về ClassName::* giống như cách bạn nghĩ về &*: Nó chỉ là một "con trỏ/công cụ tương tự tham chiếu" khác mà bạn có thể sử dụng trong các khai báo để xác định thứ bạn khai báo.

+0

Vì vậy, điều này giống như một "con trỏ lớp thành viên"? Cũng giống như các con trỏ lớp phương pháp? – Gui13

+4

Nói cách đơn giản hơn. * Con trỏ tới một thành viên của lớp *. –

+0

@Gui con trỏ lớp phương thức là gì? Bạn có nghĩa là 'FunctionType A :: *'? Vâng, Chúng giống nhau. Một con trỏ tới thành viên dữ liệu có kiểu thành viên là một kiểu đối tượng, trong khi một con trỏ tới hàm thành viên có kiểu thành viên là một kiểu hàm. Cú pháp, bạn cũng có thể sử dụng cú pháp khai báo hàm cho kiểu hàm để làm cho nó trông giống như 'r (A :: *) (tham số) cv-qual ref-qual ngoại trừ-spec'. Mặc dù nếu bạn không quen thuộc với cú pháp C++ thì việc sử dụng các mẫu bí danh và viết 'bí danh A :: *' sẽ dễ dàng hơn. –