frage zu cctype und cname
-
Hallo zusammen,
ich habe eine eher allgemeine Frage zu diesen beiden Headern.
Im C++ Primer bin ich gerade da angekommen, wo es um die Verarbeitung von Strings geht und dort werden diese beiden Header erwähnt. Nur wenn ich das richtig verstanden habe, sind das doch portierte Header aus der C Bibliothek und enthalten somit keine Klassen und Methoden, sondern einfache Funktionen, oder?Sollte man diese Funktionen verwenden und gibt es überhaupt Alternativen dazu?
Es wird ja überall vor "C with classes" gewarnt. Ich als jemand, der ja noch nicht ganz so lange dabei ist, möchte dagegen schon versuchen, C++ objekt orientiert zu verwenden.Ich kann mir allerdings auch nicht vorstellen, dass im C++ Primer etwas falsches vermittelt wird.
Zur Info: ich habe die 4. Auflage.
Was würdet ihr mir also raten?Viele Grüße
-
Nur wenn ich das richtig verstanden habe, sind das doch portierte Header aus der C Bibliothek und enthalten somit keine Klassen und Methoden, sondern einfache Funktionen, oder?
Ja genau.
(Wie du davon sprichst, fast wie ein Snob: Die einfachen Funktionen, bäuerlich und schlecht erzogen)
Sollte man diese Funktionen verwenden und gibt es überhaupt Alternativen dazu?
Ja und ja. Das ist in Ordnung. Das benutzen alle.
Diese Funktionen werden nicht nur standardmäßig verwendet, sondern wurden mit C++11 sogar ergänzt:
std::is_blankDie 'Alternative' währen die locale-Funktionen aus
<locale>, die dasselbe tun, nur dabei dasstd::ctype-Facet des übergebenen Locales berücksichtigen.Oder man geht und macht es gleich selbst über das Facet - das geht natürlich auch.
Ich als jemand, der ja noch nicht ganz so lange dabei ist, möchte dagegen schon versuchen, C++ objekt orientiert zu verwenden.
Das hatten wir gerade in einem anderen Thread. Klassen sind nicht immer sinnvoll. Hier sind einfache Funktionen völlig ausreichend. Gerade dann, wenn du sie bspw. als Prädikat einem STL-Algorithmus übergeben willst.
Du musst ab einem bestimmten Punkt deines Lernprozesses sowieso auch die C-Library verstehen (dazu gehören auch alle <cstring>-Funktionen,
malloc, & co.). Viele benutzen (gerade in C++03) ja auchsrand/rand,timeundtm, und Konsorten.
-
Dank dir Sone.
Wieder was dazu gelernt. Wunderte mich nur ein wenig, da ja z.B. C# sehr viel in Klassen packt. Da geht ja beispielsweise tolower() direkt aus dem String Objekt heraus. Wenn ich das richtig verstanden habe, muss man in C++ dagegen der tolower Funktion den String als Parameter übergeben.Nach dem Thread, den du angesprochen hast, werde ich gleich mal schauen.
Was die "einfachen Funktionen" betrifft", klingt es beim zweiten Lesen tatsächlich etwas nach Snob.
"Mein König. Die einfachen Funktionen verlangen weniger Code."
-
Funktionen sind eine feine Sache. Die Kritik an "C with Classes" bezieht sich nicht auf die Nutzung von Funktionen als Bausteine deiner Programme. Keinen Grund sie zu meiden. Wenn sich ein Problem gut mit einer Funktion lösen lässt, benutze auch eine Funktion.
Java (und damit auch C#) ist in dieser Hinsicht etwas hirnverbrannt. Lässt sich aber durchaus mit dem damaligen Zeitgeist erklären, wenn man beachtet, wann Java designt wurde. Heute ist man etwas weiser.

-
Dank dir. Mit dem damaligen Zeitgeist meinst du bestimmt den Hype der objekt orientierten Sprachen, von dem ich hier im Forum schon öfters gelesen habe, oder? Allerdings ist doch C# noch gar nicht so alt.
Gibt es denn irgend welche Tabus, die manmöglichst meiden sollte, damit man nicht in diese cwc Richtung abdriftet.
Also was ich weiß ist, dass man keine .h Header aus der c Bibliothek verwenden sollte.
-
Grundsätzlich solltest du manuelle Speicherverwaltung und Arrays meiden und stattdessen auf RAII und gekapselte Klassen setzen. Hier wird das Ganze gut zusammengefasst.
Gibt natürlich viele andere C-Sprachmittel, für die es in C++ oft bessere Alternativen gibt: Variable Argumentlisten, Makros,
goto, C-Casts,union, ...
-
Man sollte RAII verwenden, wenn nötig auf Fehler mit Exceptions statt kryptischer Rückgabewerte reagieren, die Standard Library auch nutzen, wenn möglich die "richtigen" Funktionen und nicht die aus den alten c-headern verwenden und man sollte übersichtlich programmieren.
BIOSzillator schrieb:
Wunderte mich nur ein wenig, da ja z.B. C# sehr viel in Klassen packt. Da geht ja beispielsweise tolower() direkt aus dem String Objekt heraus. Wenn ich das richtig verstanden habe, muss man in C++ dagegen der tolower Funktion den String als Parameter übergeben.
Schau dir mal an, welche große Anzahl von Funktionen es im Header Algorithm gibt. Würde man diese nun für jede Klasse implementieren, wären die Header einfach nur übervoll.
In C++ sind die Container von den Algorithmen getrennt und arbeiten über Iteratorenpaare zusammen.
Hier wird das in den ersten drei Teilen ganz gut erklärt.
-
Vielen Dankf ür die Tipps. Ich denke, dass ich dann momentan nicht "viel" falsch mache.

Das mit der Auslagerung der Algorithmen macht bei der Menge Sinn. Das würde allerdings doch bedeuten, dass die Klassen in beispielsweise C# riesig sind. Oder die Methoden sind in C# Überschaubarer als in C++, was ich jetzt mal vermute.
-
BIOSzillator schrieb:
Das würde allerdings doch bedeuten, dass die Klassen in beispielsweise C# riesig sind. Oder die Methoden sind in C# Überschaubarer als in C++, was ich jetzt mal vermute.
Was heißt schon "groß" oder "klein", wenn man von Klassen und Methoden spricht? Der Code ist bei beiden irgendwo vorhanden, er ist bloß anders organisiert.
-
Achso, dass war auf die Aussage von Marthog bezogen.
-
BIOSzillator schrieb:
Achso, dass war auf die Aussage von Marthog bezogen.
Ich kenne zwar C# nicht, aber die haben den Code sicherlich auch nicht einfach kopiert. Vermutlich erben die Container von einer Klasse, die eine allgemeine Sortiemethode implementiert ("sortable_container"), mit optionaler Sonderimplementierung für Container, bei denen man das Sortieren optimieren kann (verkettete Listen). So würde ich das jedenfalls machen, wenn ich zwanghaft alles in eine Klassenhierarchie einordnen müsste.
Natürlich hätte man dann den ganzen Sortiercode auch dabei, wenn man bloß einen Container ohne Sortieren möchte, aber das wird wohl zu verkraften sein.