finde den fehler nicht
-
Hallo, ich saß jetzt eine ganze Weile davor und raffs einfach nicht, deshalb wende ich mich an euch. Es war eine String-Klasse zu schreiben, die hat auch einen Operator += zum addieren von Strings. Bei mir will er den newvalues Array nicht erzuegen, sagt er braucht einen konstanten Ausdruck. Auf einem anderen Rechner hat er den newvalues erzeugt, aber die Werte wurden nicht richtig eingetragen, der aValues schien nicht zu stimmen. Das Programm scheint mir eigentlich logisch so wie ichs geschrieben habe, irgendwas hab ich nicht begriffen. Wär echt super wenn jemand kurz nen Blick drauf werfen und mich erlösen könnte
#include <iostream> #include "String.h" using namespace std; String::String() { this->values = new char[0]; this->size=0; } String::String(char value[]) { this->values = new char[0]; copy(value); this->size = countString(value); } String::String(const String& string){ this->values = new char[0]; this->copy(string.values); this->size = countString(string.values); } String::~String(){ } void String::copy(char value[]){ int count = -1; while(value[++count] != '\0'){ values[count] = value[count]; } this->size = count; } String& String::operator=(String& string){ this->size = string.getSize(); delete[] values; values = new char[size]; char* newValues = string.getValue(); for(int i = 0; i < size ; i++){ values[i] = newValues[i]; } return *this; } String& String::operator+=(String& string){ int asize = string.getSize(); int newsize = this->size + asize; char newvalues[newsize]; char* aValues = string.getValue(); for(int i = 0; i < size; i++){ newvalues[i] = values[i]; } int x = 0; for(int i = size; i < newsize;i++){ newvalues[i] = aValues[x]; x += 1; } delete[] values; values = new char[newsize]; for(int i = 0 ; i < newsize ; i++){ values[i] = newvalues[i]; } this->size = newsize; return *this; } char String::operator[](int index){ return values[index]; } int String::countString(char value[]){ int count = 0; while(value[++count] != '\0'); return count; } char* String::getValue(){ return this->values; } int String::getSize(){ return this->size; } void String::printArray(){ for(int i = 0; i < size ; i++){ cout << values[i]; } cout <<endl; }
hier noch die benutzte main
#include <iostream> #include "String.h" using namespace std; /* * */ int main() { String s1("hel"); String s2("looooooooworld"); s1 += s2; s1.printArray(); system("pause"); ]
-
Was macht new char[0]?
-
In C++ gibt es keine leeren Arrays, schließlich kann ein Array implizit in einen Pointer umgewandet werden, welche Adresse sollte new dann zurückliefern?
-
314159265358979 schrieb:
In C++ gibt es keine leeren Arrays, schließlich kann ein Array implizit in einen Pointer umgewandet werden, welche Adresse sollte new dann zurückliefern?
Eine, die auf ein Array-Objekt ohne Elemente zeigt:
ISO/IEC 14882:2003 5.3.4 §7 schrieb:
When the value of the expression in a direct-new-declarator is zero, the allocation function is called to allo-
cate an array with no elements.
-
Sinnfrei ist das hier trotzdem. Irgendwann sollte schon mal Speicher alloziert und auch wieder freigegeben werden.
@delta_movement
Was genau wolltest du mit dem this->values = new char[0] denn bezwecken? Im Default-Konstruktor kann man value einfach auf 0 setzen und in den anderen Konstruktoren den jeweils erforderlichen Speicher allozieren.
-
- Beim Kopieren von String-Objekten wird nicht genügend Speicher alloziert.
- Es fehlen eine ganze Menge "const"s.
- Der Destruktor gibt keinen reservierten Speicher frei
- Der Zuweisungsoperator verkraftet keine Selbstzuweisung
- operator+= definiert ein Array (newvalues) mit Variabler länge. Das ist in C++ nicht erlaubt. Die Größe des Arrays muss eine Compile-Zeit-Konstante sein.
- countString greift auf keine Datenelemente zu. Die Funktion könnte auch eine freie sein. Bzw Du kannst sie durch strlen ersetzen. Du scheinst bei count allerdings die '\0' mitzuzählen.Alles in allem:
kk