2012-03-30 91 views
5

我在讀一個基本的C++教程時,我在下面的代碼面臨是什麼:: *在C++

::* 

。我想知道那是什麼:

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() { } 

根據我的C++知識到目前爲止,我無法理解像

int A::* point_i2 

你能幫助我嗎?

謝謝。

+6

「基本」C++教程?沒有「基本」的C++任何東西都應該覆蓋成員指針。你有鏈接到該教程? – 2012-03-30 08:27:04

+0

@NicolBolas可能不是很基本的:) http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr129.htm – rahman 2012-03-30 08:39:15

回答

6

point_i2是指向成員的指針。這意味着它指向在類A中聲明的int成員變量。

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

在此之後,當你有一個隨機AB對象,您可以訪問point_i2

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

point_i2上述初始化之後,這將改變b.i成員。

ClassName::*像你想的&*以同樣的方式想:這只是一個「指針/引用狀工具」,你可以在聲明中使用指定什麼你聲明的東西將是。

+0

那麼這就像一個「成員類指針」?就像方法類指針一樣? – Gui13 2012-03-30 08:25:02

+4

用簡單的話來說。 *指向一個班級成員*。 – 2012-03-30 08:25:14

+0

@Gui什麼是方法類指針?你的意思是'FunctionType A :: *'?是的,他們是一樣的。指向數據成員的指針具有成員類型爲對象類型,而指向成員函數的指針具有成員類型爲函數類型。在語法上,您還可以使用函數類型的函數聲明語法,使其看起來像'R(A :: *)(參數)cv-qual ref-qual except-spec'。儘管如果你不熟悉C++語法,使用別名模板和編寫別名 A :: *')更容易。 – 2012-03-30 08:25:39