C ++ unikaalse_ptr kasutamine

Use C Unique_ptr



Nutikaid näpunäiteid kasutatakse ressursi dünaamiliseks jaotamiseks. C ++ -is kasutatakse mitmesuguseid nutikaid näpunäiteid erinevatel eesmärkidel, näiteks auto_ptr , unikaalne_ptr ja jagatud_ptr . Kursor auto_ptr on C ++ uues versioonis aegunud. Unikaalset_ptrit kasutatakse auto_ptri asendamiseks. Selle kursori objekt võib kursori omandisse võtta. Selle kursori objekt omab kursorit ainulaadselt ja ükski teine ​​kursor ei saa objektile osutada. Unikaalne_ptr kustutab objektid automaatselt. See kursor haldab neid objekte, kui objektid on hävitatud või kui objekti väärtust muudetakse või funktsiooni reset () kutsutakse. Unikaalse_ptr funktsioone ja selle kursori kasutusviise käsitletakse selles õpetuses.

Peamised komponendid:







Allpool on toodud unikaalse_ptr objekti kaks põhikomponenti:



A. Salvestatud osuti:



Seda kasutatakse ainulaadse kursori abil loodud objektide haldamiseks. See luuakse kursori loomise ajal ja seda saab muuta erineval viisil.





B. Salvestatud deleter:

See võtab hallatud objekti kustutamiseks kasutatava salvestatud kursoritüübi argumendi. See luuakse ka osuti loomise ajal ja seda saab muuta erinevatel viisidel.



Näide 1: Looge konstruktoriga klassi osuti objekt

Klassi ainulaadsete osutiobjektide deklareerimiseks ja klassi meetodile juurdepääsuks saab kasutada järgmises näites näidatud objekte. Koodis on deklareeritud klass koos konstruktori ja avaliku meetodiga. Konstruktoril on kolm argumenti. Esimene unikaalne osuti on loodud kolme argumendiväärtusega konstruktorile helistades. The Tulemus() meetodit kutsub osuti objekt, mis arvutab konstruktori kolme argumendi väärtuse summa. Järgmisena luuakse konstruktorile helistamata teine ​​unikaalne osutiobjekt ja esimene osuti teisaldatakse teisele kursorile. The Tulemus() meetodit kutsub teine ​​kursorobjekt.

//Kaasa vajalikud raamatukogud

#kaasake

#kaasake

usingnamespace std;

//Määratle klass
klassi liitmine{

int number1, number2, number3;
avalik:
//Kuuluta konstruktor
Lisamine(int a, int b, int c)
{
number1 = a;
number2 = b;
arv3 = c;
}
//Deklareerige meetod arvutamisekssumma
int Tulemus()
{
tagasinumber1 + number2 + number3;
}
};
int peamine()
{
//Kuulutage esimene osuti
unikaalne_ptr -kursor1(uus lisa(Neli, viis,55,30));

maksma<<'Summa tulemus esimese kursori abil:'<Tulemus() <<' n';
//Kuulutage teine ​​osuti
unikaalne_ptr -osuti2;
//Liigutage esimene kursor teisele
osuti2 = liikumine(osuti 1);

maksma<<'Teise osuti abil saadud summa tulemus:'<Tulemus() <<' n';
tagastamine0;
}

Väljund:

Pärast ülaltoodud koodi täitmist kuvatakse järgmine väljund. Summa 45, 55 ja 30 on 130, mis on trükitud mõlemale osutile.

Näide 2: Looge konstruktori ja hävitajaga klassi osuti objekt

Järgmises näites on näidatud viisi, kuidas deklareerida konstruktori ja hävitajaga klassi ainulaadne osutiobjekt. Klass sisaldab ühe argumendiga konstruktorit, klassimuutuja väärtusele avalikku meetodit Display () ja hävitajat, mis prindib enne klassi objekti hävitamist hävitamisteate. Kuvamise () meetod kutsutakse pärast kordumatu kursoriobjekti loomist koodis.

//Kaasa vajalikud raamatukogud

#kaasake

#kaasake

usingnamespace std;

//Määratle klass
klassi klient
{
stringi nimi;

avalik:
//Kuuluta konstruktor
Klient(string n)
{
nimi = n;
maksma<<„Ressurss on eraldatud. n';
}

//Deklareerige kliendi nime printimise meetod
tühi kuva()
{
maksma<<'Kliendi nimi on:'<<nimi<<' n';
}

//Kuulutage hävitaja
~ Klient()
{
maksma<<'Ressurss hävitatakse. n';
}
};
int peamine()
{
//Eraldage ressursiobjekt, mille omanik on unikaalne_ptr
unikaalne_ptruPointer{uus klient('Mir Abbas') };
uPointer->Ekraan();
tagastamine0;
}

Väljund:

Pärast ülaltoodud koodi täitmist kuvatakse järgmine väljund:

Näide 3: kontrollige kursorit pärast omandiõiguse üleandmist

Unikaalse kursori omandiõiguse kontrollimise viis on näidatud järgmises näites, luues klassi kaks unikaalset kursorit. Koodis on deklareeritud klass kahe stringimuutuja ja avaliku meetodiga. Klassi meetodit Book_details () kutsutakse pärast klassi esimese unikaalse osuti objekti loomist. Järgmisena on loodud teine ​​ainulaadne kursoriobjekt ja esimene kursor on teisaldatud teisele, mis hävitab esimese kursori. Mõlema näitaja omandiõigust tuleks hiljem kontrollida.

//Kaasa vajalikud raamatukogud

#kaasake

#kaasake

usingnamespace std;

//Määratle klass
klassi raamat{

stringi pealkiri ='C ++ programmeerimiskeel';
stringi autor ='Bjarne Stroustrup';

avalik:
//Raamatu üksikasjade printimise meetod
voidBook_details()
{
maksma<<'Raamatu nimi:'<<tiitel<<' n';
maksma<<'Autori nimi:'<<autor<<' n';
}
};
int peamine()
{
//Kuulutage esimene osuti
unikaalne_ptr -kursor1(uus Raamat());

osuti1->Book_details();
//Kuulutage teine ​​osuti
unikaalne_ptr -osuti2;
//Liigutage esimene kursor teisele
osuti2 = liikumine(osuti 1);

//Kontrollige esimest kursorit
kui (static_cast(osuti 1))maksma<<„Esimene näitaja pole null n';
muidu<<'Esimene näitaja on null n';
//Kontrollige teist kursorit
kui (static_cast(osuti2))maksma<<'Teine näitaja pole null n';
muidu<<'Teine näitaja on null n';

tagastamine0;
}

Väljund:

Pärast ülaltoodud koodi täitmist kuvatakse järgmine väljund. Väljundi kohaselt eemaldati esimese kursori omandiõigus ja teade Esimene osuti on null on esimese osuti jaoks trükitud. Teise kursori omandiõigus on olemas ja sõnum Esimene osuti ei ole null on teise osuti jaoks printinud:

Järeldus:

Unikaalse kursori kasutamise eesmärke C ++ programmeerimisel on käesolevas õpetuses kirjeldatud mitme näite abil. Siin on selgitatud võimalusi unikaalse kursori loomiseks, kursori omandiõiguse üleandmiseks ja kursori praeguse omandiõiguse kontrollimiseks, et aidata lugejatel unikaalse kursori kasutamist õigesti teada saada.