C ++ jagatud_ptr

C Shared_ptr



The jagatud_ptr on üks C ++ nutikate näpunäidete tüüp, mis sisaldab kursori loodud objekti ühisomandit. See jagab kursori teise objekti salvestamisel objekti omandiõigust ja jagatud viite loendur loendab omanike arvu. The jagatud_ptr suurendab võrdlusloendurit pärast objekti kopeerimist ühe võrra ja vähendab võrdlusloendurit ühe võrra pärast objekti hävitamist. Objektile kuuluv mälu jaotatakse ümber, kui objekt kuulub viimasele jagatud_ptr hävitatakse või lähtestamine () funktsiooni kutsutakse objektile teise kursori määramiseks. Kui jagatud_ptr ei oma ühtegi objekti, siis nimetatakse seda tühjaks jagatud kursoriks. Erinevad kasutusalad jagatud_ptr on selles õpetuses näidatud.

Näide 1: deklareerige jagatud kursor erinevatel viisidel

Järgmises näites on näidatud kolm erinevat viisi jagatud kursori deklareerimiseks. Koodis on deklareeritud klass koos konstruktori ja avaliku meetodiga. Konstruktor prindib teate, kui konstruktoriga luuakse uus jagatud objekt. The Kuva () meetod prindib sõnumeid kutsuva jagatud kursori objekti põhjal. Siin on esimene jagatud kursori objekt loodud ilma konstruktorile helistamata. Teine jagatud kursori objekt on loodud konstruktorile helistades. Kolmas jagatud kursor on loodud esimese jagatud kursori määramisega. The Kuva () meetodit on kutsutud kolm korda, kasutades kolme jagatud kursori objekti.







// Kaasa vajalikud teegid

#kaasake

#kaasake

usingnamespacestd;

// Määratle klass
classMyClass{
avalik:
// Deklareeri konstruktor
Minu klass() {
maksma<<'Konstruktorit kutsutakse. n';
}
// Teksti printimise meetodi kuulutamine
voidDisplay(string str)
{
maksma<<'Display () meetodit kutsutakse'<<lk<<'osuti. n';
}
};

sisimas()
{
// Initsialiseeri jagatud_ptr ilma konstruktorit kutsumata
jagatud_ptr lk 1=make_shared();
lk 1->Ekraan('esimene');
// Initsialiseeri jagatud_ptr, kutsudes konstruktori
jagatud_ptr lk 2=jagatud_ptr(newMyClass);
lk 2->Ekraan('teine');

// Initsialiseeri jagatud_ptr ülesande järgi
jagatud_ptr lk 3=lk 1;
lk 3->Ekraan('kolmas');
tagasitulek0;
}

Väljund:



Pärast ülaltoodud koodi täitmist kuvatakse järgmine väljund. Konstruktor on helistanud ainult teise objekti loomise ajal. Seega on konstruktori sõnum trükitud ainult üks kord:







Näide 2: prindige salvestatud jagatud kursori asukoht

Funktsiooni get () jagatud kursorit kasutatakse salvestatud jagatud kursori asukoha tagastamiseks. Järgmine näide prindib klassi ja funktsiooni loodud salvestatud jagatud viitade asukoha. Siin on konstruktoriga klass määratud jagatud kursori loomiseks. Jagatud kursori loomiseks ja jagatud kursori asukoha printimiseks funktsiooni (() abil on deklareeritud funktsioon. Selles koodis on esimene jagatud kursor loodud klassi abil, teine ​​jagatud kursor on loodud funktsiooni abil ja kolmas jagatud kursor on loodud esimese kursori määramisega.

// Kaasa vajalikud teegid

#kaasake

#kaasake

usingnamespacestd;

// Määratle klass
classMyClass
{
avalik:
// Deklareeri konstruktor
Minu klass() {
maksma<<'Konstruktorit kutsutakse. n';
}
};
// Määrake funktsioon kursori initsialiseerimiseks
voidInit_shared_ptr()
{
jagatud_ptr lk 2(newMyClass);
maksma<<lk 2.saada() <<' n';
}

sisimas()
{
// Initsialiseeri jagatud_ptr, kutsudes konstruktori
jagatud_ptr lk 1=jagatud_ptr(newMyClass);
maksma<<lk 1.saada() <<' n';

// Initsialiseeri jagatud_ptr helistades
Init_shared_ptr();

// Initsialiseeri jagatud_ptr ülesande järgi
jagatud_ptr lk 3=lk 1;
maksma<<lk 3.saada() <<' n';
tagasitulek0;
}

Väljund:



Pärast ülaltoodud koodi täitmist kuvatakse järgmine sarnane väljund. Väljundis on funktsiooni get () tagastatud väärtus esimese ja kolmanda jagatud kursori jaoks sama. Teine jagatud kursor on aga erinev:

Näide 3: loendage jagatud kursori objektid

Järgmine näide kujutab endast viisi, kuidas loendada ja jagatud kursoriga osutatud objekte pärast kursori loomist ja hävitamist. Koodis on deklareeritud konstruktoriga klass. Esimene jagatud kursor on loodud klassi abil ja teine ​​jagatud kursor on loodud esimese jagatud kursori abil. Mõlema jagatud kursori osutatud objektide arv enne ja pärast funktsiooni reset () kutsumist on hiljem trükitud.

// Kaasa vajalikud teegid

#kaasake

#kaasake

usingnamespacestd;
// Määratle klass
classMyClass{
avalik:
// Deklareeri konstruktor
Minu klass() {
maksma<<'Konstruktorit kutsutakse. n';
}
};
sisimas()
{
// Initsialiseeri esimene jagatud_ptr, kutsudes konstruktori
jagatud_ptr lk 1(newMyClass);

// Kuvab jagatud_ptr objektide arvu esimese kursori järgi
maksma<<'p1 osutab'<<lk 1.use_count() <<'objekt (id). n';
// Initsialiseeri teine ​​shared_ptr, kasutades esimest shared_ptr
jagatud_ptr lk 2(lk 1);
// Kuvab jagatud_ptr -objektide arvu esimese ja teise osuti järgi
maksma<<'p2 osutab'<<lk 2.use_count() <<'objekt (id). n';
maksma<<'p1 osutab'<<lk 1.use_count() <<'objekt (id). n';
// Eemaldage jagatud_ptr objektilt esimese kursori omandiõigus
lk 1.lähtestada();
// Näitab jagatud_ptr objektide arvu teise kursori abil
maksma<<'p2 osutab'<<lk 2.use_count() <<'objekt (id). n';
tagasitulek0;
}

Väljund:

Pärast ülaltoodud koodi täitmist kuvatakse järgmine väljund. Esimene osuti, lk 1 , osutab pärast loomist ühele objektile. Pärast teise kursori loomist lk 2 , kasutades esimest kursorit, lk 1 , osutavad mõlemad kursorid kursori jagamiseks kahele objektile. Pärast kursori funktsiooni reset () helistamist lk 1 , üks objekt on hävitatud ja osuti, lk 2 , osutab nüüd ainult ühele objektile.

Järeldus:

Jagatud kursori kasutamise eesmärke C ++ -is on selles õpetuses selgitatud lihtsate näidete abil. Jagatud kursorite loomine erinevatel viisidel, jagatud kursori asukoha salvestamine ja jagatud kursoritele osutatud objektide loendamine. Loodan, et C ++ kodeerijad saavad pärast selle õpetuse lugemist kasutada jagatud kursorit oma koodis.