Do sedaj smo vedno uporabljali tako imenovane raw kazalce, za katere smo morali poskrbeti sami. Od standarda C++11 naprej obstajajo smart pointers (pametni kazalci). Prednost pametnih kazalcev je na primer ta, da se destruktor kliče samodejno in tako ne rabimo sami skrbeti za brisanje objektov. Torej, da ne rabimo sami skrbeti za upravljanje pomnilnika, nam pri tem pomagajo pametni kazalci.
V sklopu te naloge boste s pomočjo znanja šablon razredov in prekrivanja operatorjev implementirali svoj pametni kazalec. Glavna naloga razreda bo, da bo vseboval kazalec na poljuben objekt in le-tega izbrisal, ko se bo klical destruktor.
Naloga ima naslednje zahteve:
Ustvarite šablono razreda SmartPointer, ki naj vsebuje kazalec na poljuben objekt in ta isti objekt izbriše takrat, ko se bo klical destruktor tega razreda. Implementirajte nastavitveni konstruktor in destruktor.
Da se bo pametni kazalec lahko obnašal enako, kot se obnaša raw kazalec, morate prekriti operatorja * in ->.
Pri prekrivanju operatorja * morate dereferencirati kazalec na objekt in ga vrniti.
Pri prekrivanju operatorja -> pa morate samo vrniti kazalec na objekt.
Spodnji izsek kode je primer implementacije pametnega kazalca za razred Date, vključno s prekritim operatorjem *. Vaša naloga je, da ga spremenite v šablono razreda in implementirate ostale zahteve (prekrijte preostali operator, konstruktor in destruktor).
Primer glavnega programa (uporaba vašega pametnega kazalca) poglejte v neobvezni nalogi 9.2.
#include "Date.h"
class SmartPointer { private: Date* pData;
public: // ...
Date& operator*() {
return *pData;
}
// ...
};
Vzemite razred Date iz prejšnjih nalog in ga dopolnite z naslednjimi zahtevami.
V razredu Date zapišite prijateljsko funkcijo za prekrivanje operatorja << (friend std::ostream& operator<<(std::ostream &out, const Date &date)).
Prekrijte še operator ==, ki primerja dva objekta razreda Date in vrnemo true oz. falsa glede na to, če sta datuma ista oz. različna (bool operator==(const Date& other)).
V razredu Date prekrijte še prefiksni in postfiksni operator ++, ki poveča dan za 1. Pri tem pazite, da ne prekoračite števila mesecev (int months[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};). Prototipa obeh prekritih operatorjev v razredu Date:
Date& operator++();
Date operator++(int dummy);
Demonstrirajte uporabo prijateljske funkcije in vseh prekritih operatorjev v glavnem programu! Pokažite vsaj en primer uporabe svojega pametnega kazalca in en primer uporabe kazalca shared_ptr iz standarda C++11. (https://en.cppreference.com/w/cpp/memory/shared_ptr)