作者: jjhou (jjhou)
標題: 【chilong's <深度探索 C++ 物件模型> 問題】-- 侯俊傑回覆
時間: Wed Aug 19 10:37:27 1998
【chilong's <深度探索 C++ 物件模型> 問題】-- 侯俊傑回覆
侯俊傑 1998.08.19 第一次發表於
清大.楓橋驛站.電腦書訊 CompBook 版(140.114.87.5)
-------------------------------------------------
chilong (五子棋) 讀友對於我的譯作提出一些指正與疑惑,
茲回覆於下。此書即將進行第二刷,使我有機會加以修正,
謝謝 chilong。
> 小錯誤:
> 1) p.194 在 [虛擬規格的存在]那段的第一行:
> Abstract_base::mumble_set() 應該改為
> Abstract_base::mumble()
> ==> 與 p.191 的 class 宣告對照
此為原書筆誤。我想你是對的,謝謝指正。
> 2) p.165 的圖 4.2
> Derived class 所指的 Base1 subobject
> #4 Base2::mumble() 似乎不應該產生, 與
> p.159 ~ p.160 的 class Base1的定義比較
原書如此。其間是否有什麼機制,我得想一想。
> 3) p.251 最上面的程式碼
> vec_new (&knots, .....)
> ^^^^^^
> 改為 knots or &knot[0]
> 與 p.250 的
> void* vec_new(void *array, ....) 對照
>
> 4) p.252 最上面的程式碼的最後一行
> vec_new(&knots+3, .......)
> ^^^^^^^^
> 改為 knots+3 or &knots[3]
> 與 p.250 的函式對照
試試看這樣:
Point knots[10];
printf("%x \n", knots);
printf("%x \n", &knots);
printf("%x \n", &knots[0]);
你會發現,其值皆同。funny!
> 5) p.253 第三行程式碼
> vec_new (&c_array, ......)
> ^^^^^^^^^
> 改為 c_array or &c_array[0]
道理與上同。
> 6) p.314 中間的程式碼
> simplify_conv_op(const type &rt)
> {
> if (typeif (rt) == .......)
> ^^^^^^^
> 改為 typeid(rt)
> ......
> }
是我筆誤。謝謝指正。
> 疑惑處:
>
> 1) p.193 的那段程式碼,
> inline void Concrete_derived::interface() const
> {
> ....
> Abstract_base::interface();
> // 譯註: 請注意, 我們竟然可以呼叫一個
> // pure virtual function
> }
> 但是小弟在 VC++ 5.0 及 TC3.0 測試時, 卻不行
> 呼叫 pure virtual function.....???
一定可以的。加油。
> 2) p.254 程式碼下面的第一行說到...
> -----------------
> ........., identity 表示檔案中所定義的第一個 nonstatic
> object.....
> -----------------
> 見 p.254 的程式碼, identity 是一個全域物件, 需要靜態
> 初始化, 是否應該將上述 nonstatic 改成 static or global呢 ??
> 順便問一下觀念問題, global 物件算是 static 物件嗎 ??
上述 nonstatic 的確應該改成 static。原書是 nonstatic,不過我想你是
對的。我的原文書上也殘留有我閱後的 "?" 記號。
另,global 應可視為一種 static;另有一種 local static。
--- the end
--
※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ Mail: jjhou@CCCA.NCTU.edu.tw
> -------------------------------------------------------------------------- <
作者: chilong (五子棋) 站內: CompBook
標題: Re: 【chilong's <深度探索 C++ 物件模型> 問題】-- 侯俊傑回覆
時間: Wed Aug 19 14:59:34 1998
.......
[deleted]
> > 2) p.254 程式碼下面的第一行說到...
^^^^^^^^^^
sorry...my fault, 筆誤, 應是 p.243
> > -----------------
> > ........., identity 表示檔案中所定義的第一個 nonstatic
> > object.....
> > -----------------
> > 見 p.254 的程式碼, identity 是一個全域物件, 需要靜態
^^^^^^^
應改為 p.242, my fault...
> > 初始化, 是否應該將上述 nonstatic 改成 static or global呢 ??
> > 順便問一下觀念問題, global 物件算是 static 物件嗎 ??
> 上述 nonstatic 的確應該改成 static。原書是 nonstatic,不過我想你是
> 對的。我的原文書上也殘留有我閱後的 "?" 記號。
> 另,global 應可視為一種 static;另有一種 local static。
> --- the end
>
--
※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: chilong.pine.ncu.edu.tw
> -------------------------------------------------------------------------- <
發信人: jyhuang@csie.nctu.edu.tw (Jiun-Yao Huang), 看板: CompBook
標 題: Re: 【chilong's <深度探索 C++ 物件模型> 問題】-- 侯俊傑回覆
發信站: Computer Science & Information Engineering (Wed Aug 19 17:25:02 1998)
轉信站: maple!news.cs.nthu!news.csie.nctu!netnews.csie.nctu!jyhuang
Origin: jyhuang@ccsun2.csie.nctu.edu.tw
:-> 試試看這樣:
:-> Point knots[10];
:-> printf("%x \n", knots);
:-> printf("%x \n", &knots);
:-> printf("%x \n", &knots[0]);
:-> 你會發現,其值皆同。funny!
&knots 這種寫法似乎是 undefined,是否應該避免?
有趣的是,原作者 (Lippman) 怎麼會這樣寫?
--
Jiun-Yao Huang <mailto:jyhuang@csie.nctu.edu.tw> Uni\/\/indows
Dep. of Comp. Sci. & Info. Eng., NCTU, Hsin-Chu, Taiwan, R.O.C. WW\/\/etworks
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SIGSIG: signature too long (core dumped)
> -------------------------------------------------------------------------- <
發信人: moli.bbs@bbs.es.ncku.edu.tw (小兔子的小狗), 看板: CompBook
標 題: Re: 【chilong's <深度探索 C++ 物件模型> 問題】-- 侯俊傑回覆
發信站: 成大工科忘情小築 (Thu Aug 20 09:26:10 1998)
轉信站: maple!news.cs.nthu!news.csie.nctu!news.civil.ncku!news.ncku!esbbs
Origin: bbs.es.ncku.edu.tw
==> jyhuang@csie.nctu.edu.tw (Jiun-Yao Huang) 在文章中提到:
: :-> 試試看這樣:
: :-> Point knots[10];
: :-> printf("%x \n", knots);
: :-> printf("%x \n", &knots);
: :-> printf("%x \n", &knots[0]);
: :-> 你會發現,其值皆同。funny!
: &knots 這種寫法似乎是 undefined,是否應該避免?
: 有趣的是,原作者 (Lippman) 怎麼會這樣寫?
是喔..
我一直以為 &knots 代表的是"存放knots這個指標的位址"說!
而且剛剛試過.. &knots
所出來的值也跟其他兩個不同呀!
--
我~~
心如止水,兩袖清風 ...
※ 來源:‧成大工科忘情小築 bbs.es.ncku.edu.tw‧[FROM: java154.trd.iii]
> -------------------------------------------------------------------------- <
發信人: waton@bbs.ee.ntu.edu.tw (龍龍), 看板: CompBook
標 題: Re: 【chilong's <深度探索 C++ 物件模型> 問題】-- …
發信站: 台大電機 Maxwell BBS (Thu Aug 20 11:58:49 1998)
轉信站: maple!news.cs.nthu!freebsd.ntu!bbs.ee.ntu!Maxwell
※ 引述《moli.bbs@bbs.es.ncku.edu.tw (小兔子的小狗)》之銘言:
: ==> jyhuang@csie.nctu.edu.tw (Jiun-Yao Huang) 在文章中提到:
: : &knots 這種寫法似乎是 undefined,是否應該避免?
: : 有趣的是,原作者 (Lippman) 怎麼會這樣寫?
: 是喔..
: 我一直以為 &knots 代表的是"存放knots這個指標的位址"說!
: 而且剛剛試過.. &knots
: 所出來的值也跟其他兩個不同呀!
從程式語言的觀點來看, Point knots[10] 中, knots 應該是要
視為 const value, 不過好像許多 compiler 是以 const variable
的形式來實作它. 因此 &knots 應該是 undefined 的.
--
我見青山多嫵媚, 料青山見我亦如是
有情有義有肝膽, 亦狂亦俠亦書生
--
※ Origin: 臺大電機 Maxwell 站 ◆ From: jasmine.csie.ntu.edu.tw
> -------------------------------------------------------------------------- <
作者: chilong (五子棋) 站內: CompBook
標題: Re: 【chilong's <深度探索 C++ 物件模型> 問題】-- 侯俊傑回覆
時間: Thu Aug 20 19:10:52 1998
..
[deleted]
> 試試看這樣:
> Point knots[10];
> printf("%x \n", knots);
> printf("%x \n", &knots);
> printf("%x \n", &knots[0]);
> 你會發現,其值皆同。funny!
我又測試過一次.......
的確照 侯 sir 上述的式子 address 都相同沒錯.....
但是如果是這樣子...
printf("1: %x\n", &knot[3]);
printf("2: %x\n", knot+3);
printf("3: %x\n", &knot+3);
這樣子的話, 3 的位址就與 1, 2 不同了......
所以我想, 在 p.252 (中譯本, 原文頁數我不清楚)
應該仍是有錯 ......
而 p.251 與 p.253 應該是 "恰巧" 對了吧...
不過一般而言還是 1, 2 兩種比較適當......
[deleted]
--
※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ From: chilong.pine.ncu.edu.tw
> -------------------------------------------------------------------------- <
發信人: "阿睿" <sib00535@tpts1.seed.net.tw>, 看板: CompBook
標 題: Re: 【chilong's <深度探索 C++ 物件模型> 問題】-- …
發信站: AIDEBBS (Fri Aug 21 01:56:52 1998)
轉信站: maple!news.cs.nthu!news.csie.nctu!aidebbs!not-for-mail
Origin: m147-75.dialup.seed.net.tw
龍龍 撰寫於文章 <3QALAQ$WWE@bbs.ee.ntu.edu.tw>...
>※ 引述《moli.bbs@bbs.es.ncku.edu.tw (小兔子的小狗)》之銘言:
>: ==> jyhuang@csie.nctu.edu.tw (Jiun-Yao Huang) 在文章中提到:
>: : &knots 這種寫法似乎是 undefined,是否應該避免?
>: : 有趣的是,原作者 (Lippman) 怎麼會這樣寫?
>: 是喔..
>: 我一直以為 &knots 代表的是"存放knots這個指標的位址"說!
>: 而且剛剛試過.. &knots
>: 所出來的值也跟其他兩個不同呀!
我以Visual C++ 5.0 以下列程式碼得到相同的結果
#include <cstdio>
class Point {
public:
int x, y;
};
int main() {
Point Knots[10];
printf("%x\n",Knots);
printf("%x\n",&Knots);
printf("%x\n",&Knots[0]);
char ch;
ch=getchar();
return 0;
}
>從程式語言的觀點來看, Point knots[10] 中, knots 應該是要
>視為 const value, 不過好像許多 compiler 是以 const variable
^^^^^^^^^^
^^^^^^^^^^^^^
>的形式來實作它. 因此 &knots 應該是 undefined 的.
如果照你說的意思,const variable 與const value 的位置好像相反了
因為 a reference to a value is undefined, ex:
&9;
還是,我有誤會?
&Knots is a pointer point to an array of 10 Point object
你可以把 &Knots 與 &Knots+1 Print 出來就知道了
> -------------------------------------------------------------------------- <
發信人: waton@bbs.ee.ntu.edu.tw (龍龍), 看板: CompBook
標 題: Re: 【chilong's <深度探索 C++ 物件模型> 問題】-- …
發信站: 台大電機 Maxwell BBS (Fri Aug 21 13:20:07 1998)
轉信站: maple!news.cs.nthu!freebsd.ntu!bbs.ee.ntu!Maxwell
※ 引述《"阿睿" <sib00535@tpts1.seed.net.tw>》之銘言:
: 龍龍 撰寫於文章 <3QALAQ$WWE@bbs.ee.ntu.edu.tw>...
: 我以Visual C++ 5.0 以下列程式碼得到相同的結果
: #include <cstdio>
: class Point {
: public:
: int x, y;
: };
: int main() {
: Point Knots[10];
: printf("%x\n",Knots);
: printf("%x\n",&Knots);
: printf("%x\n",&Knots[0]);
: char ch;
: ch=getchar();
: return 0;
: }
: >從程式語言的觀點來看, Point knots[10] 中, knots 應該是要
: >視為 const value, 不過好像許多 compiler 是以 const variable
: ^^^^^^^^^^
: ^^^^^^^^^^^^^
: >的形式來實作它. 因此 &knots 應該是 undefined 的.
: 如果照你說的意思,const variable 與const value 的位置好像相反了
: 因為 a reference to a value is undefined, ex:
: &9;
It is right, so I say that &knots is undefined according to that
knotes seems to be const value.
: 還是,我有誤會?
: &Knots is a pointer point to an array of 10 Point object
: 你可以把 &Knots 與 &Knots+1 Print 出來就知道了
請比較如下二行:
Point Knots[10];
Point *pKnots = Knots;
你認為 Knots 和 pKnots 是一樣的嗎 ?
我的看法是
Knots is an array of 10 Point objects.
pKnots is a pointer point to an array of 10 Point objects.
一個指標算是一個變數, 在記憶體中有實際的一塊位置儲存其值. pKnots 屬之.
Knots 在 C/C++ 中, 其值應該是代表著此 Array 的起始位址.
注意並沒有一塊實際的記憶體位置儲存 Knots 的值, 所以我說它是一個 value.
而且它不應該可以被改變, 故為 const.
因而我才會說 &Knots 是 undefined. 理由很明顯.
我用 gcc 2.7.2 試過你上面的 code, 結果和你一樣. 因此看來 &Knots 似乎被
解釋成 &Knots[0] 了. 我不清楚 C/C++ 的規格是否對此有定義, 可能需要查一
查吧. 注意我之前的談論是基於語言本身是否應該要對 &Knots 有定義, 而非某
特定之 Compiler 是否對其有定義.
我之前的 Post 是為了很快點出我的看法, 因而沒有作太多的說明, 可能引起你
的誤會, 另外這是 CompBook 板, 不知可否談論這些東西?
--
我見青山多嫵媚, 料青山見我亦如是
有情有義有肝膽, 亦狂亦俠亦書生
--
※ Origin: 臺大電機 Maxwell 站 ◆ From: lily.csie.ntu.edu.tw
> -------------------------------------------------------------------------- <
※ X-Info: Mave -> ric.bbs@ptt.csie.ntu.edu.tw
※ X-Sign: 0ROABK3PHueHajaHGnic (99/07/09 7:04:35 )