Wie eine Klassenvorlage in C ++ zu entwickeln

Klasse-Vorlagen durchführen, die schweres Heben der Template-Typen. Sie verwenden eine Klassenvorlage Objekte von nahezu jeder Größe zu definieren. In den meisten Fällen verwenden Sie Klassen komplexe Objekte darzustellen oder Aufgaben schlecht geeignet für die Funktion oder Struktur-Vorlagen.

Sie normalerweise Code-Klassen in einer separaten Datei mit dem Namen der Klasse als Dateinamen verwenden. Die Klassendefinition erscheint in einer Header-Datei, während der Code in einer Code-Datei angezeigt wird. Um die Dinge ein bisschen leichter zu verstehen, meidet dieses Beispiel die normale Einstellung und zeigt das gesamte Beispiel eine einzelne Datei.

Das Beispiel zeigt eine spezielle Warteschlange Implementierung. Es enthält viele der Funktionen eines Standard-Warteschlange und fügt dann ein paar Features besonderem Entwicklungsbedarf gerecht zu werden. Queues und andere Behälter sind in der Regel komplexe Code enthalten, aber Sie müssen auch sie mit einer Vielzahl von Datentypen zu verwenden, wird eine Vorlage-Klasse die perfekte Umsetzung zu machen. Das ClassTemplate Beispiel zeigt den Code für dieses Beispiel.

#einschließen #einschließen using namespace std-templateKlasse myQueue {protected: Vektor Daten-public: void Add (T const Eingang) -Lücke entfernen () - Leere PrintString () - Leere PrintInt () - Bool IsEmpty () -} - VorlageLeere myQueue:: Add (T const Eingang) {data.push_back (Eingang) -} templateLeere myQueue:: Remove () {data.erase (data.begin ()) -} templateLeere myQueue:: PrintString () {Vektor:: Iterator PrintIt = data.begin () - während (PrintIt = data.end ()!) {Cout lt; lt; *Druck es lt; lt; Endl-PrintIt ++ -}} templateLeere myQueue:: PrintInt () {Vektor:: Iterator PrintIt = data.begin () - während (PrintIt = data.end ()!) {Cout lt; lt; *Druck es lt; lt; Endl-PrintIt ++ -}} templatebool myQueue:: IsEmpty () {return data.begin () == data.end () -} int main () {myQueue StringQueue-cout lt; lt; StringQueue.IsEmpty () lt; lt; Endl-StringQueue.Add ( "Hallo") - StringQueue.Add ( "Goodbye") - cout lt; lt; "Drucken von Zeichenketten:" lt; lt; Endl-StringQueue.PrintString () - cout lt; lt; StringQueue.IsEmpty () lt; lt; Endl-StringQueue.Remove () - cout lt; lt; "Drucken von Zeichenketten:" lt; lt; Endl-StringQueue.PrintString () - StringQueue.Remove () - cout lt; lt; StringQueue.IsEmpty () lt; lt; Endl-myQueue IntQueue-IntQueue.Add (1) -IntQueue.Add (2) -cout lt; lt; "Drucken Ints:" lt; lt; Endl-IntQueue.PrintInt () - Rückkehr 0-}

Das Beispiel beginnt mit der Klasse myQueue. Beachten Sie, dass Daten ist ein Vektor, kein Warteschlange wie man erwarten könnte. EIN Warteschlange ein Adapter ist - als solche nicht die Unterstützung für viele der Funktionen in Behältern gefunden liefert, wie beispielsweise Vektor - eine davon ist die Verwendung von Iteratoren.

In diesem Beispiel wird ein Iterator für den Druck, so setzt sie auf eine Vektor, eher als ein Warteschlange als Ausgangspunkt. Jedes Mal, wenn Sie Ihre eigene spezielle Version eines gemeinsamen Konstrukt erstellen, stellen Sie sicher, dass Sie mit dem richtigen Objekt beginnen. Andernfalls könnten Sie die Erfahrung der Schaffung der neuen Klasse frustrierend auf ein Minimum, unmöglich im schlimmsten Fall zu finden.

myQueue beinhaltet die Fähigkeit, hinzuzufügen, zu entfernen und Druckelemente. Darüber hinaus können Sie prüfen, ob eine Warteschlange leer oder voll ist. Sie haben bereits den Code für diese Aufgaben in anderen Teilen des Buches gesehen.

Sie könnten über die für den Druck verwendet Code wundern. Das Beispiel enthält verschiedene Methoden zum Drucken von Strings und ganzen Zahlen, die eingängig scheinen mag. Immerhin erklären, warum nicht einfach den Iterator wie so folgt, daß es jeden Datentyp akzeptiert:

Vektor:: Iterator PrintIt = data.begin () -

Das Problem ist, dass der Iterator einen bestimmten Datentyp erfordert. Daher müssen Sie es erklären, wie gezeigt. Ansonsten erhalten Sie diese nicht hilfreich Fehlermeldung:

Fehler: erwartet '-' vor 'PrintIt'

Irgendwann wollen Sie diese neue Klasse zu testen, ähnliche Schritte wie unter Verwendung gefunden in Main(). Der Test prüft, ob die Warteschlange tatsächlich die leeren und gefüllten Zustände erkennt, wie das Hinzufügen und Entfernen von Elementen funktioniert und ob die Druckroutinen arbeiten. Hier ist die Ausgabe aus diesem Beispiel:

1Printing Strings: HelloGoodbye0Printing Strings: Goodbye1Printing Ints: 12

Menü