作者EdisonX (閉上眼的魚)
看板C_and_CPP
標題[問題] C++ 自定義轉型
時間Tue Jun 12 07:34:02 2012
在拆解 MFC - CWnd 時有看到這段
CWnd::operator HWND()
{
return this->m_hwnd;
}
CWnd cwnd;
HWND hwmd = (HWND)cwnd;
後來查一下,是在用傳統 C-stype 的轉型,最後一行變成
hwnd = cwnd.operator HWND () ;
不過這種 implement 我實作問題很大
class String{
size_t m_size;
char * m_heap;
public:
String(const size_t size = 10) : m_size(size) {
m_heap = new char[size];
}
~String() {delete [] m_heap;}
void set(const char* str){strcpy(m_heap, str);}
char* operator char * () const { /* error 1, 2*/
return m_heap; /* error 3 */
}
};
String s(100);
s.set("edisonx");
char * ptr = (char*)s;
cout << ptr << endl;
出現的錯誤訊息都讓我不知如何下手,特別是第三點覺得莫名奇妙。
(1) 使用者定義轉換不可以指定傳回型別
(2) 不正確的使用者定義轉換語法 : 間接取值不合法
(3) 'return' : 無法由 'char *const ' 轉換為 'char **'
另外在寫 template 時也是類似的問題 ,不過又多了一個。
template<typename T>
class Point{
T m_x, m_y;
public:
...
template<typename U> /* error1 error2 error3 */
Point<U> operator Point<U> () const {
return Point<U> ( static_cast<U>(m_x) , static_cast<U>(m_y) );
}
};
Point<double> t1;
Point<int> t2;
t2 = ( Point<int> )t1;
不過這次錯誤不一樣了,error1~error3 是同一行、同一訊息
(1) (2) (3) 使用者定義轉換不可以指定傳回型別
最後再請教 2 個問題。
1. Point<T>::operator <U> () 有沒有辦法拆到 class 外面寫?
2. operator static_cast 是不是不要複載較佳? ( 雖然我覺得我在做一樣的事.. )
謝謝各位不吝指教。
--
「自從我學了 C# , 人都變聰明 , 考試都考一百分」
「自從我學了 VB , 皮膚都變好 , 人也變漂亮了 」
「自從我學了 Java , 明顯變壯 , 個子也變高了 」
「自從我學了 C++ , 內分泌失調 , 頭都禿了... 」
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.76.161
推 damody:operator char*() const 這樣就好 operator 前面沒加東西 06/12 07:52
→ damody:第三個error 因為 m_heap 不是const 變數 不能傳出去 06/12 07:54
推 damody:最後兩個問題的第一個有難度 沒試成功過 06/12 07:56
→ damody:operator 算是 functor 自動呼叫的感覺不太像轉型~ 06/12 07:57
→ damody:對了樓主頭還好吧?=_>= 06/12 07:58
→ EdisonX:Wow!! 真的是多了 return value. 拿掉就沒問題了,補註一下 06/12 08:11
→ EdisonX:字串那裡的 const 是修飾 function,資料型態同為 char * 06/12 08:11
→ EdisonX:最後希望在頭禿完之前把手邊五本書 k 光,謝謝 d 大 :) 06/12 08:13
推 jason12308:C++到頭禿了……還是學不完啊XDDDDDD 06/12 12:34