V nalogi 9.1 ste implementirali pametni kazalec. Vendar pa pri taki implementaciji lahko nastopi naslednja težava:

int main() { SmartPointer date1(new Date(6, 5, 2020)); // s pomočjo pametnega kazalca, dinamično ustvarimo objekt Date { SmartPointer date2 = date1; // na tem mestu naredimo kopijo kazalca date1 in sedaj oba kazalca (date1 // in date2 kažeta na isti objekt } // na tem mestu se bo klical destruktor pametnega kazalca date2 in pobrisal objekt Date std::cout << date1->toString() << std::endl; // ker sta oba kazalca kazala na isti objekt v pomnilniku, // se bo tukaj zgodila napaka, saj bomo klicali metodo toString() // nad objektom, ki več ne obstaja

return 0;

}

Da odpravite to težavo, morate implementirati štetje referenc. Da boste pri pametnem kazalcu podprli štetje referec, sledite naslednjim zahtevam:

Ustvarite razred ReferenceCounter, ki naj ima celoštevilsko lastnost count, ki bo predstavljala števec obstoječih referenc na določen objekt. Lastnost count privzeto nastavite na vrednost 0.
Za povečevanje oz. zmanjševanje števca referenc prekrijte naslednja dva operatorja:
    prefixni operator --, ki bo števec referenc zmanjšal za vrednost ena in
    postfixni operator ++, ki bo števec referenc povečal za vrednost ena.
V razred SmartPointer dodajte novo lastnost, ki naj bo kazalec na objekt ReferenceCounter. Ta lastnost bo skupna vsem instancam pametnih kazalcev, ki bodo kazali na isti kazalec. V nastavitvenem konstruktorju inicializarjte to vrednost.
Za "vzdrževanje" števca referenc prekritje operator = in implementirajte kopirni konstruktor. Pri tem skopirajte obe lastnosti in števec referenc povečajte za vrednost 1. Pri tem preverite, če slučajno želi nekdo kopirati samega sebe (objekt). Takrat samo vrnete samega sebe in ne kopirate objekta. S tem, ko smo implementirali kopirni konstruktor, prekrili operator in implementirali destruktor, smo upoštevali pravilo rule of three. Tako vam mora v spodnjem primeru kode metoda useCount() vrniti samo 2 referenci.

SmartPointer date1(new Date(1, 1, 2020)); SmartPointer date2(new Date(1, 1, 2019)); date2 = date1 = date1 = date1 = date1 = date1; date2 = date2; date2 = date2; std::cout << "reference count: " << date2.useCount() << std::endl;

Popravite še destruktor v razredu SmartPointer, ki bo izbrisal objekt samo v primeru, če je števec referenc enak 0.
Da boste lahko znotraj pametnega kazalca preverili kaka je vrednost števca count, dodajte metodo useCount(), ki vrne števec count.

V glavnem programu demonstrirajte uporabo vašega pametnega kazalca. Naj bo vidno tudi delovanje štetja referenc. Za prikaz delovanja lahko vzamete katerikoli razred iz prejšnjih nalog (npr. razred Date) ali pa napišete novega.