C++ Grundkurs

Methoden-Template

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Ein Methoden-Template stellt in der Programmiersprache ein Funktions-Template dar, welches entweder in einzelnen Klassen oder in Klassen-Templates verwendet wird.
06:08

Transkript

In dieser Lektion möchte ich Ihnen Methoden-Templates vorstellen. Methoden-Templates sind nichts anderes wie Funktions-Templates, die Sie in Klassen oder Klassen-Templates definieren. Methoden-Templates können von der Syntax her ein bisschen anspruchsvoller werden. Das zeige ich Ihnen aber gleich. Sie können Methoden-Templates innerhalb oder außerhalb der Klasse definieren. Erst mal innerhalb das ist ein bisschen einfacher zu lesen. Hier habe ich das Klassen-Template Array, das einerseits über seine Länge, andererseits über seinen Typ parametrisiert ist. Diesem Klassentyp Array spendiere ich jetzt einen Zuweisungsoperator. Was will ich machen? Ich will z.B. einen double-Array einen int-Array zuweisen. Hier sehen Sie das. Das ist der neue Typ, der von rechts kommt. T2 repräsentiert den Typ, den ich verwenden will, um meine, alten Array einen neuen Wert zu geben. Hier schaut es noch relativ schön aus. Anspruchsvoller wird es hier. Wenn Sie das Methoden-Template außerhalb der Klasse definieren. Hier gehe ich auf die Syntax ein bisschen genauer ein. Ich habe das Klassen-Template, hier das Methoden-Template. Das ist der Zuweisungsoperator. Ich bekomme von rechts Array vom Typ T2 der gleichen Länge N. Sie sehen es. Das T2 entspricht nicht dem T. Es könnte z.B. ein int sein. Das könnte ein double sein. Ich bekomme ein int-Array als Argument und gebe ein double-Array zurück. Was entscheidend ist an dieser Zuweisung ist, dass N und N hier die gleichen Buchstaben sind. Soll heißen, die beiden Arrays müssen gleich lang sein, sonst macht das keine Sinn ein Array einem anderen Array zuzuweisen. Das hier ist nur die Deklaration des Methoden-Templates. Hier folgt die Definition. Sie sehen, dass die Syntax ein bisschen anspruchsvoller wird. In der ersten Zeile wiederhole ich das Template von hier oben von der Definition vom Klassen-Template. In der zweiten Zeile wiederhole den Template-Ausdruck hier, der von dem Methoden-Template resultiert template <class T2 Hier gebe ich die Signatur der Methode an. Es kommt ein Array der Länge N vom Typ T2 rein und es soll ein Array der Länge N vom Typ T erzeugt werden. Das zeige ich Ihnen jetzt in der Anwendung. Das Array kennen Sie bereits. Hat wieder eine Default-Konstruktor. Hier folgt dieser besagte Zuweisungsoperator. Der schaut erst mal kompliziert aus, obwohl ich ihn innerhalb des Klassen-Templates definiert habe. Ich fange von oben an. Das hier ist das Methoden-Template. In das Methoden-Template, dessen Zuweisungsoperator für das Klassen-Template invertieren soll, geht ein Array vom Typ T2 der Länge N rein und ein Array vom T der Länge N wird erzeugt. In der ersten Zeile überprüfe ich durch diesen Ausdruck (void)this == (void)&arr), ob ich eine Selbstzuweisung habe. Ich will sichergehen, dass mir nicht passiert, dass ich bei der Zuweisung zwei identische Elemente versuchen sich gegenseitig zuzuweisen. Das schließe ich durch diesen Ausdruck hier aus. Indem ich mit this auf das konkrete Objekt durchgreife und die Adresse erhalte, und hier mir die Adresse von dem Element, also in diesem Fall konkret Array herausgeben lasse und vergleiche. Hier passiert das eigentliche Initialisieren. Ich verwende den std::copy-Algorithmus der Standard Template Library. Was mache ich? Ich kopiere alle Elemente von arr.elem to arr.elm + N nach elem. Wenn Sie das anschauen, ist arr das Argument, das reinkommt und elm ist das Argument, das rausgeht. Bei elm ist das elm hier. Hier werden unter der Decke, wenn ints kommen würden, int nach double konvertiert. Es fehlt noch eines. Ich zeige Ihnen das in der Anwendung. Ich habe ein Array von doubles Länge 10, Array von int der Länge 10 und jetzt kann ich int-Array, double-Array zuweisen, weil ich diesen Zuweisungsoperator genau hier implementiert habe. Diese zwei Typen unterscheiden sich nur in int und double. Diese Variabilität habe ich durch ein Template-Parameter des Methoden-Templates-Operator hier reingebracht. Das geht gut. Gut geht es aber nicht hier. Hier initialisiere ich ein Template vom Typ string der Länge 10 und hier vom Typ int der Länge 100. Sie sind also verschieden lang. Wenn ich das jetzt versuche zu übersetzen. Sie sehen den erfolgreichen Übersetzungsvorgang. Jetzt versuche ich zu übersetzen, indem ich diese zwei Zeilen auskommentiere. Dann sehen Sie gleich eine längliche Fehlermeldung. Bevor ich diese Übersetzung starte, will ich Ihnen erklären, was passiert. Hier versucht er Strings unter der Decke nach doubles zu konvertieren. Das kann natürlich nicht gut gehen. Im Endeffekt gibt mir der gcc die Fehlermeldung „cannot convert*, das steht für std::string, to double. Der Grund ist, dass er hier versucht implizit Strings nach Double zu konvertieren und das kann natürlich nicht gut gehen. Das ist die erste Fehlermeldung. Die zweite Fehlermeldung hängt damit zusammen, dass das double-Array die Länge 10 besitzt, bitInt-Array aber die Länge 100. Die Längen passen nicht zusammen, was dazu führt, wenn Sie sich den Zuweisungsoperator anschauen, dass das N hier verschieden von dem N hier ist und das geht natürlich nicht gut, weil die identisch sein müssen. Jetzt kommt der Beweis, dass es stimmt, dass der Compiler diesen Code nicht annimmt. Sorry, das ist ein bisschen eine längliche Fehlermeldung, aber sie reduziert sich genau auf diese zwei Aussagen. Das Erste habe ich Ihnen bereits erklärt. Das Zweite heißt no match for “operator= in double Array“ = bigInt Array“. Der Punkt ist eben, dass er keinen Zuweisungsoperator besitzt. Sein Zuweisungsoperator will nämlich, dass die beiden Arrays gleich lang sind. Da das hier identisch diesem N hier sein muss. In dieser Lektion habe ich Ihnen Methoden-Templates vorgestellt. Methoden-Templates sind unter der Decke Funktions-Templates in Klassen oder Klassen-Templates. Wenn Sie Methoden-Templates außerhalb der Klasse definieren, kann die Syntax ein bisschen anspruchsvoller werden.

C++ Grundkurs

Steigen Sie in die mächtige Programmiersprache C++ ein und lernen Sie dabei alle wichtigen Funktionen mit Anwendungsbeispielen kennen.

8 Std. 14 min (147 Videos)
Derzeit sind keine Feedbacks vorhanden...

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!