看板 C_and_CPP 關於我們 聯絡資訊
在拆解 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