Как правильно использовать enable_shared_from_this?

67
15 июля 2021, 02:40

Я пытаюсь понять, зачем вообще нужно использовать enable_shared_from_this?

Я нашел, вот такое обьяснение

https://stackoverflow.com/a/5548314/5709159

где вкратце говориться о том, что вот так плохо

    struct S
    {
        shared_ptr<S> dangerous()
        {
            return shared_ptr<S>(this);   // don't do this!
        }
    };
    int main()
    {
        shared_ptr<S> sp1(new S);
        shared_ptr<S> sp2 = sp1->dangerous();
        return 0;
    }

а вот так хорошо

    struct S : enable_shared_from_this<S>
    {
        shared_ptr<S> not_dangerous()
        {
            return shared_from_this();
        }
    };
    int main()
    {
        shared_ptr<S> sp1(new S);
        shared_ptr<S> sp2 = sp1->not_dangerous();
        return 0;
    }

Тут вопросов нет и действительно при данном сравнении понятно, что правильно, а что нет.

Но в чем проблема сделать просто вот так

int main()
{
    shared_ptr<S> sp1(new S);
    shared_ptr<S> sp2 = sp1;
    return 0;
}

И не нужно ничего придумывать, ни от чего наследовать и переопределять.

В чем хитрость?

Answer 1

Хитрость в том, что предложенный вами способ работает только за пределами членов класса. Но что если нужно создать shared_ptr на объект класса из метода этого класса? В качестве примера где это может понадобится (хотя в таком случае я предпочитаю использовать coroutines

READ ALSO
Как подчищать структуру DOM-дерева?

Как подчищать структуру DOM-дерева?

В процессе работы PopUp создаётся и накапливается неактивный код, который приводит к багуПопробовал его руками удалить и всё начало работать

94
Все элементы находятся под картинкой

Все элементы находятся под картинкой

Элементы залезают под картинку,помогите пожалуйста,я новичек и уже час ,если не больше пытаюсь найти ошибку ,но все четноМне нужно ,чтобы...

121
Проблема с colspan и rowspan

Проблема с colspan и rowspan

Не могу понять каким образом можно сдвинуть 6,8,11 ячейки, чтобы получилось как на картинке?

97