C ++ delt_ptr

C Shared_ptr



De delt_ptr er en type smarte pekere for C ++ som inneholder det delte eierskapet til objektet opprettet av pekeren. Den deler eiendomsretten til objektet når pekeren lagres i et annet objekt, og den delte referansetelleren teller antall eiere. De delt_ptr øker referansetelleren med én etter kopiering av objektet og reduserer referansetelleren med én etter å ha ødelagt objektet. Minnet som eies av objektet omdisponeres hvis objektet eies av det siste delt_ptr blir ødelagt, eller nullstille() funksjon kalles for å tildele en annen peker for objektet. Når delt_ptr ikke eier noe objekt, så kalles det en tom delt peker. Ulike bruksområder for delt_ptr har blitt vist i denne opplæringen.

Eksempel 1: Deklarer delt peker på forskjellige måter

Tre forskjellige måter å erklære en delt peker på er vist i følgende eksempel. En klasse med en konstruktør og en offentlig metode er deklarert i koden. Konstruktøren vil skrive ut en melding når et nytt delt objekt blir opprettet med konstruktøren. De Vise() metoden vil skrive ut meldinger basert på det delte pekerobjektet som ringer. Her har det første delte pekerobjektet blitt opprettet uten å ringe konstruktøren. Det andre delte pekerobjektet er opprettet ved å ringe konstruktøren. Den tredje delte pekeren har blitt til ved å tilordne den første delte pekeren. De Vise() metoden har blitt kalt tre ganger ved å bruke tre delte pekerobjekter.







// Inkluder nødvendige biblioteker

#inkludere

#inkludere

usingnamespacestd;

// Definer klassen
classMyClass{
offentlig:
// Erklær konstruktøren
Klassen min() {
koste<<'Konstruktøren kalles. n';
}
// Erklær en metode for å skrive ut tekst
voidDisplay(streng str)
{
koste<<'Display () -metoden kalles fra'<<s. s<<'peker. n';
}
};

i hovedsak()
{
// Initialiser shared_ptr uten å ringe konstruktør
delt_ptr p1=make_shared();
p1->Vise('først');
// Initialiser shared_ptr ved å ringe konstruktør
delt_ptr s2=delt_ptr(newMyClass);
s2->Vise('sekund');

// Initialiser shared_ptr etter oppgave
delt_ptr p3=p1;
p3->Vise('tredje');
retur 0;
}

Produksjon:



Følgende utdata vises etter at koden ovenfor er utført. Konstruktøren har kun ringt på tidspunktet for andre objektopprettelse. Så, meldingen til konstruktøren har blitt skrevet ut bare én gang:







Eksempel 2: Skriv ut den lagrede delte pekeren

Get () -funksjonen delt peker brukes til å returnere den lagrede, delte pekerplasseringen. Følgende eksempel vil skrive ut plasseringen av de lagrede, delte pekerne som er opprettet av klassen og funksjonen. Her er det definert en klasse med en konstruktør som skal brukes for å lage en delt peker. En funksjon har blitt erklært for å opprette en delt peker og skrive ut den delte pekeren ved hjelp av get () -funksjonen. I denne koden er den første delte pekeren opprettet ved hjelp av klassen, den andre delte pekeren er opprettet ved hjelp av funksjonen, og den tredje delte pekeren er opprettet ved å tilordne den første pekeren.

// Inkluder nødvendige biblioteker

#inkludere

#inkludere

usingnamespacestd;

// Definer klassen
classMyClass
{
offentlig:
// Erklær konstruktøren
Klassen min() {
koste<<'Konstruktøren kalles. n';
}
};
// Definer funksjon for å initialisere pekeren
voidInit_shared_ptr()
{
delt_ptr s2(newMyClass);
koste<<s2.() <<' n';
}

i hovedsak()
{
// Initialiser shared_ptr ved å ringe konstruktør
delt_ptr p1=delt_ptr(newMyClass);
koste<<p1.() <<' n';

// Initialiser shared_ptr ved å ringe funksjonen
Init_shared_ptr();

// Initialiser shared_ptr etter oppgave
delt_ptr p3=p1;
koste<<p3.() <<' n';
retur 0;
}

Produksjon:



Følgende lignende utgang vil vises etter at koden ovenfor er utført. I utgangen er den returnerte verdien av get () -funksjonen for den første og tredje delte pekeren den samme. Den andre delte pekeren er imidlertid annerledes:

Eksempel 3: Tell de delte pekerobjektene

Følgende eksempel viser en måte å telle antall objekter som en delt peker peker på etter at du har opprettet og ødelagt pekeren. En klasse med en konstruktør er deklarert i koden. Den første delte pekeren er opprettet ved hjelp av klassen, og den andre delte pekeren er opprettet ved hjelp av den første delte pekeren. Antall objekter som ble vist av begge delte pekere før og etter at du ringte til reset () -funksjonen, er skrevet ut senere.

// Inkluder nødvendige biblioteker

#inkludere

#inkludere

usingnamespacestd;
// Definer klassen
classMyClass{
offentlig:
// Erklær konstruktøren
Klassen min() {
koste<<'Konstruktøren kalles. n';
}
};
i hovedsak()
{
// Initialiser den første shared_ptr ved å ringe konstruktør
delt_ptr p1(newMyClass);

// Vis antall shared_ptr -objekter med den første pekeren
koste<<'p1 peker på'<<p1.use_count() <<'objekt (er). n';
// Initialiser den andre shared_ptr ved å bruke den første shared_ptr
delt_ptr s2(p1);
// Vis antall shared_ptr -objekter med den første og andre pekeren
koste<<'p2 peker på'<<s2.use_count() <<'objekt (er). n';
koste<<'p1 peker på'<<p1.use_count() <<'objekt (er). n';
// Fjern eierskapet til den første pekeren fra shared_ptr -objektet
p1.nullstille();
// Vis antall shared_ptr -objekter med den andre pekeren
koste<<'p2 peker på'<<s2.use_count() <<'objekt (er). n';
retur 0;
}

Produksjon:

Følgende utdata vises etter at koden ovenfor er utført. Den første pekeren, p1 , peker på ett objekt etter opprettelsen. Etter å ha opprettet den andre pekeren, s2 , ved hjelp av den første pekeren, p1 Begge pekerne peker på to objekter for deling av pekeren. Etter å ha kalt reset () -funksjonen for pekeren, p1 , ett objekt er ødelagt, og pekeren, s2 , peker nå bare på ett objekt.

Konklusjon:

Formålet med å bruke en delt peker i C ++ har blitt forklart i denne opplæringen ved hjelp av enkle eksempler. Opprette delte pekere på forskjellige måter, lagre delt pekerplassering og telle antall objekter som pekes av de delte pekerne. Jeg håper C ++ - koderne vil kunne bruke den delte pekeren i koden etter å ha lest denne opplæringen.