Re: [問題] 轉型觀念求教!
看板C_and_CPP (C/C++)作者POSIX (tedium of chores)時間16年前 (2009/10/27 13:33)推噓5(5推 0噓 15→)留言20則, 2人參與討論串2/3 (看更多)
以下淺見 參考看看
※ 引述《QQ29 (我愛阿蓉)》之銘言:
: 我需要各位高手給我一個觀念上的指點@@
: 以下是我隨興亂測試的code
: class A{
: public :
: A(){X[0]=2;}char S[4];int X[10];
: };
: class B{
: public :
: B(){Y[0]=1;}int S;int Y[10];
: };
: int main()
: {
: A p;
: B *bb = (B*)&p;
: //B obj=(B)p; <======1.這行不給過 c-style轉型不是無敵硬轉嘛?
: B obj=reinterpret_cast<B &>(p);//改為這樣
B obj = (B)p;
無敵硬轉不成功是因為
B 是user-defined data type
沒定義cast operator() 他不知道怎麼做
從等號分兩邊討論
左邊是copy constructor 問題
右邊是cast operator 問題
1.暫時不考慮shallow cloning/deep clone problem
交給default copy constructor 做
2.稍微顛倒class A/B 位置
並在class A加上cast operator
operator B(){return B();}
這樣無敵硬轉應該就會過了...
: //2.以下這三個cout為啥 前兩個會一樣第三個不同...
: cout<<&(bb->Y[0])<<endl;
: cout<<&p.X[0]<<endl;
: cout<<&obj.Y[0]<<endl;
: return 0;
如果你知道剛剛那是一個copy construction 的動作
那應該就知道第一、二行 和 第三行是兩個不同的instance
: }
: 如果2.的問題是說 bb指向p 所以起始位址一樣 所以我這樣印結果一樣
: obj自己有自己的位址 所以加個offset所以位址和上面不一樣????
: 3. 如果把三個cout的&拿掉 印值
: 全都印出2.............
這我不懂你要測什麼 :(
: 可否請了解運作原理的人 說明一下為什麼嘛...
: 我可能可以自己體會為什麼 不過總覺得不要亂認知比較好 最後學的是錯的就不好了...
: 所以潑出來請教各位
: 以上1 2 3點問題 請各位解答 謝謝!~
--
★▄喔 謝懇油錫白德到惡靈來 花縮泡的列為孩兒也的退來累蛤蜊名?胡適播的是
▄▄翠亨不來十大輸入的噴你耳屎飯 偶爾的覽啪味彎曲的我搜給人特例死稱哩?
安得羅技四銳個劣惡的蹦爸死停因爺兒 給夫普褥輸入的奶店傲夫挖屎屎滴碟兒
((喔 謝的店屎大屎便夠搬挪也為乎 偶而的練我夫的匪類恩德宏我夫的不累夫?))
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.117.176.163
推
10/27 13:36, , 1F
10/27 13:36, 1F
→
10/27 13:40, , 2F
10/27 13:40, 2F
→
10/27 13:43, , 3F
10/27 13:43, 3F
→
10/27 13:43, , 4F
10/27 13:43, 4F
→
10/27 13:44, , 5F
10/27 13:44, 5F
→
10/27 13:45, , 6F
10/27 13:45, 6F
→
10/27 13:49, , 7F
10/27 13:49, 7F
→
10/27 13:49, , 8F
10/27 13:49, 8F
推
10/27 13:51, , 9F
10/27 13:51, 9F
→
10/27 13:54, , 10F
10/27 13:54, 10F
→
10/27 13:56, , 11F
10/27 13:56, 11F
推
10/27 13:58, , 12F
10/27 13:58, 12F
→
10/27 13:58, , 13F
10/27 13:58, 13F
例子弄的太簡潔 可能我誤導你了
我的意思是想讓你知道
cast operator 並不知道有class B 這個type
所以要自己定義
如果怕和reinterpret_cast搞混
那你就把那行替換成
operator B(){return reinterpret_cast<B &>(*this);}
這樣應該就會和直接使用
reinterpret_cast 結果一樣
並且將p的值都copy 過來
你所測試 去掉& 的結果應該也會符合你要的
2
2
2
一個是在外面直接暴力做
一個是在class裡面, 透過data type casting operator來做
※ 編輯: POSIX 來自: 140.117.176.163 (10/27 14:09)
推
10/27 14:09, , 14F
10/27 14:09, 14F
→
10/27 14:14, , 15F
10/27 14:14, 15F
→
10/27 14:15, , 16F
10/27 14:15, 16F
→
10/27 14:18, , 17F
10/27 14:18, 17F
推
10/27 14:20, , 18F
10/27 14:20, 18F
→
10/27 14:20, , 19F
10/27 14:20, 19F
→
10/27 14:33, , 20F
10/27 14:33, 20F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章