C ++ maler

I denne artikkelen lærer du om maler i C ++. Du lærer å bruke malenes kraft til generell programmering.

Maler er kraftige funksjoner i C ++ som lar deg skrive generiske programmer. Enkelt sagt kan du opprette en enkelt funksjon eller en klasse for å jobbe med forskjellige datatyper ved hjelp av maler.

Maler brukes ofte i større kodebase med det formål å gjenbrukbar kode og fleksibiliteten til programmene.

Konseptet med maler kan brukes på to forskjellige måter:

  • Funksjonsmaler
  • Klassemaler

Funksjonsmaler

En funksjonsmal fungerer i likhet med en normal funksjon, med en nøkkelforskjell.

En enkelt funksjonsmal kan fungere med forskjellige datatyper samtidig, men en enkelt normal funksjon kan bare fungere med ett sett med datatyper.

Normalt, hvis du trenger å utføre identiske operasjoner på to eller flere typer data, bruker du funksjonsoverbelastning for å opprette to funksjoner med ønsket funksjonserklæring.

En bedre tilnærming ville imidlertid være å bruke funksjonsmaler fordi du kan utføre den samme oppgaven ved å skrive mindre og vedlikeholdbar kode.

Hvordan erklærer jeg en funksjonsmal?

En funksjon mal starter med nøkkelordet mal etterfulgt av malparameter / s på innsiden som er etterfulgt av funksjon erklæring.

 mal < klasse T> T someFunction (T arg) (…)

I koden ovenfor er T et malargument som godtar forskjellige datatyper (int, float), og klasse er et nøkkelord.

Du kan også bruke nøkkelord i typenamestedet for klasse i eksemplet ovenfor.

Når et argument av en datatype overføres til someFunction( ), genererer kompilatoren en ny versjon av someFunction()for den gitte datatypen.

Eksempel 1: Funksjonsmal for å finne det største tallet

Program for å vise størst blant to tall ved hjelp av funksjonsmaler.

 // If two characters are passed to function template, character with larger ASCII value is displayed. #include using namespace std; // template function template T Large(T n1, T n2) ( return (n1> n2) ? n1 : n2; ) int main() ( int i1, i2; float f1, f2; char c1, c2; cout <> i1>> i2; cout << Large(i1, i2) <<" is larger." << endl; cout <> f1>> f2; cout << Large(f1, f2) <<" is larger." << endl; cout <> c1>> c2; cout << Large(c1, c2) << " has larger ASCII value."; return 0; )

Produksjon

Skriv inn to heltall: 5 10 10 er større. Skriv inn to flytende tall: 12.4 10.2 12.4 er større. Skriv inn to tegn: z Z z har større ASCII-verdi.

I det ovennevnte programmet er en funksjonsmal Large()definert som godtar to argumenter n1 og n2 av datatypen T. Tbetyr at argumentet kan være av hvilken som helst datatype.

Large() -funksjonen returnerer den største blant de to argumentene ved hjelp av en enkel betinget operasjon.

Inne i main()funksjon, variable av tre forskjellige datatyper: int, floatog charer deklarert. Variablene sendes deretter til Large()funksjonsmalen som normale funksjoner.

I løpet av kjøretiden, når et heltall sendes til malfunksjonen, vet kompilatoren at den må generere en Large()funksjon for å godta int-argumentene og gjør det.

På samme måte, når flytende punktdata og char-data sendes, kjenner den argumentdatatypene og genererer Large()funksjonen deretter.

På denne måten erstattet tre identiske normale funksjoner ved å bruke bare en enkelt funksjonsmal og gjorde koden din vedlikeholdbar.

Eksempel 2: Bytt data ved hjelp av funksjonsmaler

Program for å bytte data ved hjelp av funksjonsmaler.

 #include using namespace std; template void Swap(T &n1, T &n2) ( T temp; temp = n1; n1 = n2; n2 = temp; ) int main() ( int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "Before passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "After passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; return 0; ) 

Produksjon

Før du overfører data til funksjonsmalen. i1 = 1 i2 = 2 f1 = 1,1 f2 = 2,2 c1 = a c2 = b Etter overføring av data til funksjonsmalen. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a

I stedet for å ringe en funksjon ved å overføre en verdi, blir det i dette programmet utstedt en samtale med referanse.

Den Swap()funksjonen Malen tar to argumenter og swapper dem som referanse.

Klassemaler

I likhet med funksjonsmaler kan du også opprette klassemaler for generiske klassoperasjoner.

Noen ganger trenger du en klasseimplementering som er den samme for alle klasser, bare datatypene som brukes er forskjellige.

Normalt må du opprette en annen klasse for hver datatype ELLER opprette forskjellige medlemsvariabler og funksjoner i en enkelt klasse.

Dette vil unødvendig oppblåse kodebasen din og være vanskelig å vedlikeholde, ettersom en endring er en klasse / funksjon skal utføres på alle klasser / funksjoner.

Klassemaler gjør det imidlertid enkelt å bruke den samme koden for alle datatyper.

Hvordan erklære jeg en klassemal?

 mal < class T> class className (… public: T var; T someOperation (T arg);…);

I erklæringen ovenfor Ter malargumentet som er en plassholder for datatypen som brukes.

Inne i klassekroppen er en medlemsvariabel var og en medlemsfunksjon someOperation()begge av typen T.

Hvordan lage et klassemalobjekt?

For å opprette et klassemalobjekt må du definere datatypen i en når du oppretter.

 className classObject; 

For eksempel:

 className classObject; className classObject; className classObject; 

Example 3: Simple calculator using Class template

Program to add, subtract, multiply and divide two numbers using class template

 #include using namespace std; template class Calculator ( private: T num1, num2; public: Calculator(T n1, T n2) ( num1 = n1; num2 = n2; ) void displayResult() ( cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << divide() << endl; ) T add() ( return num1 + num2; ) T subtract() ( return num1 - num2; ) T multiply() ( return num1 * num2; ) T divide() ( return num1 / num2; ) ); int main() ( Calculator intCalc(2, 1); Calculator floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; ) 

Output

 Int results: Numbers are: 2 and 1. Addition is: 3 Subtraction is: 1 Product is: 2 Division is: 2 Float results: Numbers are: 2.4 and 1.2. Addition is: 3.6 Subtraction is: 1.2 Product is: 2.88 Division is: 2 

In the above program, a class template Calculator is declared.

The class contains two private members of type T: num1 & num2, and a constructor to initalize the members.

It also contains public member functions to calculate the addition, subtraction, multiplication and division of the numbers which return the value of data type defined by the user. Likewise, a function displayResult() to display the final output to the screen.

In the main() function, two different Calculator objects intCalc and floatCalc are created for data types: int and float respectively. The values are initialized using the constructor.

Notice we use and while creating the objects. These tell the compiler the data type used for the class creation.

This creates a class definition each for int and float, which are then used accordingly.

Deretter displayResult()kalles begge objektene som utfører kalkulatoroperasjonene og viser utdataene.

Interessante artikler...