Ich versuche, meine eigene C++ - String-Klasse für Bildungs- und Bedarfszwecke zu schreiben.
Das erste ist, dass ich nicht viel über Operatoren weiß und deshalb will ich sie lernen. Ich habe angefangen, meine Klasse zu schreiben, aber wenn ich sie starte, blockiert sie das Programm, aber stürzt nicht ab.
Werfen Sie einen Blick auf die folgende Code bitte, bevor Sie weiterlesen:Benutzerdefinierte String-Klasse (C++)
class CString
{
private:
char* cstr;
public:
CString();
CString(char* str);
CString(CString& str);
~CString();
operator char*();
operator const char*();
CString operator+(const CString& q)const;
CString operator=(const CString& q);
};
Zunächst einmal bin ich nicht so sicher, erklärte ich alles richtig gemacht. Ich habe versucht, darüber zu googeln, aber alle Tutorials zum Überladen erklären die grundlegenden Ideen, die sehr einfach sind, aber nicht erklären, wie und wann jedes Ding aufgerufen wird. Zum Beispiel ruft das Programm in my = operator CString auf (CString & str); aber ich habe keine ideea warum.
Ich habe auch die CPP-Datei unten angehängt:
CString::CString()
{
cstr=0;
}
CString::CString(char *str)
{
cstr=new char[strlen(str)];
strcpy(cstr,str);
}
CString::CString(CString& q)
{
if(this==&q)
return;
cstr = new char[strlen(q.cstr)+1];
strcpy(cstr,q.cstr);
}
CString::~CString()
{
if(cstr)
delete[] cstr;
}
CString::operator char*()
{
return cstr;
}
CString::operator const char*()
{
return cstr;
}
CString CString::operator +(const CString &q) const
{
CString s;
s.cstr = new char[strlen(cstr)+strlen(q.cstr)+1];
strcpy(s.cstr,cstr);
strcat(s.cstr,q.cstr);
return s;
}
CString CString::operator =(const CString &q)
{
if(this!=&q)
{
if(cstr)
delete[] cstr;
cstr = new char[strlen(q.cstr)+1];
strcpy(cstr,q.cstr);
}
return *this;
}
Zum Testen habe ich einen Code genauso einfach wie die
CString a = CString ("Hallo") + CString ("Welt");
Druck (a);
Ich habe versucht, es zu debuggen, aber an einem Punkt werde ich verloren. Zuerst ruft er den Konstruktor 2 mal für "Hallo" und für "Welt" auf. Dann kommt es in den Operator +, was in Ordnung ist. Dann ruft es den Konstruktor für die leere Zeichenfolge auf. Danach wird es in "CString (CString & str)" und jetzt bin ich verloren. Warum passiert dies? Danach bemerkte ich, dass meine Zeichenfolge, die "Hello World" enthält, im Destruktor ist (einige Male in Folge). Wieder bin ich sehr verwirrt. Nach der Konvertierung von char * nach Cstring und vor und zurück stoppt es. Es kommt nie in den Operator =, aber es geht auch nicht weiter. printf (a) wird nie erreicht.
Ich benutze Visual Studio 2010 für diese, aber es ist im Grunde nur Standard C++ Code und sollte daher glaube ich nicht, dass viel Unterschied
ich die Bildungs verstehen, aber was ist mit der „Notwendigkeit“ Zweck? Sie mögen nicht standard std :: string? – Nikko
Ehrlich, nein. Ich träume von Code, der intelligent und einfach zu verwenden ist. Mit Blick auf CPlusplus.com Ich bemerkte, dass std :: string kann etwas tun wie folgt: string a = string ("Hallo") + string ("world") oder string a = String ("Hallo") + "Welt" weil es die + Überladung fehlt. Und mehr daran ist, dass ich in diesem Teil meines Projekts viel mit Strings arbeiten muss und somit einen habe, der alle Funktionen hat, die ich will und wie ich will. Ich hoffe, ich werde nicht dazu verleitet, dies zu sagen. – Sanctus2099
Was Sie wirklich nicht tun können, ist: str3 = "qwe" + "rty"; Im Standard ist der Operator + eine globale Funktion für Strings. Für mich ist es ein Anfängerfehler, einen std :: string neu zu definieren, nur weil Sie es auf Ihre Weise wollen und nicht, dass es einen bestimmten Bedarf gibt. – Nikko