C ++ sablonok

Ebben a cikkben megismerheti a sablonokat a C ++ nyelven. Megtanulja használni a sablonok erejét az általános programozáshoz.

A sablonok a C ++ hatékony szolgáltatásai, amelyek lehetővé teszik általános programok írását. Egyszerűbben kifejezve, létrehozhat egyetlen függvényt vagy osztályt, hogy sablonok segítségével különböző adattípusokkal dolgozzon.

A sablonokat gyakran használják a nagyobb kódbázisban a kódok újrafelhasználhatósága és a programok rugalmassága céljából.

A sablonok koncepciója kétféle módon használható:

  • Funkciósablonok
  • Osztálysablonok

Funkciósablonok

A függvénysablon a normál függvényhez hasonlóan működik, egy kulcs különbséggel.

Egyetlen függvénysablon egyszerre működhet különböző adattípusokkal, de egyetlen normál függvény csak egy adattípus-készlettel működhet.

Normál esetben, ha két vagy több típusú adattal azonos műveleteket kell végrehajtania, akkor a függvények túlterhelésével két funkciót hozhat létre a szükséges funkció deklarációval.

Jobb megközelítés lenne azonban a függvénysablonok használata, mert ugyanazt a feladatot kevesebb és karbantartható kód megadásával hajthatja végre.

Hogyan deklarálható egy függvénysablon?

A függvény sablon kezdődik a kulcsszó sablon majd sablonparaméterrel / s benne ezt követi a funkciót nyilatkozatot.

 sablon < class T> T someFunction (T arg) (…)

A fenti kódban a T egy sablon argumentum, amely különböző adattípusokat (int, float) fogad el, az class pedig kulcsszó.

A typenamefenti példában osztály helyett kulcsszót is használhat .

Amikor egy adattípus argumentumot továbbítanak a someFunction( )fordítónak, a fordító someFunction()az adott adattípushoz létrehoz egy új verziót .

1. példa: Funkciósablon a legnagyobb szám megtalálásához

Program, amely a funkciósablonok segítségével két szám közül a legnagyobbat jeleníti meg.

 // 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; )

Kimenet

Írjon be két egész számot: 5 10 10 nagyobb. Írjon be két lebegőpontos számot: 12,4 10,2 A 12,4 nagyobb. Írjon be két karaktert: z Z z nagyobb ASCII értékkel rendelkezik.

A fenti programban Large()meghatározunk egy függvénysablont, amely két n1 és n2 adattípusú argumentumot fogad el T. Tazt jelenti, hogy az argumentum bármilyen típusú lehet.

Large() függvény adja vissza a legnagyobbat a két argumentum közül egy egyszerű feltételes művelettel.

Bent a main()funkció változók három különböző adattípusok: int, floatés charbejelentették. Ezután a változókat Large()normál függvényként továbbítják a függvénysablonhoz.

Futás közben, amikor egy egész számot átadunk a sablonfüggvénynek, a fordító tudja, hogy egy Large()függvényt kell létrehoznia az int argumentumok elfogadásához, és ezt meg is teszi.

Hasonlóképpen, amikor lebegőpontos és char adatokat továbbítanak, ismeri az argumentum adattípusokat, és Large()ennek megfelelően generálja a függvényt.

Így csak egyetlen függvénysablon használata három azonos normál függvényt váltott fel, és karbantarthatóvá tette a kódot.

2. példa: Adatok cseréje függvénysablonok használatával

Program adatcserére függvénysablonok segítségével.

 #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; ) 

Kimenet

Mielőtt adatokat továbbítana a függvénysablonba. i1 = 1 i2 = 2 f1 = 1,1 f2 = 2,2 c1 = a c2 = b Adatok átadása után a függvénysablonhoz. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a

Ebben a programban ahelyett, hogy egy függvényt egy érték átadásával hívnánk meg, hivatkozásként hívást kezdeményezünk.

A Swap()függvénysablon két argumentumot vesz fel, és hivatkozással felcseréli őket.

Osztálysablonok

A függvénysablonokhoz hasonlóan osztálysablonokat is létrehozhat általános osztályműveletekhez.

Előfordul, hogy olyan osztálymegvalósításra van szükség, amely minden osztály esetében azonos, csak a használt adattípusok különböznek egymástól.

Normál esetben minden adattípushoz külön osztályt kell létrehoznia, VAGY külön tagváltozókat és függvényeket kell létrehoznia egyetlen osztályon belül.

Ez feleslegesen felduzzasztja a kódbázist, és nehéz lesz fenntartani, mivel a változás egy osztály / funkciót kell végrehajtani az összes osztályon / függvényen.

Az osztálysablonok azonban megkönnyítik ugyanazon kód újrafelhasználását minden adattípusnál.

Hogyan lehet deklarálni egy osztálysablont?

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

A fenti nyilatkozatban Tszerepel a sablon argumentum, amely a használt adattípus helyőrzője.

Az osztálytest belsejében a var tagváltozó és tagfunkció someOperation()egyaránt típusú T.

Hogyan lehet létrehozni egy osztálysablon objektumot?

Osztálysablon-objektum létrehozásához meg kell határoznia az adattípust a létrehozáskor.

 className classObject; 

Például:

 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.

Ezután displayResult()mindkét objektumot meghívjuk, amely elvégzi a Számológép műveleteket és megjeleníti a kimenetet.

érdekes cikkek...