SetterMethode statt direkter Übergabe an Klasse
-
kText = new string[len];du weißt aber schon das du damit jetzt len Zeichenketten anlegst? Nicht len Zeichen!
CKlasse(string strText)... CallByReferenz
CKlasse(const std::string& text)kText = new string[len]; } ~CKlasse(){}ahhja ... du legst erst was mit new an (len Zeichenketten) und gibst se nicht wieder frei!
kText = new std::string[text.length()]; } ~CKlasse() { delete [] kText; }...
-
ShadowEater schrieb:
...
string(*kText); ...
Hossa ! Das habe ich auch noch nie gesehen !
Man lernt nie aus !Meine Vorschläge zur eigentlichen Klasse:
1.) Wenn Du ein "dynamisches Array" brauchst: Nimm doch einfach eines !
std::vector<string> ist auch hier Dein Freund. Spart Dir new/delete, Speicherlöcher, CopyKonstruktor, ....2.) "class mit allem public" geht schöner mit "struct". Kann auch auch alles (sogar Dinge private machen)...
Gruß,
Simon2.
-
ShadowEater schrieb:
CKlasse(string strText) { strEingabe = strText; len = strEingabe.length(); kText = new string[len]; }Den wuerde ich an drei Stellen etwas aendern:
- kannst du eien Referenz an Stelle eines komplett neuen Strings uebergeben. Das erspart dir eine Copy-Operation. Mach die Referenz auch gleich noch const, denn du tust ja nichts was den uebergebenen String veraendert. Dann kannst du bei Bedarf auch const strings uebergeben.
- kannst du dir die Membervariable len sparen, es sei denn du willst erstens den String strEingabe aendern und zweitens len spaeter noch weiter benutzen. SOnst recihts, statdessen einfach jedesmal strEingabe.length() aufzurufen. Das spart dir den Platz fuer len und haelt deine Klasse konsistent (keine duplizierten Informationen)
- kannst du strEingabe gleich in der Konstruktorliste initialisieren. So wird aus dem Aufruf eines impliziten Default-Konstruktors und dem nachfolgenden Zuweisungsoperators ein expliziter copy-Konstruktor - wieder eine Operation gespart

Ich weiss dass das vermutlich nur Kleinkram ist und keine grossen Vorteile bringt, aber wenn man sich solche Einsparungen an Tipp- und Rechnerleistung frueh angewoehnt muss man spaeter nicht nach sowas suchen, wenns zu Ressourcenfressern wird

Also:
CKlasse(const string& strText) : strEingabe(strText) { kText = new string[strEingabe.length()]; }
-
Hi leute,
danke pumuckel, Simon2 und (D)Evil für eure Tipps.
Ich hab das jetzt sogemacht da? im Konstruktor nur kText mit Null initialisiert wird also:kText = NULL;in der Funktion:
strEingabe = itsText; len = strEingabe.length(); kText = new string[len];und am Ende der Funktion wird das Array dann auch wieder gelöscht !

ShadowEater
-
ShadowEater schrieb:
...
strEingabe = itsText; len = strEingabe.length(); kText = new string[len];...
Ich bin immer noch nicht sicher, dass Du so viele Strings haben möchtest, wie Deine Eingabe Buchstaben hat.
>ab cdefgh ijk ==> kText zeigt auf ein Array von 13 StringsZweitens weiß ich immer noch nicht, was an
vector<string> kText; kText.resize(itsText.length());unpassend sein sollte.
Gruß,
Simon2.
-
Hi Simon2,
am vector ist gar nichts unpassend !
Im Prinzip hast Du mit dem Strin Array auch recht ich werde das alles auf chars umstellen möglicherweise. Aber die Strinklasse bietet halt viele Funktionen die ich später noch gut brauchen kann (find, unique etc...).Gruß
ShadowEater
-
ShadowEater schrieb:
...Aber die Strinklasse bietet halt viele Funktionen die ich später noch gut brauchen kann (find, unique etc...).
Gruß
ShadowEater

Sory, das Argument verstehe ich jetzt gar nicht !!bitte beantworte mir folgende Frage: Wie viele strings brauchst Du hinter kText ? "strings" (= Zeichenketten NICHT "wie viele Zeichen...")
Ich habe den Eindruck, Du willst eigentlich nur, dass kText auf eine Kopie der Stringeingabe zeigen soll (also ein String) ...
Nach Ansehen Deines ersten Beitrags glaube ich, dass Du Dich da total verannt hast und eigentlich Folgendes willst:
class CKlasse { private: string strEingabe ; public: CKlasse(string const& strText = "") : strEingabe(string) {} void setStrEingabe(string const& strText) { strEingabe = strText; } };- Du kannst den Wert von strEingabe über den Konstruktor UND
- ... über die Funktion setStrEingabe() verändern UND
- ... due kannst ein CKlasse-Objekt erzeugen, ohne einen string übergeben zu müssen.
- leere Kon-/Destruktoren ("
~CKlasse(){}")braucht keiner (Ausnahme: Wenn man einen DefaultKonstruktor UND einen mit Parametern braucht - die nicht mit Defaultparametern (s.o.) abzuhandlen sind.
Benutzung:
int main() { CKlasse c1("Simon2"); // c1.strEingabe == "Simon2"; CKlasse c2; // c2.strEingabe == ""; c1.setStrEingabe("ShadowEater"); // c1.strEingabe == "ShadowEater"; c2.setStrEingabe("Simon2nochmal"); // c2.strEingabe == "Simon2nochmal"; return 0; }Gruß,
Simon2.
-
Hi Simon2,
gibts ne Möglichkeit Dir ne PN zu schicken ?
ShadowEater
-
P.S.@Simon2 ;
kText ist ein dynamisches Array vom Typ string in das einzelne Teilstrings(ich weiss dass Strings Zeichenketten sind, aber bei den Teilstrings handelt es sich um einzelne Zeichen)eingelesen werden.
Gruß
ShadowEater
-
Hi,
also verstehe ich richtig: Du möchtest aus dem Eingabestring:
"abcd ef"folgende 7 Strings machen:
1.) "a" 2.) "b" 3.) "c" 4.) "d" 5.) " " 6.) "e" 7.) "f"?
1.) Auf diesen "Einbuchstaben-Strings" sind allerdings Funktionen wie find(), unique(), ... nicht besonders sinnvoll.
2.) Da Du auf einen String selbst schon mit [] auf jedes einzelne Zeichen zugreifen kannst, ist die Abbildung auf ein "Array von Einzelbuchstabenstrings" nicht besonders hinlfreich.
3.) Für die Aufgabe "dynamisches Array" bietet C++ ganz absichtlich vector an: Ist praktisch, schön und sicher
4.) ... und vom Zugriff her (mittels []) nicht anders als auf ein Array. Dafür bekommst Du size(), resize(), push_back(), ... schon geschenkt (was Du für ein C-Array erst selbst implementieren müsstest.
5.) Unter http://www.cppreference.com/cppalgorithm/index.html findest Du eine Auswahl an Algorithmen, die man auf vector loslassen kann ... das sind definitiv mehr als für string. (find() und unique() sind dabei)Gruß,
Simon2.
-
Danke Simon2,
ich werd vektor benutzen klar, ist einfah besser aber ich möchte verstehen wie ichs mit String und Arrays regeln kann !

ShadowEater
-
ShadowEater schrieb:
Danke Simon2,
ich werd vektor benutzen klar, ist einfah besser aber ich möchte verstehen wie ichs mit String und Arrays regeln kann !

ShadowEaterEigentlich genauso, nur dass Du eben mit new[] und delete[] anlegst, Dir die Länge merken und bei jeder nachträglichen Änderung selbst anfordern, kopieren und löschen musst...
Zeig' doch mal konkreten Code (von Dir getestet) und sag' mal, was Di daran nicht passt.
Gruß,
Simon2.