2010-11-01 37 views
1

這是我能想到的唯一的東西。事情是知覺Struct不接受wchar_t

我有一個結構如下:

struct NumPair 
{ 
    wchar_t *pFirst, *pSecond; 
    int count; 

與構造函數,拷貝賦值和建設爲

NumPair(wchar_t *pfirst, wchar_t *psecond, int count = 0) 
NumPair(const NumPair& np) 
NumPair& operator=(const NumPair& np) 

這是我的最後一個問題的延伸中,我問了一個辦法對包含特殊(德語)字符(如ü, ä, ö)的字符指針列表進行排序。

該解決方案似乎使用寬字符類型,但由於某種原因,編譯器會拋出超過一百次的轉換錯誤。

樣品輸入:

// dict_ is a container of NumPairs. 
dict_.push_back(NumPair ("anfangen", "to begin, to start")); 

編譯器抱怨它不能轉換const char *wchar_t。很好,我把push_back改爲

dict_.push_back(NumPair (wchar_t("anfangen"), wchar_t("to begin, to start"))); 

編譯錯誤:找不到NumPair ctor,它接受所有參數。

什麼。的。地獄。我嘗試了一個完整的重建,認爲我的VSC++ 10已經崩潰了。不,不要猜測。

我在做什麼錯?

CODE

的構造函數,賦值和拷貝構造都是wchar_t的指針像下面的深層副本。

包括wchar.h。

NumPair(wchar_t *pfirst, wchar_t *psecond, int count = 0) 
    : count(count) 
{ 
    size_t s1, s2; 
    s1 = wcslen(pfirst); 
    s2 = wcslen(psecond); 
    pFirst = new wchar_t[s1]; 
    pSecond = new wchar_t[s2]; 
    wcscpy(pFirst, pfirst); 
    wcscpy(pSecond, psecond); 
} 
+0

當您嘗試一次管理多個資源(即字符串)時失敗。我們已經解決了這個問題,它是'std :: wstring'。 – GManNickG 2010-11-01 19:21:39

+1

您需要爲空終止符添加一個字符並處理銷燬。從技術上講,如果第二個新的失敗,第一個永遠不會被刪除(析構函數不會被調用),那麼你的代碼也不是異常安全的。最好使用std :: wstring。 – CashCow 2010-11-02 10:01:02

回答

4

字符串必須開始具有L是寬字符字符串常量,例如L"abcdefghijk",類型const wchar_t*。沒有L,它是一個窄字符串,類型爲const char*,所以錯誤是正確的;試圖將const char*轉換爲wchar_t*將不起作用,因爲您只是更改指針的類型並丟失了const限定符(它對指向的數據沒有任何作用)。另外,你的第二個例子是從const char*指針創建wchar_t對象,這可能不是你想要的 - 你想要的是指針,而不僅僅是一個wchar_t對象。

這不是有情,你只是不清楚自己在做什麼:)

3

嘗試

dict_.push_back(NumPair (L"anfangen", L"to begin, to start")); 

的L表​​示它是一個unicode(WCHAR)字符串。

2

要創建wchar_t字符串,請在文字上使用L前綴。

dict_.push_back(NumPair (L"anfangen", L"to begin, to start")); 

P.S.如果您不創建比字符串長度大一倍的對象字符串以容納零終止符,那麼您將遇到麻煩。您可以考慮使用std::wstring

5

有兩個主要問題。

首先,字符串文字wchar_t寫成L"blah blah"(注意L)。

二,const正確性:聲明你的正式參數,如wchar_t const* pFirst。這允許直接使用文字作爲實際參數。或者任何const字符串。

乾杯&第h。,

3

一個"string in quotes"char秒的陣列。您不能將其轉換爲wchar_t的數組而不進行復制。但是前面有一個L,L"string in quotes"就是文字,它給你一個wchar_t的數組。你想使L在文字面前:

NumPair(L"anfangen", L"to begin, to start") 
2

最有可能的,只是忘了做,你與指針的方式,並使用std :: wstring的,內置的串類,它寬字符串。

如果你總是要使用指向文字的指針,那麼你應該使用const wchar_t *指針。

請注意,您的結構仍然可以分配,因爲成員不是常量指針,它們是指向不可變數據的指針。