LINUX.ORG.RU

std::shared_ptr с методом-делитером


0

1

Хочу создать std::shared_ptr с нужной функцией делитером. Вот так пробовал:

class Foo
{
public:
    typedef std::shared_ptr<some_struct, std::mem_fun_ref(&Foo::foo_delete_some_struct)> SomeStructPtr;
    
private:
   SomeStructPtr st;

   void foo_delete_some_struct(some_struct * s);
}

Но гцц ругается на тайпдефе:incomplete type 'Foo' used in nested name specifier.

★★
class Foo
{
    void foo_delete_some_struct(some_struct * s);

public:
    typedef std::shared_ptr<some_struct> SomeStructPtr;

    SomeStructPtr bar()
    {
        return SomeStructPtr(new some_struct, std::bind(&Foo::foo_delete_some_struct, this, std::placeholders::_1));
    }
};

У shared_ptr только один шаблонный параметр.

user_2190
()
Ответ на: комментарий от user_2190

Спасибо за пояснение. А как в таком случае удостоверится что указатель удалит данные нормально? В сеттере проверять на наличие делитера нужно?

Leron ★★
() автор топика
Ответ на: комментарий от Leron

В сеттере проверять на наличие делитера нужно?

Не понял, что имеется в виду здесь под сеттером?

А как в таком случае удостоверится что указатель удалит данные нормально?

Если нужно гарантировать, что любой shared_ptr<some_struct> удаляется через Foo::foo_delete_some_struct, можно сделать так:

class some_struct {
private:
    ~some_struct() {}

public:
     void explicit_delete_for_Foo() { delete this; }
};

class Foo {
    void foo_delete_some_struct(some_struct *s)
    {
        s->explicit_delete_for_Foo();
    }
};

или объявить Foo как friend.

user_2190
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.