2017-06-02 83 views
-3

我有一個名爲Fstring的類,它有一個wchar_t*C++中的字符串重載操作符

我寫了下面的字符串文字複製到Fstring

#include <iostream> 
using namespace std; 
class Fstring{ 
    wchar_t *arr; 
public: 

    Fstring& operator = (const wchar_t temp[]) 
    { 
     delete [] arr; 
     arr=new wchar_t[wcslen(temp)]; 
     for(int i=0;i<=wcslen(temp);i++) 
      arr[i]=temp[i]; 
     return *this; 
    } 
}; 

int main() 
{ 
    Fstring test=L"Hello World"; 

    return 0; 
} 

但沒有奏效。編譯器給了我以下錯誤:

error C2440: 'initializing' : cannot convert from 'const wchar_t [12]' to 'Fstring'

我真的很困惑,我用Google搜索「運算符重載」,但所有的結果都有我用重載操作方式相同。那麼爲什麼這不起作用呢?

+1

爲什麼不使用'std :: wstring'? – cdhowie

+1

'Fstring test = L「Hello World」;'在構建新的'Fstring'時調用構造函數而不是'operator ='。 –

+0

你也可能想實現一個構造函數。 –

回答

4

當您看到Type name = initializer時,它不使用賦值運算符。它是聲明一個變量,因此是初始化(技術上複製初始化複製列表初始化)。這意味着它調用一個構造函數。由於你沒有一個構造函數需要一個const wchar_t*,你會得到一個錯誤。

你需要的是實現一個構造函數,它需要const wchar_t*並初始化arr。這看起來像

Fstring(const wchar_t temp*) : arr(new wchar_t[wcslen(temp) + 1]) 
{ 
    size_t size = wcslen(temp); 
    for(int i = 0; i < size; i++) 
     arr[i] = temp[i]; 
    arr[size] = L'\0' 
} 

你也將不得不實施複製構造函數。欲瞭解更多關於爲什麼看到What is The Rule of Three?


請注意,您重新發明輪子。如果你想要一個寬字符的字符串,你可以使用std::wstring這一切都爲你完成。