const_cast的應用

話說我正在處理一個小程式時,需要用CListCtrl來顯示資料。此時我有一個函式:

void ShowOnListCtrl( const cLocation a_Location )

{

      ...

      LVITEM Item;

      ...

      Item.pszText = a_Location.m_Name; // m_Name的型別為CString

}

很直覺的,我就寫出了上面的程式碼。結果,一編譯就錯了。

我的專案使用的是UNICODE,所以Item.pszText的型別為LPWSTR。於是我想說那改成這樣應該可以吧:

Item.pszText = (TCHAR *)a_Location.m_Name.GetBuffer();

結果還是錯。來來回回試了好幾次,最後才發現,原來a_Location是個const修飾的變數,所以無法直接將它的內容指派給一個非const的變數。而且,我本來是想說用static_cast()會reinterpret_cast()的方式來處理,不過都還是錯誤。因為前提就是a_Location就是個const的變數。

最後還是得解決const這個問題。所以就找到const_cast()這個巨集。有了const_cast(),我又改為下面的寫法:

  Item.pszText = const_cast<cLocation>( a_Location ).m_Name;

還是錯!原來const_cast沒辦法轉換非指標的變數,所以只能以如下的方式來寫了:

 Item.pszText = (const_cast<cLocation *>( &a_Location))->m_Name;

終於可以編譯成功了。

這次用到了我以前都沒有用過的const_cast巨集,而且它竟然只能針對指標來運作,而無法套用於非指標變數中。真是又學了一招。

留言

這個網誌中的熱門文章

DOS Batch指令檔中如何記錄log資訊

用捷徑方式執行需帶入命令列參數的Windows Form程式

使用regular expression來match中括號(square bracket)