C ++ -mallit

Tässä artikkelissa opit malleista C ++: ssa. Opit käyttämään mallien voimaa yleiseen ohjelmointiin.

Mallit ovat C ++: n tehokkaita ominaisuuksia, joiden avulla voit kirjoittaa yleisiä ohjelmia. Yksinkertaisesti sanottuna voit luoda yhden toiminnon tai luokan työskentelemään erilaisten tietotyyppien kanssa mallien avulla.

Malleja käytetään usein suuremmassa koodikannassa koodien uudelleenkäytettävyyden ja ohjelmien joustavuuden tarkoituksiin.

Mallien käsitettä voidaan käyttää kahdella eri tavalla:

  • Toimintomallit
  • Luokan mallit

Toimintomallit

Funktiomalli toimii samalla tavalla kuin normaali toiminto, yhdellä avainerolla.

Yksi toimintomalli voi toimia erilaisten tietotyyppien kanssa kerralla, mutta yksi normaali toiminto voi toimia vain yhden tietotyyppijoukon kanssa.

Normaalisti, jos sinun on suoritettava identtiset toiminnot kahdelle tai useammalle tietotyypille, luot funktioiden ylikuormituksen avulla kaksi funktiota vaaditulla toimintoilmoituksella.

Parempi lähestymistapa olisi kuitenkin käyttää toimintomalleja, koska voit suorittaa saman tehtävän kirjoittamalla vähemmän ja ylläpidettävää koodia.

Kuinka julistaa toimintomalli?

Toiminto malli alkaa avainsanan mallin seurasi malliparametri / s sisällä , jota seuraa toiminto ilmoitus.

 malli < luokka T> T someFunction (T arg) (…)

Yllä olevassa koodissa T on malliargumentti, joka hyväksyy eri tietotyypit (int, float), ja luokka on avainsana.

Voit myös käyttää avainsanaa typenameluokan sijasta yllä olevassa esimerkissä.

Kun tietotyyppinen argumentti välitetään someFunction( ), kääntäjä luo uuden version someFunction()tietylle tietotyypille.

Esimerkki 1: Toimintomalli suurimman luvun löytämiseksi

Ohjelma näyttää suurimman kahden numeron joukosta toimintomallien avulla.

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

Tuotos

Syötä kaksi kokonaislukua: 5 10 10 on suurempi. Syötä kaksi liukulukua: 12,4 10,2 12,4 on suurempi. Kirjoita kaksi merkkiä: z Z z: llä on suurempi ASCII-arvo.

Edellä olevassa ohjelmassa määritetään toimintomalli, Large()joka hyväksyy kaksi tietotyyppistä argumenttia n1 ja n2 T. Ttarkoittaa, että argumentti voi olla minkä tahansa tyyppinen.

Large() funktio palauttaa suurimman kahdesta argumentista yksinkertaisen ehdollisen operaation avulla.

Sisällä main()toiminto, muuttujat kolmen eri tietotyyppejä: int, floatja charilmoitetaan. Muuttujat siirretään sitten Large()toimintomalliin normaalina funktiona.

Ajon aikana, kun kokonaisluku välitetään mallifunktiolle, kääntäjä tietää, että sen on luotava Large()funktio int-argumenttien hyväksymiseksi, ja tekee niin.

Vastaavasti, kun liukuluku- ja hiilitiedot välitetään, se tuntee argumenttitietotyypit ja tuottaa Large()funktion vastaavasti.

Tällä tavoin vain yhden toimintomallin käyttäminen korvasi kolme samanlaista normaalia toimintoa ja teki koodistasi ylläpidettävän.

Esimerkki 2: Vaihda tietoja toimintomallien avulla

Ohjelma vaihtaa tietoja toimintomallien avulla.

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

Tuotos

Ennen tietojen välittämistä toimintomalliin. i1 = 1 i2 = 2 f1 = 1,1 f2 = 2,2 c1 = a c2 = b Tietojen siirtämisen jälkeen toimintomalliin. i1 = 2 i2 = 1 f1 = 2,2 f2 = 1,1 c1 = b c2 = a

Tässä ohjelmassa sen sijaan, että kutsuttaisiin funktiota välittämällä arvo, annetaan viite-kutsu.

Swap()Toiminto malli ottaa kaksi argumenttia ja swap ne viittaamalla.

Luokan mallit

Kuten toimintomallit, voit myös luoda luokkamalleja luokan yleisiin operaatioihin.

Joskus tarvitset luokan toteutuksen, joka on sama kaikille luokille, vain käytetyt tietotyypit ovat erilaiset.

Normaalisti joudut luomaan eri luokan kullekin tietotyypille TAI luomaan erilaisia ​​jäsenmuuttujia ja toimintoja yhden luokan sisällä.

Tämä turhaa turhaan koodipohjaa ja sitä on vaikea ylläpitää, koska muutos on yksi luokka / toiminto, joka tulisi suorittaa kaikille luokille / toiminnoille.

Luokkamallien avulla saman koodin uudelleenkäyttö on kuitenkin helppoa kaikille tietotyypeille.

Kuinka ilmoitetaan luokan malli?

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

TOnko yllä olevassa ilmoituksessa malliargumentti, joka on käytetyn tietotyypin paikkamerkki.

Luokkaryhmän sisällä jäsenmuuttuja var ja jäsenfunktio someOperation()ovat molemmat tyyppiä T.

Kuinka luodaan luokan malliobjekti?

Luodaksesi luokan malliobjektin, sinun on määritettävä tietotyyppi luomisen yhteydessä.

 className classObject; 

Esimerkiksi:

 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.

Sitten displayResult()kutsutaan molemmat objektit, joka suorittaa Laskin-toiminnot ja näyttää tuloksen.

Mielenkiintoisia artikkeleita...