> For the complete documentation index, see [llms.txt](https://frogs-organization-2.gitbook.io/oop.-sbornik./llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://frogs-organization-2.gitbook.io/oop.-sbornik./23.-patterny-povedeniya./khranitel-holder.md).

# Хранитель (Holder)

## Пример

<pre class="language-cpp"><code class="lang-cpp"># include &#x3C;iostream>

using namespace std;

template &#x3C;typename Type>
class Holder
{
private:
        Type* ptr{ nullptr };

public:
        Holder() = default;
        explicit Holder(Type* p) : ptr(p) {}
        Holder(Holder&#x26;&#x26; other) noexcept
        {
                ptr = other.ptr;
                other.ptr = nullptr;
        }
        ~Holder() { delete ptr; }

        Type* operator ->() noexcept { return ptr; }
        Type&#x26; operator *() noexcept { return *ptr; }
        operator bool() noexcept { return ptr != nullptr; }
        
        Type* release() noexcept
        {
                Type* work = ptr;
                ptr = nullptr;
        
                return work;
        }
        
        Holder(const Holder&#x26;) = delete;
        Holder&#x26; operator =(const Holder&#x26;) = delete;
};

class A
{
public:
        A() { cout &#x3C;&#x3C; "Constructor" &#x3C;&#x3C; endl; }
        ~A() { cout &#x3C;&#x3C; "Destructor" &#x3C;&#x3C; endl; }
        
        void f() { cout &#x3C;&#x3C; "Function f of class A is called" &#x3C;&#x3C; endl; }
};

int main()
{
        Holder&#x3C;A> obj(new A{});

<strong>        obj->f();
</strong>}


</code></pre>
