Klassmallar (templates, typparametriserade klasser, generiska klasser)

Tänk dig att du av någon anledning vill ha objekt som håller reda på heltals- och flyttalskoordinater, man får då göra två olika klasser som beskriver dessa, även om det beteende som objekten skall ha är identiskt både med avseende på dess gränssnitt och implementation med undantag för att objekten är uppbyggda av heltals- respektive flyttalsvariabler. För att undvika denna dubblering av kod, med uppenbara risker för att inkonsistens uppstår, kan man istället definiera en klassmall (class template) för hur olika klasser kan skapas: När man sedan vill skapa objekt ur denna klassbeskrivning görs detta t.ex. på följande sätt: Vad som sker är att kompilatorn automatiskt kommer att generera de klassbeskrivningar som behövs ur den givna klassmallen. Detta förutsätter naturligtvis att alla operationer som utförs på den aktuella typen är definierade, i detta exempel måste t.ex. operatorerna = och += vara definierade för typerna int och float (vilket de ju är).

Placera hela klassmallen (både definitionen av klassen och dess medlemsfunktioner) i en inkluderingsfil. Detta eftersom kompilatorn måste ha tillgång till hela klassmallen för att kunna skapa en klass ur denna.

Den generella syntaxen för en typparametriserad klass är:

Denna rad inleder såväl klassdefinitionen som definitionerna för samtliga medlemsfunktioner.

Filen vector.h

Filen complex.h

Filen complex.cpp

Filen template.cpp (test program)