Von std::string vererben?
-
Ich denke das sollte ohne Probleme gehen.
( Mir würden ad hoc auch keine Einfallen ).folgender Schnipsel funktioniert soweit auf jeden Fall wie erwartet:
( Randeffekte würden mich wundern )#include <iostream> #include <vector> template<class t> class MyVector: public std::vector<t>{ public: MyVector(){std::cout<<"japp\n";} }; class MyVector2 : public std::vector<int>{ public: MyVector2(){std::cout<<"jipp\n";} }; int main(){ MyVector<int> foo; MyVector2 bar; return 0; }Kann mir jemand sagen warum ich vector und nicht string gelesen hab ?
Egal, vector geht auf jeden Fall auch.
Ansonsten ist der Beitrag über mir wohl interssanter ...
-
Hi,
"geht" bedeutet aber nicht automatisch "geht gut" oder "sollte man machen" oder gar "gibt keine bessere Lösung".

Auch hier wieder: Das Fehlen eines virtuellen Destruktors ist ein starker Hinweis darauf, dass std::string nicht zum Ableiten designed wurde (Polymophie kann z.B. Speicherlecks hinterlassen)....
Gruß,
Simon2.
-
Auch wenns nach stumpfer Wiederholung klingen könnte.
Dies hatte ich ganz vergessen anzumerken.
Ich hatte in nem Programm mal gedacht, ich müsste von irgendeinem std::Container
ableiten.
Am Ende hab ich gemerkt dass die STL das alles ( was ich eingebaut habe ) eh
bereitstellt, bzw , wie Simon2 schon sagt, eigentlich der Ansatz nicht zwingend
der richtige war.
Naja, aber das geht aus dem Post über mir ja schon deutlich hervor.
-
std::string ist sowieso Müll. Warum sollte man auch noch von sowas ableiten?
-
Simon2 schrieb:
Auch hier wieder: Das Fehlen eines virtuellen Destruktors ist ein starker Hinweis darauf, dass std::string nicht zum Ableiten designed wurde (Polymophie kann z.B. Speicherlecks hinterlassen)....
Wenn der Destruktor von dem abgeleiteten String trivial ist und die Klasse keine zusätzlichen Datenfelder enthält ist es dennoch kein Problem.
Aber wenn man schon so eingeschränkt ist, kann man die entsprechenden Methoden auch als freie Funktionen implementieren.
-
.filmor schrieb:
Wenn der Destruktor von dem abgeleiteten String trivial ist
Das ist unmöglich. Und undefiniertes Verhalten ist nur selten kein Problem.
-
camper schrieb:
.filmor schrieb:
Wenn der Destruktor von dem abgeleiteten String trivial ist
Das ist unmöglich. Und undefiniertes Verhalten ist nur selten kein Problem.
Wieso ist das unmöglich? Wenn's nichts zu zerlegen gibt und der Destruktor nicht implementiert wird, ist er ziemlich trivial. Aber wenn der Standard das nicht mag, okay.
-
Es ist recht offensichtlich, dass der Destruktor von std::string nicht - im landläufigen Sinne - trivial sein kann. Zudem definiert der Standard, was trivial bedeutet:
- Alle Klassenmember haben einen trivialen Destruktor (hier scheitert es in jedem Falle)
- die Klasse hat keine Basisklasse (u.a. wg. Lookup eines ggf. überladenen delete-Operators)
- keine virtuellen Funktionen
Die Ausführung eines trivialen Destruktors kann man offensichtlich auch problemlos auslassen. Der Standard gebietet es nicht, Objekte überhaupt zu zerstören - undefiniert wird es erst, wenn wir uns auf Seiteneffekte dieser nicht ausgeführten Destruktoren verlassen. Solche Seiteneffekte kann ein trivialer Destruktor aber nicht haben.Falls du mit trivial etwas anderes gemeint hast, müsstest du das schon präzisieren. Es ist sowieso kein guter Ratschlag: selbst wenn wir ignorieren, dass das Resultat nicht standardkonform ist, bleibt festzuhalten, dass durch die Vererbung keinerlei Gewinn zu erzielen ist.
-
camper schrieb:
Es ist recht offensichtlich, dass der Destruktor von std::string nicht - im landläufigen Sinne - trivial sein kann.
Von std::string sprach ich auch gar nicht. Ich meinte die abgeleitete Stringklasse:
class toller_string : public std::string {};Der Destruktor von toller_string tut nichts außer den Destruktor von std::string aufzurufen. Das war „mein“ trivial. Denn ~toller_string () <=> ~std::string ().
Aber wie gesagt, wenn der Standard das nicht will ist's auch gut. Braucht eh niemand.camper schrieb:
selbst wenn wir ignorieren, dass das Resultat nicht standardkonform ist, bleibt festzuhalten, dass durch die Vererbung keinerlei Gewinn zu erzielen ist.
Sagte ich ja bereits.
-
Hmm das klingt ja nicht sehr gut mit dem Destruktor.
Naja, da von std::string ableiten keine gute Idee zu scheint leg ich mein Problem einfach offen.Also ich möchte ganz normale Zahlen in nen "spanischen String" umwandeln.
Die zahlen 0 bis 15 müssen gespeichert werden weil diese fest sind.
z.b cero, uno, dos, tres, cuatro...Ab zahl 15 setzt es sich dann so zusammen: zehner (z.b. diez + y + seiz = diciseis (achtung kein schreibfehler z wird zu c und y zu i)).
D.h. ich muss des weiteren noch zwischenspeichern:
10,20,30,40...90, 100, 1000, 1Mio, 1Milliarden.Also hab ich mir gedacht ich leite von std::string ab und füge dieser Klasse dann noch ne private Member Variable die die entsprechende Zahl zum string speichert.
also halt nen array von "von_std::string_abgeleitete_klasse" und dann halt einfach wenn ne zahl (z.b. 4 ) eingegeben wird mit ner for schleife durchlaufen lassen ob bei irgend einem Object die Member variable den gleichen Wert hat.
also z.b.
if(von_std::string_abgeleitete_klasse[i]->getZahl())vielleicht habt ihr ja ne bessere Idee wie ich das machen soll

-
Typisches Beispiel für schlichtweg falsches Design

Warum versuchst du es nicht erstmal mit der trivialen Lösung, Umwandlungsfunktionen zu bauen (String -> Zahl und Zahl -> String)?
-
Wie wärs denn mit einem Manipulator? Den kannst du dann so anwenden:
cout << str; // ausgabe as is cout << spanish << str; // ausgabe über deinen manipulatorDie static-Variablen wirfst du einfach als statics in den Manipulator rein. Anstatt cout kann da natürlich jeder streambuf stehen. Wenn es nicht zur Ausgabe dienen soll, bräuchte man Informationen wozu dann.
MfG SideWinder
-
Naja aber ich muss ja auch wenn ich mir nen manipulator oder umwandlungsfunktionen bau die "Daten" auch irgendwie zwischenspeichern. Und ich möchte die Spanischen Zahlen(ausgeschrieben) so weit wie möglich generieren. Wär ja auch schwachsinn 1 Mio strings irgendwo zu speichern.
-
Stefan Litzel schrieb:
Ab zahl 15 setzt es sich dann so zusammen: zehner (z.b. diez + y + seiz = diciseis (achtung kein schreibfehler z wird zu c und y zu i)).
Es heißt dieciséis.
-
std::map<int, std::string>oder
std::vector<std::pair<int, std::string> >?
Das Abgeleite wäre jedenfalls ziemlich problematisch - öffentlich abzuleiten heißt, dass deine Klasse ein String ist, d.h., dass sie alles kann, was ein std::string auch kann. Wenn dir jetzt jemand einen solchen String aus einer Vier baut und nachher zwei Zeichen in der Mitte entfernt, hast du plötzlich die spanische Sprache verändert!
