используя умные указатели с «этим» - PullRequest
4 голосов
/ 30 июля 2010

Я изучаю использование умных указателей наддува, но я немного запутался в нескольких ситуациях.Допустим, я реализую конечный автомат, где каждое состояние реализуется одним методом обновления.Каждое состояние может возвращать себя или создавать новый объект состояния:

struct state
{
    virtual state* update() = 0;  // The point: I want to return a smart pointer here
};

struct stateA : public state
{
    virtual state* update() { return this; }
};

struct stateB : public state
{
    virtual state* update() { if(some condition) return new stateA() else return this; }

};

Цикл конечного автомата будет выглядеть следующим образом:

while(true)
    current_state = current_state->update();

Не могли бы вы перевестиэтот код использовать для повышения умных указателей?Я немного растерялся, когда дело доходит до части «верни это», потому что я не знаю, что делать.По сути, я думаю, что бесполезно возвращать что-то вроде «return boost :: shared_ptr (this);»потому что это не безопасно.Что мне делать?

Ответы [ 2 ]

12 голосов
/ 30 июля 2010

Возможно, вы захотите взглянуть на enable_shared_from_this, который предназначен для конкретного решения проблем, подобных вашей.

6 голосов
/ 30 июля 2010

Ваши классы должны наследоваться от boost::enable_shared_from_this<>.Посмотрите пример Boost здесь .

...