pointer to data member 的疑惑

1999.07.21 第一次發表




●讀者來函

> 侯老師您好
>
> 我是您的讀者,在您所著的 <虛擬與多型> 一書中曾提及
> pointers to data member, 但我不懂的是為何要有
> 這種東西。有勞您看以下的 example
>
> class foo {
> public:
>   int k;
>   int *ptr; // named No.1
> };
>
> void main(void)
> {
>   int foo::*ptr = &foo::k; // pointer to data member named No.2
>   // then assign the address to No.2
>   int *p; //named No.3
>
>   foo s1 = foo();
>
>   p = &s1.k; // assign the "k " address to No.3
>   s1.ptr = &s1.k; // assign the "k " address to No.1
>   s1.*ptr = 100; // assign value 100 to No.1
>   *(s1.ptr) = 200; // assign value 200 to No.2
> }

>
> 我的問題:
>
> 1. pointer to data member (like No.2) 是屬於 foo class 的
> member 嗎? 若是, 為何不像 No.1 一樣直接寫在 class 的宣告裡就
> 好而要多此一舉? 如果是屬於 foo 的 member的話 ,應該能像 No.1
> 一樣 access 到 foo class 中的 private member 才對吧?
> 或者說,pointer to data memeber 是和 No.3 一樣,屬於一般 pointer,
> 只是 No.2 是 "專門" 指向 class data 的指標呢?
>
> 2. 我是個大一資訊科系的準新生 ,常看到學長們學 C++ 似乎就像是
> 在研究哲學理論一樣,懂得考試(考的也是C++的關念:polyforphism..)
> 但實作方面似乎很缺少. 我想請教侯老師在我學習C++過程中,有很多
> 關念我該用什麼樣的方式去把他implement,不然就好比您講的"拿有毛
> 的筆寫字一樣".
>
> 煩請您抽空回答並抱歉打擾您寶貴的時間
> 祝心怡 ycchang


●我的回覆

Hi, ycchang:

來信收悉。你的 sample 有個觀念上的錯誤。由於你在程式中將
"class 內的 pointer to data" 和 "pointer to data member"
取了相同的名稱,都命名為 ptr,所以你自己被自己搞混了。

請將
int foo::*ptr = &foo::k; // No.2
改為
int foo::*mptr = &foo::k; // No.2

然後你會發現,你的 sample 中的最後兩行應該改為:

s1.*mptr = 100; // assign value 100 to No.2(★注意,是 No.2)
*(s1.ptr) = 200; // assign value 200 to No.1(★注意,是 No.1)

結論:

你用了三種指標來指向 class data member(上例的 s1.k):

1. 一般指標 int* p;
2. class 內的一般指標 int* foo::ptr;
3. 指向 class data member 的指標 int foo::* mptr;

這都是可以的。運用之妙,存乎一心。不過至少可下一個結論,就是:
pointer to data member 比一般的 pointer to data,有更多的限制。
它只能指向 class data member,不能指向一般 data。

pointer to member 之中,pointer to data member 的用處較少,
pointer to member function 的用處較大。

現在回答你的問題:

> 1. pointer to data member (like No.2) 是屬於 foo class 的
> member 嗎?

不是。

> 或者說,pointer to data memeber 是和 No.3 一樣,「屬於」一般 pointer,
> 只是 No.2 是 "專門" 指向 class data 的指標呢?

是的。但不能說「屬於」,應說「近似於」。

> 2. 我是個大一資訊科系的準新生 ,常看到學長們學 C++ 似乎就像是
> 在研究哲學理論一樣,懂得考試(考的也是C++的關念:polymorphism..)
> 但實作方面似乎很缺少. 我想請教侯老師在我學習C++過程中,有很多
> 關念我該用什麼樣的方式去把他implement,不然就好比您講的"拿有毛
> 的筆寫字一樣".

C++ object-oriented 領域內的確有不少「哲學理論」:)。我的意思是
有許多許多觀念在裡面,很需要靜心思考,不像 procedural programming
那麼直覺。

學習有三個階段,第一是完全被動的吸收,第二是主動思考並寫些小例子來印證。像你寫上面那個小例子,就已經到「主動思考並印證」的層次了。第三則是寫點實用性的東西(所謂 real world program,呵呵)。由於教育體制的關係,臺灣學生很缺乏創造力,所以很不容易自己想點有趣題目。其實俯拾可得。寫一個太陽系星體運轉程式,或一個動物園分類檢索系統,就非常好。這當中你必須去圖書館查一些動物學名或太空資料,無形中也就多了不少動物學或天文學的基礎知識。

初學 C++,設計重點要放在程式核心部份,等有了繪圖能力,再完成 UI。想像一下,你能在你的 PC 上秀出目前此刻的太陽系星體位置,以各種角度觀察它,多棒的一件事。為了得到一些星體圖片,你還得連上NASA 網站,那不又是一個大收穫嗎。我敢說,經過這樣一番經歷,你在眼界上、做學問的方法與態度上,都將超越同儕甚多。

最後我要請教你一個問題。你說你是大一資訊科系的準新生,這麼說你高中就開始讀 <多型與虛擬> 了嗎?你是高中電腦社員嗎?你能說說在你週遭,電腦的學習情況嗎?我很有興趣聽。

--- the end