Zu bestehenden Klassen aus der Bibliothek Methoden hinzufuegen
-
Hallo,
ist es möglich (wie zb in Ruby) einer bestehenden Klasse (zb. "string") Methoden hinzuzufügen?
Also, dass ich in eine .cpp-Datei <string> inkludiere und später dann so etwas wie
bool string::scan() { /* TODO */ }schreibe, und diese Methode auf strings anwenden kann?
-
Dafür gibt es freie Funktionen, Also:
bool scan(std::string & str);
-
naja was du vielleicht machen könntest wäre, du schreibst dir eine klasse und leitest von string (oder was du halt brauchst ab)
und da kannst du ja operationen hinzufügen...
aber ich bezweifle dass das so sinnvoll ist, da alles private da auch private sein sollte, sprich du kannst nicht auf die member zugreifendas beste sind globale (oder statische member-) funktionen
-
Da habe ich mal wieder zu kurz nachgedacht -.- ...
Hatte diese Möglichkeit ganz vergessen.
Danke sehr!
-
Man leitet nicht von der STL ab. Das ist nicht vorgesehen.
-
HighLigerBiMBam schrieb:
Man leitet nicht von der STL ab. Das ist nicht vorgesehen.
C++ kennt keine STL, sondern nur 'ne Standard Library. Und darin gibt es sehr wohl Dinge für die Vererbung vorgesehen ist.
-
Jetzt könnten wir ja auch wieder trefflich darüber diskutieren, wie sinnvoll dieser zusammengewürfelte Ableitungskram in C++ wirklich ist

-
Hm, eine neue Klasse zu schreiben, wäre wohl zuviel Aufwand.
Dachte, dass es da vllt genau so eine einfache Möglichkeit wie in Ruby gibt.
Mit den freien Funktionen klappts ja genauso gut
-
Decimad schrieb:
Jetzt könnten wir ja auch wieder trefflich darüber diskutieren, wie sinnvoll dieser zusammengewürfelte Ableitungskram in C++ wirklich ist

Sofern sinnvoll eingesetzt, absolut notwendig. Warum sollte es denn nicht sinnvoll sein (kann ich mir echt nicht vorstellen)?
-
Ich sage nicht, dass es nicht sinnvoll wäre, aber die c++ "Ableitung" verwüfelt halt mehrere Konzepte und lädt dazu ein, falsche Dinge zu tun...
-
Natürlich bietet die STL Klassen, von denen man ableiten kann (und sogar soll). Beispiele sind dafür z.B. unary-/binary_function oder std::iterator.
Von Containern sollte allerdings nicht abgeleitet werden, da sie keinen virtuellen Destruktor besitzen.
Die Frage lässt sich nicht pauschal mit ja oder nein für alle Klassen der STL beantworten.
-
DocShoe schrieb:
Beispiele sind dafür z.B. unary-/binary_function oder std::iterator.
Das liegt eher daran, dass es sich nicht um vollwertige Klassen sondern um traits bzw. policies handelt.
Von Containern sollte allerdings nicht abgeleitet werden, da sie keinen virtuellen Destruktor besitzen.
Virtuelle Destruktoren sind keine Voraussetzung für Ableitbarkeit. Du hast mit std::iterator & Co selbst Beispiele geliefert.
-
Decimad schrieb:
[...] aber die c++ "Ableitung" verwüfelt halt mehrere Konzepte [...]
Welche Konzepte denn?
-
Das war falsch ausgedrückt. Ich meinte, wir verwürfeln die unterschiedlichsten Ideen und Konzepte in einem Doppelpunkt und nochmal so viele Möglichkeiten dieses Doppelpunkts führen auf Irrwege...
Der Doppelpunkt ist und bleibt natürlich nur der Doppelpunkt
Wenn ich mich recht entsinne, habe ich im letzten Jahr aus drei verschiedenen Gründen abgelitten (im wahrsten sinne des Wortes :D):
1. Um Klassen in unions zu verfrachten (ableiten von POD's)
2. Um Klassen Funktionalität hinzuzufügen (über class some : public other < some >, also mixins sozusagen)
3. Um Schnittstellen anzubieten (pure virtual).
(4. Kombinationen davon)Nochmal so oft habe ich aus irgendeinem praktischen Grund abgelitten und nach ein paar Stunden brach das Kartenhaus zusammen, weil anschließend irgendwas möglich war, was nicht möglich sein sollte.
Oft habe ich auch Beispiele gesehen, in denen ein Vektor von der Klasse Matrix abgeleitet wird, aber die is-a-Beziehung lässt sich eben in C++ durch solche Ableitung nicht darstellen.Am Ende sieht man ohne genauere Kontrolle des Quellcodes einer Ableitung nicht an, was sie bezweckt. Und ich habe für mich den Eindruck, dass ich viel mehr intuitives Wissen darüber gebildet habe, was ich damit nicht machen darf, als was es mir ermöglicht.