2017-06-02 21 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'

を、私は「演算子のオーバーロード」グーグルが、結果のすべては、私は演算子をオーバーロードするために使用されるのと同じ方法を持っています。では、なぜこれは機能しませんか?

+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を使うことができます。

関連する問題