[問題] C++ 自定義轉型

看板C_and_CPP (C/C++)作者 (閉上眼的魚)時間14年前 (2012/06/12 07:34), 編輯推噓3(306)
留言9則, 3人參與, 最新討論串1/1
在拆解 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

06/12 07:52, , 1F
operator char*() const 這樣就好 operator 前面沒加東西
06/12 07:52, 1F

06/12 07:54, , 2F
第三個error 因為 m_heap 不是const 變數 不能傳出去
06/12 07:54, 2F

06/12 07:56, , 3F
最後兩個問題的第一個有難度 沒試成功過
06/12 07:56, 3F

06/12 07:57, , 4F
operator 算是 functor 自動呼叫的感覺不太像轉型~
06/12 07:57, 4F

06/12 07:58, , 5F
對了樓主頭還好吧?=_>=
06/12 07:58, 5F

06/12 08:11, , 6F
Wow!! 真的是多了 return value. 拿掉就沒問題了,補註一下
06/12 08:11, 6F

06/12 08:11, , 7F
字串那裡的 const 是修飾 function,資料型態同為 char *
06/12 08:11, 7F

06/12 08:13, , 8F
最後希望在頭禿完之前把手邊五本書 k 光,謝謝 d 大 :)
06/12 08:13, 8F

06/12 12:34, , 9F
C++到頭禿了……還是學不完啊XDDDDDD
06/12 12:34, 9F
文章代碼(AID): #1Fre1kJM (C_and_CPP)
文章代碼(AID): #1Fre1kJM (C_and_CPP)