Operator Überladung
-
Hallo
string_klasse.h
class String { private: char *buffer; unsigned len; public: // Deklaration der Methoden(Fähigkeiten) von String // Zugriffsmethode char *get_String() const; // Operator Überladung String operator+=(const String &str1); };string_klasse.cpp
// Definition der Methoden(Fähigkeiten) von String // Zugriffsmethode char *String::get_String() const { return buffer; } // Operator Überladung String String::operator+=(const String &str1) { // tmp gleich mit aktuellen Objekt initialisieren String tmp(*this); // Aktuelles Objekt löschen delete [] buffer; // Gesamtlänge beider Objekte ermitteln len = tmp.len + str1.len; // Speicher reservieren buffer = new char[len]+1; // linker Operand in buffer kopieren strcpy(buffer, tmp.buffer); // rechten Operand anhängen strcat(buffer, str1.buffer); // Zurück und fertig return buffer; }main.cpp
String str("Adam"); str += " und Eva"; cout << str.get_String();zum Problem
Schaut bitte mal auf den main.cpp Abschnitt. Ich möchte gerne an den Text Adam mit dem neuen überladenen Operator "+=" den Text " und Eva" anhängen.Die Ausgabe stimmt soweit. Allerdings kommt auch ein Fehler, den ich als JPG Bild festgehalten habe. Wie ist dieser zu beheben?
-
delete[] buffer ist falsch. sorry, atm keine zeit für genauere Antwort...

-
// Speicher reservieren buffer = new char[len]+1;Laut meinem C++ Buch ist die obige Zeile total in Ordnung.
Wenn man das so umschreibt
// Speicher reservieren buffer = new char[len+1];klappts ohne Fehlermeldung. Das scheint wohl der Fehler zu sein.
Trotzdem danke.
MfG
#smY
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
template<typename T> class basic_string { T* m_data; std::size_t m_length; public: basic_string(const char* str) : m_length(std::strlen(str)) { m_data = new T[m_length + 1]; std::strcpy(m_data, str); } basic_string() : m_length(0) { m_data = new T[m_length + 1]; m_data[0] = 0; basic_string(basic_string const& rhs) : m_length(rhs.m_length) { m_data = new T[m_length + 1]; std::strcpy(m_data, rhs.m_data); } basic_string& operator=(basic_string const& rhs) { m_length = rhs.m_length; m_data = new T[m_length + 1]; std::strcpy(m_data, rhs.m_data); return *this; } ~basic_string() { delete [] m_data } public: const char* c_str() const { return m_data; } std::size_t length() const { return m_length; } public: friend std::ostream& operator <<(std::ostream& out, basic_string<T> const& data) { out << data.m_data; return out; } basic_string operator += (basic_string const& rhs); };also get_string sollte schon einen const char zurück geben ... sonnst kann es dir passieren das len nachher nichtmehr stimmt! (falls jemand was an deinem String dann verändert)
#include <iostream> int main() { std::cout << basic_string<char>("Hallo Welt!") << std::endl; }
Bearbeitung
Hab dir mal kurz die großen 3 reingepackt
-
#smY schrieb:
// Speicher reservieren buffer = new char[len]+1;Laut meinem C++ Buch ist die obige Zeile total in Ordnung.
syntaktisch ist die in Ordnung, technisch nicht. Du unterschlägst erstens den Platz für den Null-Terminator und überpringst zweitens das erste Byte des angeforderten Speicherbereiches.
PS: Ich hoffe für dich, deine String-Klasse hat die "großen drei" implementiert (Copy-Ctor, op= und Dtor)
PPS: Was spricht dagegen, std::string zu verwenden?