operator LPCTSTR() 實作

在 C# 裡有一個 ToString() 的方法可以把物件的內容轉為字串,但在 C++ 中卻找不到對應的方法。後來看到 CString 覆寫 operator LPCTSTR(),才驚覺原來還有這種作法啊!

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;

留言

這個網誌中的熱門文章

Linux 批次檔的寫法

【分享】如何顯示 Debug Message

[分享] Visual Studio 遠端偵錯