2017-06-02 65 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这一切都为你完成。