Zapouzdřený ukazatel
Vytvořte třídu pro práci s ukazateli, která umožní práci s ukazatelem tak, aby byla co nejvíce podobná standardní práci s ukazatelem, ale aby automaticky odalokovávala paměť, pokud tak neučiní uživatel.
Třída by měla pracovat tak, že zapouzdří ukazatel, a umožní s ním dále standardně pracovat. Nevýhodou práce s ukazateli (kterou má tento mechanizmus „vylepšit“) je to, že je nutné naalokovanou paměť odalokovat. To vadí například při volání výjimek, které toto odalokování neřeší. Proto navrhněte jednoduchou třídu, která je schopna odalokovat samostatně paměť (jelikož na každý objekt i při volání výjimek volán destruktor), přitom ale zachová co nejvíce původních vlastností ukazatele.
Tento ukazatel se bude používat pouze pro paměť, kterou alokujeme. Pro paměť odkazovanou bez alokace se bude používat standardní ukazatel.
Omezení: nesmí být přiřazen jinému zapouzdřenému ukazateli, nesmí být předáván z funce do nadřazené funkce
Řešení:
vytvořte třídu, která bude obsahovat daný ukazatel
napište konstruktory. Kopykonstruktor je nutné zakázat (přesunem do private sekce) – proč?
Napište destruktor (který odalokuje paměť, byla-li naalokovaná)
zakažte přiřazování (operátor =)
Napište konverzní operátor na ukazatel (který se bude využívat k tomu aby se třídou šlo pracovat jako se standardním ukazatelem
napište externí funkci Destroy, která zajistí odalokování paměti ukazatele.
rozšiřte (=učiňte univerzálním) tuto třídu na všechny typy ukazatelů pomocí šablon
je nutné rozlišovat alokaci jednoho prvku a pole? V případě, že ano vytvořte třídy pro jednotlivé varianty. Destroy navrhněte univerzálně pro obě třídy
Poslední úpravy 2008-07-30