Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

C++: Eine eigene String-Bibliothek

BWString im Überblick

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Hier lernen Sie anhand eines Überblicks die String-Klasse von Bill Weinman kennen und erfahren nebenbei auch gleich, weshalb Unit Tests eine überaus praktische Sache sind.
06:51

Transkript

In dieser Lektion sehen wir uns das Gesamtkonzept der Klasse "BWString" an. Hier habe ich eine Arbeitskopie von "unit-tests.cpp" aus den Übungsdateien. Außerdem habe ich die Klassen "BWString" und "BWUTest" in diesem Projekt geöffnet. Zuerst möchte ich kurz auf den Wert von Komponenten-Tests oder Unit-Tests eingehen. Die meisten größeren Entwicklungsumgebungen bringen ein Komponenten-Testsystem mit und sowohl Xcode, als auch Visual Studio enthalten integrierte Funktionen für Komponenten-Tests. Die Komponenten-Tests sind unglaublich nützlich. Während der Entwicklung dieser Klasse habe ich für jedes Feature Komponenten-Tests geschrieben, wenn es implementiert wurde. Wenn ich dann neue Features schreibe, werden die vorhandenen Features weiterhin getestet. Das hat bei verschiedenen Gelegenheiten Zeit und Aufwand gespart, da neue Features mit einem vorhandenen Feature in Konflikt geraten oder ein vorhandenes Feature sogar unbrauchbar machen können. Und wie ein Blick in diese Datei zeigt, besteht sie im Prinzip aus einem Bündel von Komponenten-Tests. Und die Komponenten-Tests sind wie folgt angelegt. Ich rufe die Methode "test" in meiner Komponenten-Testklasse auf, übergebe ihr einen String, wie der Test genannt wird. Dann kommt ein Ausdruck und dieser wird zu "true" ausgewertet, wenn der Test erfolgreich verläuft, und zu "false", wenn der Test nicht bestanden wurde. Bei vielen Komponenten-Testklassen ist es umgekehrt. Also, ist Vorsicht geboten. Wenn ich dieses Projekt nun erstelle und ausführe, erscheint für jeden dieser Tests ein kurzer String, der Auskunft darüber gibt, was es für ein Test war, und ob er erfolgreich absolviert wurde oder gescheitert ist. Ganz unten erscheint dann eine Zusammenfassung. Wie Sie sich überzeugen können, ist dies gerade in einem komplizierten Code-Abschnitt ein unglaublich nützliches Verfahren, um zu verfolgen, was funktioniert und was nicht. Bei den meisten Komponenten- Testsystemen und speziell bei denen, die in eine Entwicklungsumgebung eingebunden sind, besteht nun das Problem darin, dass sie kaum portabel sind. Mit anderen Worten, wenn ich meine Tests auf dem einen System schreibe, werden die Tests in einem anderen System nicht funktionieren, außer wenn ich sie modifiziere oder komplett neu schreibe. Das Gute an der Sache ist, dass ein Komponenten-Testsystem recht einfach zu schreiben ist. Deshalb habe ich mir mein eigenes Testsystem geschaffen. Und wie ein Blick in diese .cpp-Datei zeigt, ist es nicht einmal viel Code. Das Ganze spielt sich hier ab. Ich habe einen Konstruktor, einen Initialisierer, die eigentliche Testmethode und die Methode zur Berichterstattung. Und hier in der .h-Datei sehen Sie alle meine Funktionssignaturen. Zudem habe ich eine sehr einfache Datenstruktur, die lediglich "pass - bestanden", "fail - gescheitert" und noch einige Strings umfasst. Das Komponenten-Testsystem ist also verblüffend einfach zu schreiben. Und auf diese Weise habe ich ein portables Exemplar, das unter Windows, auf dem Mac und unter Unix läuft, praktisch überall dort, wo ich es brauche und das Ganze ohne irgendwelche Modifikationen. Ein Feature sei hier erwähnt: dieses "summary_flag". Hier ist es auf "false" gesetzt. Und wir erhalten einen vollständigen Bericht, wenn ich dieses Projekt erstelle und ausführe. Dann erscheinen alle diese Deskriptoren. Wenn ich das "summary_flag" auf "true" setze, es hier an die Summary-Methode des Komponenten-Tests übergebe, und das Projekt erstelle und ausführe, bekomme ich lediglich eine Zusammenfassung. Alle diese individuellen Strings erscheinen nicht mehr. Ich erhalte nur noch die Meldung, dass alle Tests erfolgreich waren und keiner gescheitert ist. Und mehr will ich eigentlich auch gar nicht wissen. Für die meisten Zwecke lasse ich aber das "summary_flag" auf "false", um den vollständigen Bericht zu erhalten und zu erfahren was vor sich geht, wenn ich meine Tests abarbeite. Die Klasse "BWString" selbst bietet jede Menge Funktionalität, braucht aber nur wenig Platz. Sie ist als unmittelbarer Ersatz für die Standard String-Klasse gedacht, und zwar für möglichst viele gebräuchliche Operationen. Dieses ist die Header-Datei und die Klasse beginnt hier. Grundsätzlich hat sie zwei Daten-Strukturen. Es gibt einen einfachen C String, der den String speichert, was der Arbeitsweise der String-Klasse der STL entspricht. Diese Struktur hüllt einen einfachen C String ein und liefert in "size_t" die Länge. Sie speichert auch das, was ich "Vektor des armen Mannes" nenne, eine Reihe von Zeigern für ein Array von String-Objekten, die im Rahmen der split-Funktion zum Einsatz kommen. Darüber reden wir später noch ausführlich in diesem Kurs. Die öffentliche Funktionalität der Klasse ist hier zu finden. Wie Sie sehen, gibt es ein umfangreiches Arsenal an Funktionen, doch die meisten dieser Funktionen brauchen tatsächlich nur wenig Code. Die Konstruktoren sind hier zu sehen. Der Verschiebe-Konstruktor enthält immerhin etwas Code. Wahrscheinlich am kompliziertesten ist die split-Funktion. Sie umfasst einige Funktionen, die tatsächlich kaum viel zu tun haben. Wir gehen hier weiter runter. Hier ist der Zuweisungsoperator, hier der Verkettungsoperator. Dieser hier muss Speicherplatz für einen String zuordnen und den kopieren. Doch die meisten davon, insbesondere die Vergleichsoperatoren, sind lediglich Wrapper um Standard-Funktionen. Und deshalb ist der Aufwand an Code gering. Es ist wirklich nicht viel Code. "trim()" braucht zwar einiges an Logik, doch das meiste ist wirklich wirklich einfach. Und wir gehen dies alles noch im weiteren Verlauf dieses Kurses in Detail durch. Was man hier hervorheben sollte, ist dass es einige Standard-Funktionen gibt, die in der Microsoft STL fehlen und ich eine von ihnen hier ersetzen musste, weil ich Standard-Code haben wollte, keinen unterschiedlichen Code für Microsoft und anderen Code für Unix und Mac. Und so habe ich diese Funktion hier einfach hinzugefügt und sie in eine ifdef-Anweisung eingeschlossen. Dies ist eine Form der variadischen printf-Funktion, die aber das Ergebnis in einen String schreibt, statt auf dem Bildschirm auszugeben. Ich verwende sie für die format-Methode. Hier ist sie. Ich rufe sie hier in der format-Methode auf. Und dann im Header habe ich auch einige Microsoft spezifische Dinge untergebracht. Der Microsoft Compiler ist sehr sehr vorherrschend und er besitzt einige signifikante Abweichungen gegenüber dem Standard. Und somit müssen wir sie wie hier entsprechend behandeln. Deshalb habe ich dieses "ifdef _MSC_VER", verarbeite einige Pragmas und deklariere diese "vasprintf". Es gibt also einige Unterschiede für den Microsoft Compiler und ich behandle sie auf diese Weise. Also, können Sie diesen Code einfach dem Microsoft Compiler anbieten und der Code wird genau wie unter Unix oder auf einem Mac kompiliert und ausgeführt. Diese Klasse realisiert also den größten Teil der Funktionalität, die ich von einer String-Klasse erwarte. Und das mit relativ wenig Code und ohne irgendwelche STL Container-Unterstützung, die eher Unmengen von Platz belegt und die Dinge ausbremst.

C++: Eine eigene String-Bibliothek

Erstellen Sie eine eigene String-Bibliothek als hundertprozentigen Ersatz für die String-Bibliothek der C++-STL.

37 min (10 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:21.10.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!