operator LPCTSTR() 實作
在 C# 裡有一個 ToString() 的方法可以把物件的內容轉為字串,但在 C++ 中卻找不到對應的方法。後來看到 CString 覆寫 operator LPCTSTR(),才驚覺原來還有這種作法啊!
一般 operator (例如 +) 會有傳回值,但強制轉型運算子本身的型別就是傳回值,例如 LPCTSTR() 就是把目前的物件轉換為 LPCTSTR 後傳回,所以 operator 前面就不需要寫傳回值了。
以上就是該 operator 的實作,只是簡單地把 constructor 傳進來的字串傳回去。當然你也可以自己額外做一些處理,例如格式化或提供一些相關的資訊等等
在程式中就可以用以上的方式列印出來了 (_tprintf 會使用隱含的 LPCTSTR 轉型)
所以舉一反三我也可以用以下的方式來轉換為 int (雖然沒甚麼意義)
operator int() const { return 7; }
於是 (int)myClass 就會傳回 7,真是有趣啊!
參考:Operator Overloading
補充說明:
LPCTSTR() 是針對物件,而非物件指標,如果以下列的方式建立介面
然後實作介面的物件如下
宣告一個物件如下
PQuackObservable pQuackObservable = new Observable();
如果用下列方式是用不到 LPCTSTR 轉型的
_tprintf(pQuackObservable);
必須要改成這樣才可以
_tprintf(*pQuackObservable);
如果要格式化則必須強制轉型
_tprintf(_T("Name : %s\n"), (LPCTSTR)*pQuackObservable);
如果要指定到 CString 則會套用隱含的 LPCTSTR 轉型,如果擔心就全部自己強制轉型吧
CString str = *pQuackObservable;
class MyClass { private: TCHAR m_lpszName[MAX_PATH]; public: MyClass(LPCTSTR lpszName); ~MyClass(void); operator LPCTSTR() const; };
一般 operator (例如 +) 會有傳回值,但強制轉型運算子本身的型別就是傳回值,例如 LPCTSTR() 就是把目前的物件轉換為 LPCTSTR 後傳回,所以 operator 前面就不需要寫傳回值了。
MyClass::MyClass(LPCTSTR lpszName) { _tcscpy_s(m_lpszName, MAX_PATH, lpszName); } MyClass::operator LPCTSTR() const { return m_lpszName; }
以上就是該 operator 的實作,只是簡單地把 constructor 傳進來的字串傳回去。當然你也可以自己額外做一些處理,例如格式化或提供一些相關的資訊等等
MyClass myClass(_T("Hello, world!")); _tprintf(myClass);
在程式中就可以用以上的方式列印出來了 (_tprintf 會使用隱含的 LPCTSTR 轉型)
所以舉一反三我也可以用以下的方式來轉換為 int (雖然沒甚麼意義)
operator int() const { return 7; }
於是 (int)myClass 就會傳回 7,真是有趣啊!
參考:Operator Overloading
補充說明:
LPCTSTR() 是針對物件,而非物件指標,如果以下列的方式建立介面
struct QuackObservable {
virtual ~QuackObservable() { }
virtual void registerObserver(PObserver pObserver) = 0;
virtual void notifyObservers() = 0;
virtual operator LPCTSTR() const = 0;
};
然後實作介面的物件如下
class Observable : public QuackObservable { private: CArray* m_pObserversArray; PQuackObservable m_pDuck; public: Observable(PQuackObservable pDuck); ~Observable(void); void registerObserver(PObserver pObserver); void notifyObservers(); operator LPCTSTR() const { return _T("Observable"); } };
宣告一個物件如下
PQuackObservable pQuackObservable = new Observable();
如果用下列方式是用不到 LPCTSTR 轉型的
_tprintf(pQuackObservable);
必須要改成這樣才可以
_tprintf(*pQuackObservable);
如果要格式化則必須強制轉型
_tprintf(_T("Name : %s\n"), (LPCTSTR)*pQuackObservable);
如果要指定到 CString 則會套用隱含的 LPCTSTR 轉型,如果擔心就全部自己強制轉型吧
CString str = *pQuackObservable;
留言