2017-06-02 4 views
-3

Ich habe eine Klasse mit dem Namen Fstring, es hat eine wchar_t* drin.Überladen von Operator für Zeichenfolge in C++

Ich schrieb die im Anschluss an die Stringliteral in Fstring zu kopieren:

#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; 
} 

Aber es hat nicht funktioniert. Der Compiler hat mir die folgende Fehlermeldung:

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

ich wirklich verwirrt bin, gegoogelt ich „Überladen von Operatoren“ aber alle Ergebnisse haben die gleiche Weise, die ich verwendet, um den Bediener zu überlasten. Warum funktioniert das nicht?

+1

Warum nicht einfach 'std :: wstring' verwenden? – cdhowie

+1

'Fstring test = L" Hallo Welt ";' ruft einen Konstruktor nicht 'operator =' auf, da Sie ein neues 'Fstring' konstruieren. –

+0

Vielleicht möchten Sie auch einen Konstruktor implementieren. –

Antwort

4

Wenn Sie Type name = initializer sehen, wird der Zuweisungsoperator nicht verwendet. Es deklariert eine Variable und ist daher initialisiert (technisch Kopierinitialisierung oder Kopiere-Liste-Initialisierung). Das heißt, es ruft einen Konstruktor auf. Da Sie keinen Konstruktor haben, der eine const wchar_t* übernimmt, erhalten Sie einen Fehler.

Was Sie brauchen, ist ein Konstruktor, der eine const wchar_t* übernimmt und arr damit initialisieren. Das würde aussehen wie

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' 
} 

Sie werden auch einen Kopierkonstruktor implementieren müssen. Für mehr auf, warum What is The Rule of Three?


Sehen beachten Sie, dass Sie das Rad neu zu erfinden. Wenn Sie eine breite Zeichenfolge möchten, können Sie std::wstring verwenden, was alles für Sie getan hat.