C ++ shared_ptr

C Shared_ptr



Ang ibinahagi_ptr ay isang uri ng matalinong mga pahiwatig ng C ++ na naglalaman ng nakabahaging pagmamay-ari ng bagay na nilikha ng pointer. Ibinabahagi nito ang pagmamay-ari ng bagay kapag itinatago ang pointer sa isa pang bagay, at binibilang ng nakabahaging sanggunian na sanggunian ang bilang ng mga may-ari. Ang ibinahagi_ptr pinatataas ang referral counter ng isa pagkatapos makopya ang bagay at binabawasan ng isa ang sangguniang counter matapos sirain ang bagay. Ang memorya na pagmamay-ari ng bagay ay naitalaga kung ang bagay na pag-aari ng huli ibinahagi_ptr ay nawasak, o ang i-reset () Ang pagpapaandar ay tinawag upang magtalaga ng isa pang pointer para sa bagay. Kapag ang ibinahagi_ptr ay hindi nagmamay-ari ng anumang bagay, pagkatapos ito ay tinatawag na isang walang laman na nakabahaging pointer. Iba't ibang gamit ng ibinahagi_ptr ipinakita sa tutorial na ito.

Halimbawa 1: Ipahayag ang Nakabahaging Pointer sa Iba't ibang Paraan

Tatlong magkakaibang paraan upang ideklara ang isang nakabahaging pointer ay ipinapakita sa sumusunod na halimbawa. Ang isang klase na may tagabuo at isang pampublikong pamamaraan ay naideklara sa code. Ang tagapagbuo ay magpi-print ng isang mensahe kapag ang isang bagong nakabahaging bagay ay nilikha kasama ang tagapagbuo. Ang Ipakita () ang pamamaraan ay magpi-print ng mga mensahe batay sa pagtawag ng nakabahaging pointer object. Dito, ang unang ibinahaging object ng pointer ay nilikha nang hindi tumatawag sa tagapagbuo. Ang pangalawang ibinahaging object ng pointer ay nilikha sa pamamagitan ng pagtawag sa konstruktor. Ang pangatlong nakabahaging pointer ay nilikha sa pamamagitan ng pagtatalaga ng unang nakabahaging pointer. Ang Ipakita () ang pamamaraan ay tinawag ng tatlong beses sa pamamagitan ng paggamit ng tatlong ibinahaging mga object ng pointer.







// Isama ang mga kinakailangang aklatan

# isama

# isama

usingnamespacestd;

// Tukuyin ang klase
classMyClass{
pampubliko:
// Ideklara ang tagapagbuo
MyClass() {
gastos<<'Ang tagapagbuo ay tinawag. n';
}
// Ideklara ang isang paraan upang mag-print ng teksto
voidDisplay(string str)
{
gastos<<'Ang paraan ng Display () ay tinawag mula sa'<<p<<'pointer. n';
}
};

intmain()
{
// Initialize shared_ptr nang hindi tumatawag sa tagapagbuo
ibinahagi_ptr p1=gumawa ng_shared();
p1->Ipakita('una');
// Initialize shared_ptr sa pamamagitan ng pagtawag sa konstruktor
ibinahagi_ptr p2=ibinahagi_ptr(newMyClass);
p2->Ipakita('pangalawa');

// Initialize shared_ptr by assignment
ibinahagi_ptr p3=p1;
p3->Ipakita('pangatlo');
pagbabalik0;
}

Output:



Ang sumusunod na output ay lilitaw pagkatapos ipatupad ang code sa itaas. Ang tagapagbuo ay tumawag sa oras lamang ng paglikha ng pangalawang object. Kaya, ang mensahe ng tagagawa ay naka-print lamang ng isang beses:







Halimbawa 2: I-print ang Nakaimbak na Lokasyon ng Nakabahaging Pointer

Ang get () function shared pointer ay ginagamit upang ibalik ang nakaimbak, ibinahaging lokasyon ng pointer. Ang sumusunod na halimbawa ay i-print ang lokasyon ng mga nakaimbak, nakabahaging mga payo na nilikha ng klase at ng pagpapaandar. Dito, ang isang klase na may tagabuo ay tinukoy na magagamit para sa paglikha ng isang nakabahaging pointer. Ang isang pagpapaandar ay idineklara upang lumikha ng isang nakabahaging pointer at mai-print ang ibinahaging lokasyon ng pointer gamit ang pag-andar ng get (). Sa code na ito, ang unang nakabahaging pointer ay nilikha gamit ang klase, ang pangalawang ibinahaging pointer ay nilikha gamit ang pagpapaandar, at ang pangatlong ibinahaging pointer ay nilikha sa pamamagitan ng pagtatalaga ng unang pointer.

// Isama ang mga kinakailangang aklatan

# isama

# isama

usingnamespacestd;

// Tukuyin ang klase
classMyClass
{
pampubliko:
// Ideklara ang tagapagbuo
MyClass() {
gastos<<'Ang tagapagbuo ay tinawag. n';
}
};
// Tukuyin ang pagpapaandar upang simulan ang pointer
voidInit_shared_ptr()
{
ibinahagi_ptr p2(newMyClass);
gastos<<p2.kumuha ka() <<' n';
}

intmain()
{
// Initialize shared_ptr sa pamamagitan ng pagtawag sa konstruktor
ibinahagi_ptr p1=ibinahagi_ptr(newMyClass);
gastos<<p1.kumuha ka() <<' n';

// Initialize shared_ptr by calling function
Init_shared_ptr();

// Initialize shared_ptr by assignment
ibinahagi_ptr p3=p1;
gastos<<p3.kumuha ka() <<' n';
pagbabalik0;
}

Output:



Ang sumusunod na katulad na output ay lilitaw pagkatapos ipatupad ang code sa itaas. Sa output, ang ibinalik na halaga ng pag-andar ng makakuha () para sa una at pangatlong ibinahaging mga payo ay pareho. Gayunpaman, ang pangalawang ibinahaging pointer ay iba:

Halimbawa 3: Bilangin ang Mga Nakabahaging Mga Bagay na Pointer

Ang sumusunod na halimbawa ay naglalarawan ng isang paraan upang mabilang ang bilang ng mga bagay na itinuro ng isang nakabahaging pointer pagkatapos likhain at sirain ang pointer. Ang isang klase na may tagabuo ay naideklara sa code. Ang unang ibinahaging pointer ay nilikha gamit ang klase, at ang pangalawang ibinahaging pointer ay nilikha gamit ang unang nakabahaging pointer. Ang bilang ng mga bagay na itinuro ng parehong nakabahaging mga payo bago at pagkatapos na tawagan ang pag-reset () na pagpapaandar ay nai-print sa paglaon.

// Isama ang mga kinakailangang aklatan

# isama

# isama

usingnamespacestd;
// Tukuyin ang klase
classMyClass{
pampubliko:
// Ideklara ang tagapagbuo
MyClass() {
gastos<<'Ang tagapagbuo ay tinawag. n';
}
};
intmain()
{
// Simulan ang unang ibinahaging_ptr sa pamamagitan ng pagtawag sa tagapagbuo
ibinahagi_ptr p1(newMyClass);

// Ipakita ang bilang ng mga ibinahaging_ptr na bagay sa pamamagitan ng unang pointer
gastos<<'p1 na tumuturo sa'<<p1.use_count() <<'object (s). n';
// Ipasimula ang pangalawang ibinahaging_ptr gamit ang unang ibinahaging_ptr
ibinahagi_ptr p2(p1);
// Ipakita ang bilang ng mga ibinahaging_ptr na bagay sa pamamagitan ng una at pangalawang mga payo
gastos<<'p2 na tumuturo sa'<<p2.use_count() <<'object (s). n';
gastos<<'p1 na tumuturo sa'<<p1.use_count() <<'object (s). n';
// Alisin ang pagmamay-ari ng unang pointer mula sa nakabahaging_ptr na bagay
p1.i-reset();
// Ipakita ang bilang ng mga ibinahaging_ptr na bagay sa pamamagitan ng pangalawang pointer
gastos<<'p2 na tumuturo sa'<<p2.use_count() <<'object (s). n';
pagbabalik0;
}

Output:

Ang sumusunod na output ay lilitaw pagkatapos ipatupad ang code sa itaas. Ang unang pointer, p1 , ay tumuturo sa isang bagay pagkatapos ng paglikha. Matapos likhain ang pangalawang pointer, p2 , gamit ang unang pointer, p1 , ang parehong mga payo ay tumuturo sa dalawang mga bagay para sa pagbabahagi ng pointer. Matapos tawagan ang pag-andar ng reset () para sa pointer, p1 , isang bagay ang nawasak, at ang pointer, p2 , ay tumuturo lamang sa isang bagay lamang.

Konklusyon:

Ang mga layunin ng paggamit ng isang nakabahaging pointer sa C ++ ay naipaliwanag sa tutorial na ito sa pamamagitan ng paggamit ng mga simpleng halimbawa. Lumilikha ng mga nakabahaging mga payo sa iba't ibang paraan, nakakakuha ng nakaimbak na nakabahaging lokasyon ng pointer, at bilangin ang bilang ng mga bagay na itinuro ng mga nakabahaging mga payo. Inaasahan kong ang C ++ coders ay maaaring magamit ang nakabahaging pointer sa kanilang code pagkatapos basahin ang tutorial na ito.