C ++

Kako koristiti predloške C ++

Kako koristiti predloške C ++

Uvod

U osnovnom programiranju na C ++, vrsta podataka, npr.g., int ili char, mora biti naznačeno u deklaraciji ili definiciji. Vrijednost kao što je 4 ili 22 ili -5 je int. Vrijednost kao što je "A" ili "b" ili "c" je znak. Mehanizam predloška omogućuje programeru da koristi generički tip za skup stvarnih tipova. Na primjer, programer može odlučiti upotrijebiti identifikator T za int ili char. Moguće je da algoritam C ++ ima više od jednog generičkog tipa. Uz, recimo, T za int ili char, U može značiti tip plutajućeg ili pokazivača. Klasa, poput niza ili vektorske klase, slična je vrsti podataka, a instancirani su objekti poput vrijednosti vrste podataka, koja je navedena klasa. Dakle, mehanizam predloška također omogućava programeru da koristi generički identifikator tipa za skup klasa.

Predložak C ++ stvara algoritam neovisan o vrsti podataka koji se koriste. Dakle, isti algoritam, s mnogo pojavljivanja istog tipa, može koristiti različite tipove pri različitim izvršenjima. Entiteti varijable, funkcije, strukture i klase mogu imati predloške. Ovaj članak objašnjava kako prijaviti predloške, kako definirati predloške i kako ih primijeniti u C-u++. Već biste trebali imati znanje o gore spomenutim entitetima da biste razumjeli teme obrađene u ovom članku.

Vrste

Skalar

Tipovi skalara su void, bool, char, int, float i pokazivač.

Nastava kao vrste

Određena klasa može se smatrati vrstom, a njezini objekti mogućim vrijednostima.

Generički tip predstavlja skup skalarnih tipova. Popis skalarnih vrsta je opsežan. Tip int, na primjer, ima i druge srodne tipove, poput kratkog int, long int itd. Generički tip također može predstavljati skup klasa.

Promjenjiva

Primjer deklaracije predloška i definicije je kako slijedi:

predložak
T pi = 3.14;

Prije nastavka imajte na umu da se ova vrsta izjave ne može pojaviti u glavnoj () funkciji ili bilo kojem opsegu bloka. Prvi redak je deklaracija glave predloška, ​​s generičkim nazivom tipa T, kojeg je izabrao programer. Sljedeći je redak definicija identifikatora, pi, koji je generičkog tipa, T. Preciznost, je li T int ili float ili neki drugi tip, može se izvršiti u funkciji C ++ main () (ili nekoj drugoj funkciji). Takva preciznost postići će se s varijablom pi, a ne s T.

Prvi redak je deklaracija glave predloška. Ova izjava započinje rezerviranom riječju, predloškom, a zatim otvorenim i zatvorenim kutnim zagradama. Unutar kutnih zagrada nalazi se barem jedan generički identifikator tipa, poput T, gore. Može postojati više od jednog generičkog identifikatora tipa, a svakom prethodi rezervirana riječ, typename. Takve generičke vrste na tom položaju nazivaju se parametri predloška.

Sljedeća izjava može se napisati u main () ili u bilo kojoj drugoj funkciji:

cout << pi << '\n';

A funkcija bi prikazala 3.14. Izraz pi odlučuje o točnom tipu T za varijablu pi. Specijalizacija određuje određenu vrstu podataka za parametar predloška. Instantiranje je u ovom slučaju C ++ interni postupak stvaranja određenog tipa, kao što je float. Ne brkajte između instanciranja parametra predloška i instanciranja klase. U temi predloška, ​​mnogi tipovi podataka mogu imati jedno generičko ime tipa, dok mnogi razredi mogu imati jedno generičko ime klase. Međutim, generički naziv klase jednostavno se naziva klasa, a ne kao naziv klase. Također, vrijednost je za tip podataka, kao što je int, kao što je instancirani objekt za klasu, poput klase String.

Na specijalizaciji, odabrana vrsta podataka, poput float, stavlja se u kutne zagrade nakon varijable. Ako postoji više od jednog parametra predloška u deklaraciji glave predloška, ​​u izrazu specijalizacije bit će odgovarajući broj tipova podataka istim redoslijedom.

Na specijalizaciji je tip poznat kao argument predloška. Nemojte brkati između ovoga i argumenta funkcije za poziv funkcije.

Zadana vrsta

Ako se na specijalizaciji ne navede tip, pretpostavlja se zadani tip. Dakle, iz sljedećeg izraza:

predložak
U pi = "ljubav";
prikaz iz:
cout << pi<> << '\n';

je "ljubav" prema stalnom pokazivaču na char. Primijetite u deklaraciji da je U = const char *. Kutne zagrade bit će prazne na specijalizaciji (nije navedena vrsta); stvarni se tip smatra const pokazivačem na char, zadani tip. Ako bi na specijalizaciji bio potreban neki drugi tip, tada bi se naziv tipa napisao u kutnim zagradama. Kada se na specijalizaciji želi zadani tip, ponavljanje tipa u kutnim zagradama nije obavezno, tj.e., kutne zagrade mogu ostati prazne.

Napomena: zadani tip se i dalje može promijeniti na specijalizaciji tako što ćete imati drugi tip.

strukt

Sljedeći primjer pokazuje kako se parametar predloška može koristiti sa strukturom:

predložak strukturna Doba

T Ivan = 11;
T Petar = 12;
T Marija = 13;
T Radost = 14;
;

Ovo su uzrasti učenika u nekom razredu (razredu). Prvi redak je deklaracija predloška. Tijelo u zagradama stvarna je definicija predloška. Dobe se mogu prikazati u funkciji main () na sljedeći način:

Doba ocjena7;
cout << grade7.John << " << grade7.Mary << '\n';

Izlaz je: 11 13. Prva izjava ovdje vrši specijalizaciju. Imajte na umu kako je napravljen. Također daje naziv za objekt strukture: grade7. Druga izjava ima uobičajene izraze objektnih struktura. Struktura je poput klase. Ovdje je Ages poput naziva klase, dok je grade7 objekt klase (struct).

Ako su neke dobi cjelobrojne, a druge floats, tada strukturi trebaju dva generička parametra, kako slijedi:

predložak strukturna Doba

T Ivan = 11;
U Petru = 12.3;
T Marija = 13;
U Radost = 14.6;
;

Relevantni kod za funkciju main () je kako slijedi:

Doba ocjena7;
cout << grade7.John << " << grade7.Peter << '\n';

Izlaz je: 11 12.3. Pri specijalizaciji, redoslijed tipova (argumenata) mora odgovarati redoslijedu generičkih tipova u deklaraciji.

Deklaracija predloška može se odvojiti od definicije, kako slijedi:

predložak strukturna Doba

T Ivan;
U Petar;
T Marija;
U Radost;
;
Doba ocjena7 = 11, 12.3, 13, 14.6;

Prvi segment koda isključivo je deklaracija predloška (nema dodjela). Drugi segment koda, koji je samo izjava, je definicija identifikatora, grade7. S lijeve strane nalazi se izjava identifikatora, ocjena7. Desna strana je popis inicijalizatora koji članovima strukture dodjeljuje odgovarajuće vrijednosti. Drugi segment (iskaz) može se zapisati u funkciji main (), dok prvi segment ostaje izvan funkcije main ().

Netipski

Primjeri tipova podataka koji nisu podaci uključuju vrste int, pokazivač na objekt, pokazivač na funkciju i automatske tipove. Postoje i druge vrste koje se ne odnose na ovaj članak. Netip je poput nepotpunog tipa čija se vrijednost daje kasnije i ne može se mijenjati. Kao parametar započinje određenim netipom, nakon kojeg slijedi identifikator. Vrijednost identifikatora daje se kasnije, na specijalizaciji, i ne može se ponovno mijenjati (poput konstante, čija je vrijednost dana kasnije). Sljedeći program to ilustrira:

#include
pomoću prostora imena std;
predložak strukturna Doba

T Ivan = N;
U Petru = 12.3;
T Marija = N;
U Radost = 14.6;
;
int main ()

Doba ocjena7;
cout << grade7.John << " << grade7.Joy << '\n';
return 0;

Na specijalizaciji, prvi tip, int, u kutnim zagradama postoji više zbog formalnosti, kako bi bili sigurni da broj i redoslijed parametara odgovara broju i redoslijedu vrsta (argumenti). Vrijednost N dana je na specijalizaciji. Izlaz je: 11 14.6.

Djelomična specijalizacija

Pretpostavimo da predložak ima četiri generička tipa i da, između četiri tipa, postoje potrebe za dva zadana tipa. To se može postići pomoću konstrukcije djelomične specijalizacije koja ne zapošljava operatora dodjele. Dakle, konstrukcija djelomične specijalizacije daje zadane vrijednosti podskupu generičkih tipova. Međutim, u shemi djelomične specijalizacije potrebne su osnovna klasa (struct) i djelomična klasa specijalizacije (struct). Sljedeći program to ilustrira za jedan generički tip od dva generička tipa:

#include
pomoću prostora imena std;
// osnovna klasa predloška
predložak
strukturna Doba

;
// djelomična specijalizacija
predložak
strukturna Doba

T1 Ivan = 11;
plutajuće Petar = 12.3;
T1 Marija = 13;
plutajuća Radost = 14.6;
;
int main ()

Doba ocjena7;
cout << grade7.John << " << grade7.Joy << '\n';
return 0;

Identificirajte deklaraciju osnovne klase i njezinu djelomičnu definiciju klase. Deklaracija glave predloška osnovne klase ima sve potrebne generičke parametre. Deklaracija glave predloška klase djelomične specijalizacije ima samo generički tip. U shemi se koristi dodatni set kutnih zagrada koji dolazi neposredno nakon naziva klase u definiciji djelomične specijalizacije. To je ono što zapravo čini djelomičnu specijalizaciju. Ima zadani tip i ne-zadani tip, redoslijedom napisanim u osnovnoj klasi. Imajte na umu da zadani tip još uvijek može dobiti drugi tip u funkciji main ().

Relevantni kod u funkciji main () može biti sljedeći:

Doba ocjena7;
cout << grade7.John << " << grade7.Joy << '\n';

Izlaz je: 11 14.6.

Paket parametara predloška

Paket parametara je parametar predloška koji prihvaća nula ili više generičkih tipova predložaka za odgovarajuće tipove podataka. Parametar paketa parametara započinje rezerviranim imenom tipa ili klase riječi. Nakon toga slijede tri točke, a zatim identifikator pakiranja. Sljedeći program ilustrira kako se paket parametara predloška može koristiti sa strukturom:

#include
pomoću prostora imena std;
predložak strukturna Doba

int Ivan = 11;
plutajuće Petar = 12.3;
int Marija = 13;
plutajuća Radost = 14.6;
;
int main ()

Doba ocjenaB;
cout << gradeB.John << " << gradeB.Mary << '\n';
Doba ocjenaC;
cout << gradeC.Peter << " << gradeC.Joy << '\n';
Doba ocjenaD;
cout << gradeD.John << " << gradeD.Joy << '\n';
Dob <> razred A; // poput zadanog
cout << gradeA.John << " << gradeA.Joy << '\n';
return 0;

Izlaz je:

11 13
12.3 14.6
11 14.6
11 14.6

Predlošci funkcija

Gore navedene značajke predloška primjenjuju se na sličan način na predloške funkcija. Sljedeći program prikazuje funkciju s dva generička parametra predloška i tri argumenta:

#include
pomoću prostora imena std;
predložak void func (T ne, U cha, const char * str)

cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

int main ()

func (12, '$', "500");
return 0;

Izlaz je sljedeći:

U trgovini postoji 12 knjiga vrijednih 500 američkih dolara.

Odvajanje od prototipa

Definicija funkcije može se odvojiti od njenog prototipa, kao što pokazuje sljedeći program:

#include
pomoću prostora imena std;
predložak void func (T ne, U cha, const char * str);
predložak void func (T ne, U cha, const char * str)

cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

int main ()

func (12, '$', "500");
return 0;

Napomena: Deklaracija predloška funkcije ne može se pojaviti u glavnoj () funkciji ili bilo kojoj drugoj funkciji.

Preopterećenje

Preopterećenje iste funkcije može se dogoditi s različitim deklaracijama glave predloška. Sljedeći program to ilustrira:

#include
pomoću prostora imena std;
predložak void func (T ne, U cha, const char * str)

cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';

predložak void func (T ne, const char * str)

cout << "There are " << no << " books worth $" << str << " in the store." << '\n';

int main ()

func (12, '$', "500");
func (12, "500");
return 0;

Izlaz je:

U trgovini postoji 12 knjiga vrijednih 500 američkih dolara.

U trgovini postoji 12 knjiga vrijednih 500 američkih dolara.

Predlošci predavanja

Značajke gore spomenutih predložaka primjenjuju se na sličan način kao predlošci razreda. Sljedeći je program deklaracija, definicija i uporaba jednostavne klase:

#include
pomoću prostora imena std;
razred TheCla

javnost:
int num;
statički char ch;
void func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

statična šupljina (char ch)

ako (ch == 'a')
cout << "Official static member function" << '\n';

;
int main ()

TheCla obj;
obj.num = 12;
obj.func ('$', "500");
return 0;

Izlaz je sljedeći:

U trgovini postoji 12 knjiga vrijednih 500 američkih dolara.

Sljedeći je program gornji program s deklaracijom glave predloška:

#include
pomoću prostora imena std;
predložak razred TheCla

javnost:
T broj;
statički U ch;
void func (U cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

zabava u statičkoj praznini (U ch)

ako (ch == 'a')
cout << "Official static member function" << '\n';

;
int main ()

TheCla obj;
obj.num = 12;
obj.func ('$', "500");
return 0;

Umjesto naziva vrste riječi na popisu parametara predloška, ​​može se koristiti klasa riječi. Zabilježite specijalizaciju u deklaraciji objekta. Izlaz je i dalje isti:

U trgovini postoji 12 knjiga vrijednih 500 američkih dolara.

Izdvajanje deklaracije

Deklaracija predloška klase može se odvojiti od koda klase, kako slijedi:

predložak razred TheCla;
predložak razred TheCla

javnost:
T broj;
statički U ch;
void func (U cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

zabava u statičkoj praznini (U ch)

ako (ch == 'a')
cout << "Official static member function" << '\n';

;

Suočavanje sa statičnim članovima

Sljedeći program pokazuje kako pristupiti statičnom članu podataka i funkciji statičkog člana:

#include
pomoću prostora imena std;
predložak razred TheCla

javnost:
T broj;
statički U ch;
void func (U cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

zabava u statičkoj praznini (U cha)

ako (ch == 'a')
cout << "Official static member function" << cha << '\n';

;
predložak U TheCla:: ch = 'a';
int main ()

TheCla::zabava('.');
return 0;

Dodjela vrijednosti statičnom članu podataka je deklaracija i ne može biti u main (). Zabilježite upotrebu i položaje generičkih vrsta i generičkog tipa podataka u izrazu dodjele. Uz to, imajte na umu da je funkcija statičkog člana podataka pozvana u main (), sa stvarnim vrstama podataka predloška. Rezultat je sljedeći:

Službena statička funkcija člana.

Sastavljanje

Izjava (zaglavlje) i definicija predloška moraju biti u jednoj datoteci. Odnosno, moraju biti u istoj prijevodnoj jedinici.

Zaključak

C ++ predlošci čine algoritam neovisan o vrsti podataka koji se koriste. Entiteti varijable, funkcije, strukture i klase mogu imati predloške, koji uključuju deklaraciju i definiciju. Stvaranje predloška također uključuje specijalizaciju, a to je kada generički tip uzima stvarni tip. Izjava i definicija predloška moraju biti u jednoj prijevodnoj jedinici.

Kako razviti igru ​​na Linuxu
Prije deset godina malo je Linux korisnika predviđalo da će njihov omiljeni operativni sustav jednog dana biti popularna platforma za igranje komercij...
Luke komercijalnih igara s otvorenim kodom
Besplatne igre s otvorenim kodom i više platformi mogu se koristiti za igranje starih, kao i nekih prilično nedavnih naslova igara. U ovom će se člank...
Najbolje igre naredbenog retka za Linux
Naredbeni redak nije samo vaš najveći saveznik pri korištenju Linuxa - on također može biti izvor zabave jer ga možete koristiti za igranje mnogih zab...