2012-03-28 12 views
2

Ich arbeite an dem Schreiben meiner eigenen String-Klasse und habe Probleme mit dem Überladen des + = -Operators für eine MyString, die + = 'd zu einem Zeichen ist. Ich dachte, das würde funktionieren, aber ohne Glück. Hier ist die Implementierung, die ich versucht habe. Jede Hilfe, damit sie richtig funktioniert, wird sehr geschätzt.C++ Need Hilfe Überladen + = für eine MyString Klasse

MyString& MyString::operator +=(char c) 
{ 
    char derp[1] = {c}; 
    strcat(value, derp); 
    return *this; 
} 
+4

Ist das Hausaufgaben? Wenn nicht, warum programmieren Sie sogar Ihre eigene "String" -Klasse? – Griwes

+0

char * derp = "x"; derp [0] = c; – k06a

+0

@Griwes, könnten sie nur versuchen zu lernen. –

Antwort

4

Dies ist aus mehreren Gründen nicht zur Arbeit gehen:

  1. derp ist Array kein nullterminierte, die es, wenn Sie es als Parameter an strcat
  2. Es gibt keine Prüfung ist geben sein muss dass der Puffer, den value darstellt, tatsächlich mehr Daten enthalten kann; es gibt auch keine Möglichkeit, sicherzustellen, dass der Puffer immer null-terminiert ist (was wiederum notwendig ist, weil Sie ihn an strcat übergeben).
  3. Auch wenn Sie die oben genannten korrigieren, kann Ihre String-Klasse nie enthalten das Zeichen \0 als Teil eines Zeichenfolgenwerts, da dies mit einem Null-Terminator verwechselt wird; In technischer Hinsicht wäre Ihre String-Klasse nicht "binär sicher"; dieses Problem zu beheben Sie benötigen strcat und ähnliche Funktionen vollständig und wechseln Sie in memcpy und Freunde aus der obigen

Neben fallen zu lassen, ermöglicht Code wie

MyString str("foo"); 
foo += 80; // this compiles, but should it? 

schließlich die str*** Familie operator += wie diese Überlastung der Funktionen wird unnötigerweise langsamer, wenn Ihre Strings größer werden (weil sie die Zeichenkette jedes Mal von Anfang an durchsuchen müssen, um zu bestimmen, wo sie endet). Indem Sie Ihre eigene Längenvariable beibehalten und zu mem*** wechseln, wird dieses Problem ebenfalls behoben.

+1

Vielen Dank für die sehr informative Antwort. Ich mag es, dass Sie auch begründet haben, warum es richtig war und die Probleme, die es auf die andere Weise verursachen würde. Danke nochmal lol: P –

1

Die Verwendung von strcat ist falsch, da es sich um eine Null-Source-String beendet erfordert und ohne Nullabschluss mit einem Puffer bereitgestellt wird.

value kann nur eine begrenzte Anzahl von Zeichen enthalten, und es wird nicht versucht, die Größe von value zu erhöhen.

0

value Unter der Annahme, groß genug ist und Sie die Länge der Zeichenfolge in Ihrem Fall behalten, würde ich sagen:

value[size] = c; 
value[size+1] = '\0';