2017-10-28 4 views
0

Da ich nicht std :: string für eine Zuweisung verwenden kann, verwende ich eine benutzerdefinierte Klasse namens CharString als Wrapper für die Fälle, wo ich es nicht selbst initialisieren kann.Operator >> für einen Char-Zeiger Wrapper

Die Klasse sieht wie folgt aus:

struct CharString { 
    char* str; 
    CharString() : str() {} // Initialize NULL 
    ~CharString() { free(str); } 
    // Conversions to be usable with C functions 
    operator char**() { return &str; } 
    operator char*() { return str; } 
}; 

aber ich folgende Fehlermeldung erhalten, wenn i >> auf sie verwenden möchten.

binary '>>': no operator found which takes a right-hand operand of type 'utils::CharString' (or there is no acceptable conversion). 

Wie ich den Bediener >> überlasten?

CharString operator>>(std::istream& is) { 
    is >> str; 
    return *this; 
}; 

Ich versuchte das oben, aber das gibt mir immer noch den gleichen Fehler.

Antwort

1

Die allgemeine Art und Weise des Stream-Operators, um eine Überlastung ist eine Friend-Funktion mit dieser allgemeinen Form zur Verfügung zu stellen:

istream& operator>> (istream& in, MyObjectType& object) { 
    // read all the data you need to construct an object. 
    // 
    // Then: 
    if (in) { // Read succeeded! Update object. 
     // Build a new object of the appropriate type. 
     MyObjectType theOneIRead(basedOnTheDataIRead); 

     // Swap the object you were given as input for the one you 
     // just read. This way, if the read completely succeeds, you 
     // update the rhs, and if the read failed, nothing happens. 
     std::swap(object, theOneIRead); 
    } 
    return in; 
} 

Beachten Sie, dass diese Signatur der Funktion als die, anders sein wird, die Sie geschrieben haben.

Sie müssen sich um die Logik kümmern, die mit dem Lesen von Zeichen nacheinander aus dem Stream und dem Erstellen einer Art temporären Puffer für die Speicherung der Zeichen verbunden ist. Das ist nicht trivial und ist einer der Gründe, warum es so schön ist, dass wir einen std::string Typ haben, der mit der Bibliothek verpackt ist. Aber ansonsten sollte die folgende Vorlage Ihnen geben, was Sie wollen.

Unabhängig - Ihre Struktur hat derzeit einen Destruktor, aber keinen Kopierkonstruktor, keinen Move-Konstruktor oder Zuweisungsoperator. Normalerweise sollten Sie diese Funktionen auch zusammen mit dem Destruktor implementieren, da andernfalls das Kopieren des Objekts eine flache Kopie des Zeigers verursacht und zu Speicherproblemen führt, wenn zwei unabhängige Objekte versuchen, denselben Zeiger freizugeben.

Da dies C++ ist, sollten Sie auch new[] und delete[] anstelle von malloc und free verwenden.

+0

Ich nehme an, dass ich dies in meine CharString-Struktur einfügen muss, aber das gibt mir auch Fehler: 'kann Funktionen, die durch return type alone 'nur bei Verwendung von istream oder' zu vielen Parametern für diese Operatorfunktion' nicht überladen werden, wenn ich beide Parameter verwende . – IMarks

+1

Dies sollte eine Friend-Funktion und nicht eine Member-Funktion sein. Stellen Sie sicher, dass Sie es außerhalb Ihrer Klasse deklarieren, und fügen Sie dann innerhalb der Klasse eine Friend-Deklaration hinzu. – templatetypedef