2010年8月20日 星期五

類別的靜態成員與自建簡易函式庫

有時後我們常常會寫一些 function,這些 function 在寫不同專案時常常要 copy 過去,若這些 function 與流程無關,或是可以把相關的值提取出來做為參數,那何不設計成一個自己使用的程式庫類別咧,

設計成程式庫有幾個方法,一是寫一個類別,需要用時就宣告一個實體出來,但有時後我們不想要這麼做,如果可以直接取用比較好,這時就可以利用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
}

沒有留言:

張貼留言