Benutzerdefinierte Klasse string (C++)
Ich versuche zu schreiben, meine eigenen C++ - Klasse "String" für die Bildungs-und müssen-Zwecke.
Die erste Sache ist, dass ich nicht weiß, dass viel über die Betreiber, und das ist, warum ich will, Sie zu erlernen.
Ich begann zu schreiben, meine Klasse, aber wenn ich es ausführen, es blockiert das Programm, aber kein Absturz.
Werfen Sie einen Blick auf den folgenden code bitte vor dem Lesen weitere:
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 bin ich mir nicht so sicher, ich erklärte alles richtig. Ich habe versucht, googleing über Sie, aber alle die tutorials zu überladen erklären der basic-ideea ist sehr einfach, aber fehlen, um zu erklären, wie und Wann jedes Ding genannt wird. Zum Beispiel in meinem operator = ruft das Programm CString(CString& str); aber ich habe keine ideea, warum.
Ich habe auch an der cpp-Datei unter:
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 eine code genauso einfach, wie das
CString a = CString("Hallo") + CString(" Welt");
printf(a);
Ich habe versucht zu Debuggen, aber an einem Punkt bekomme ich verloren. Zuerst ruft er den Konstruktor 2 mal für "Hallo" und "Welt". Dann ist es in der + - operator ist in Ordnung. Dann ruft er den Konstruktor für den leeren string. Nach, dass es in "CString(CString& str)" und jetzt bin ich verloren. Warum ist das passiert? Danach habe ich bemerkt, dass mein string "Hallo Welt" ist im Destruktor (ein paar mal in eine Zeile). Wieder bin ich sehr puzzeled. Nach der Konvertierung wieder von char* Cstring und hin und her und es hält. Es ist nie zu bekommen ist, in der = - operator ist aber auch nicht weiter gehen. printf () wird nie erreicht.
Ich benutze VisualStudio 2010 für diese, aber es ist im Grunde nur standard-c++ - code und ich glaube nicht, dass es machen sollte, dass viel von einem Unterschied
Ehrlich gesagt, Nein. Ich Träume von code, smart und einfach zu bedienen. Betrachten CPlusplus.com ich bemerkte, std::string kann nicht etwas tun, so: string a = string("Hallo") + string(" Welt") oder string-a = String("Hallo")+ "Welt", weil es fehlt das + - überladung. Und mehr auf, dass ist, dass ich viel Arbeit mit strings-in diesem Teil von meinem Projekt und daher lieber eine zu haben, die hat alle Funktionen, die ich will und wie ich will. Ich hoffe, ich werde nicht frawned auf, das zu sagen.
Was Sie wirklich nicht können, ist : str3 = "qwe" + "rty"; In der standard-operator+ ist eine Globale Funktion für strings. Für mich ist das ein Anfängerfehler, neu zu definieren, einen std::string nur, weil Sie wollen, dass es Ihre Art und Weise und nicht, dass es einen spezifischen Bedarf.
(und Sie haben nicht einmal versucht, und sehen, dass das, was Sie wollen, ist tatsächlich möglich, mit der standard)
InformationsquelleAutor Sanctus2099 | 2010-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Zeile:
werden sollte:
Auch, den test für selbst-Zuordnung kann nicht der Sinn der copy Konstruktor - Sie sind ein neues Objekt erstellen - es kann unmöglich die gleiche Adresse wie jede vorhandene Objekt. Und der copy-Konstruktor sollte eine const-Referenz als parameter,
Wenn in Ihrem code, Sie erwarten, dass die Zuweisungs-operator verwendet werden, Sie wäre expectining falsch. Dieser code:
ist im wesentlichen das gleiche wie:
die copy-Konstruktion, nicht Abtretung. Die temporären CString "Hallo Welt" zerstört werden (Aufruf des destructor) nach einem konstruiert wurde.
Im Grunde, es klingt, als ob dein code funktioniert mehr oder weniger wie erwartet.
Ja, es war beabsichtigt zu empfehlen, dass zu tun, so war lächerlich. Es gibt keinen Grund, um solch eine Prüfung in den copy-Konstruktor, es ist unmöglich.
Ja, du hast Recht. Den test für selbst-Zuweisung nicht sinnvoll ist, die im Konstruktor, da es nicht existiert, bevor Sie ihn erstellen. Und danke für den Hinweis über die +1-Sache.
ich mochte die code-Witz, +1 🙂
InformationsquelleAutor
Nicht strlen verwenden, speichern Sie Ihre eigenen string-Länge. Die Schnur sollte nicht abgehangen zu haben, die einen null-terminator. Es ist ok zu verwenden, wenn Sie übergeben eine zufällige const char*, aber für interne Prozesse, sollten Sie die Größe.
Sich auch, Sie vergessen zu machen Ihren operator const char* const-überladung.
InformationsquelleAutor Puppy
Hier ist was Los:
CString a = [CString result of operator +]
wird c++ rufen Sie copy-Konstruktor. Daher der Aufruf anCString(CString& )
, die Sie sehen in den debugger.Nun, das ist insgesamt 4 Objekte erstellt, eins für jedes string-literal ("Hallo", "Welt"), eines für die Verkettung der (das Ergebnis der
CString::operator +
nennen, und einer, um das Ergebnis aufzunehmen (CString a = ...
). Jeder dieser temporären Objekten wird der Destruktor aufgerufen.Als für, warum Sie sich nicht immer die printf habe ich keine Ahnung. Ich kopiere einfach eingefügt deinen code in diese Datei:
Und wenn ich lief die resultierende ausführbare Datei, ich habe
hello world
als Ausgang. Dies ist auf Ubuntu mit g++ - 4.4. Nicht genau warum, unter den VS-debugger ist es nicht etwas ausdrucken.InformationsquelleAutor rossipedia
Ein paar Fehler, die Sie gemacht:
1. Copy-Konstruktor Signatur ist falsch. Es muss sein:
2. op= Signatur falsch ist. Es muss sein:
Btw., das war auch der Grund dafür, dass der copy Konstruktor aufgerufen wurde. Sie hat einen
return *this
am Ende die kopiert das Objekt (mit Ihrer op= Unterschrift).3. Sie ermöglichen CString-Instanzen mit
cstr == NULL
(Ihr default-Konstruktor wird dazu führen, dass diese eine Instanz). Obwohl, in fast allen Funktionen (copy-Konstruktor,operator +
,operator =
), die Sie nicht behandeln diesen Fall gut (q.cstr == NULL
).Vielleicht der einfachste und sicherste Weg wäre, einfach nicht zulassen, dass der Fall und ändern Sie Ihre Standard-Konstruktor:
InformationsquelleAutor Albert