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巨集,而且它竟然只能針對指標來運作,而無法套用於非指標變數中。真是又學了一招。
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巨集,而且它竟然只能針對指標來運作,而無法套用於非指標變數中。真是又學了一招。
留言
張貼留言