發表文章

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; };

C Bit Field 使用注意事項

圖片
C Bit Field 在存取暫存器的欄位是非常好用的,例如

鍵盤、滑鼠失去電力囉!

先前為了開發新的程式,整個硬體平台更換後,原本的硬碟進到 Windows 的畫面卻無法登入,請高手來查看後才發現鍵盤、滑鼠接的 USB Port 沒有電 (開機時還有),我猜想可能是 Windows Driver 未載入 (或是找不到),所以沒有開啟電源吧,當初也忘了記錄他是怎麼解決的。 結果前幾天更新主機板 BIOS 時,又發生一樣的情況,不想麻煩別人來用,直接詢問的結果竟然是重新插拔鍵盤、滑鼠就好了,真是太神奇了!

【已解決】刪除指向介面指標 (Interface pointer) 的物件不會執行解構函式 (Destructor)

一般物件在生命週期結束時,會呼叫解構函式,以便執行釋放資源的動作。但對於實作介面的物件,如果是以介面指標的方式來呼叫,竟然不會呼叫解構函式,Oh My God。讓我們一步一步來看看吧! #include "stdafx.h" #include <iostream> using namespace std; struct IAnimal { virtual void Eat() = 0; }; class Dog : public IAnimal { public: Dog() { cout << "Dog construct." << endl; } ~Dog() { cout << "Dog destruct." << endl; } void Eat() { cout << "Dog eat ..." << endl; } }; int _tmain(int argc, _TCHAR* argv[]) { Dog* pDog = new Dog(); pDog->Eat(); delete pDog; return 0; }

【已解決】C++ Event 的實作方式

Event 在 Windows 的程式設計中,已經習以為常,尤其是 Windows 的 Event。但要在 C++ 中實作,還真不曉得要如何下手,原本在 C# 中如此基本的東西,轉到 C++ 竟是如此困難。 還好 Microsoft 還是留了一手 Event Handling ,但看了半天還不是很懂,於是從 Sample code 中實驗終於大致瞭解了,所以記錄以備後用 (雖然 Microsoft 說這個功能要取消了,不過取消前還是將就著用吧!)

【已解決】循環引用的疑問

最近在移植程式的過程中,碰到一個循環引用的問題,困擾了我不少時間,所以有寫下來的必要,以免下次再犯。直接來看例子吧! 這是最上層的介面 IElement,其中的 Method 可以處理實作 IVisitor 介面的物件 #pragma once #include "IVisitor.h" // <== Cause cross reference struct IElement { virtual VOID Accept(IVisitor* pVisitor) = 0; virtual VOID Traverse(IVisitor* pVisitor) = 0; }; typedef IElement* PIElement; 接下來是 IComputer 介面,繼承 IElement 介面

在 C++ 使用 namespace

寫程式常常會碰到名稱 (類別、函式、變數 ... 等等) 衝突的問題 (因為英文懂得太少了),這個時候命名空間就可以發揮功用了,只要在自己的命名空間內,即使名稱跟別人一樣也不會衝突了。 同時在 Visual Studio 的 Class View 中,也會依據命名空間來分類,方便 Source Code 的管理。唯一的缺憾就是不能像  Net 一樣使用 "." 當作命名空間的名稱,所以只好用 "_" 來取代了!