設計成程式庫有幾個方法,一是寫一個類別,需要用時就宣告一個實體出來,但有時後我們不想要這麼做,如果可以直接取用比較好,這時就可以利用static的特性來實作,利用static 宣告的變數或函式,不必宣告物件實體即可調用,原因在於編譯過程,static 宣告的變數所放置的位置和一般自動變數是不同的,加上靜態成員在行程中會佔有一個靜態的記憶體位置不會改變會消失,利用此特性,可以達到將 function 管理在 class 中又不必宣告實體
舉例來說
class AsciiLib
{
static TCHAR *m_strAsciiName;
static CString GetFileMD5(const CString &strFilePath);
};
CString AsciiLib::GetFileMD5(const CString &strFilePath)
{
// do something;
}
在任何地方,只要有 #include AsciiLib.h
就可以使用其中的靜態變數或成員
int main()
{
AsciiLib::m_strAsciiName = "迪西";
foo();
CString strPackageFilePath(_T("C:\\Setup.exe"));
CString strMD5 = AsciiLib::GetFileMD5(strPackageFilePath); // 可得MD5
return TRUE;
}
void foo()
{
cout << AsciiLib::m_strAsciiName; // 可得"迪西"
}
若沒有加上 static 宣告就取用 AsciiLib:: 任一成員,編譯時會出錯哦。
另需注意的是,靜態函式只能使用靜態成員,其餘就是參數與自己宣告的變數,其他是無法取用的哦。
class AsciiLib
{
int m_ID;
int GetMyID() {return m_ID;};
static TCHAR *m_strAsciiName;
static CString GetFileMD5(const CString &strFilePath)
}
CString AsciiLib::GetFileMD5(const CString &strFilePath)
{
int nMyID = GetMyID(); // 錯誤,不可取用非 static
CTime ctToday = CTime::GetCurrentTime(); // 合法的 Local Var
}
沒有留言:
張貼留言