Почему я не могу использовать shared_from_this с объектом интерфейса callbacks? - PullRequest
2 голосов
/ 16 декабря 2011

У меня возникают проблемы с плохим исключением слабого_птр, когда я пытаюсь передать shared_from_this () из производного класса, который наследуется от интерфейса обратного вызова, в третий класс, который принимает базовый класс обратного вызова shared_ptr в конструкторе.Почему это не работает?См. Упрощенный тестовый пример ниже:

#include <boost/tr1/memory.hpp>

class MyCallbacks : public std::tr1::enable_shared_from_this<MyCallbacks>
{
public:
  virtual ~MyCallbacks() {}
  virtual void callback1() = 0;
};

class Worker
{
public:
  Worker(std::tr1::shared_ptr<MyCallbacks> cb) : callbacks(cb) {}

  void do_work() { if (callbacks) callbacks->callback1(); }

private:
  std::tr1::shared_ptr<MyCallbacks> callbacks;

};

class Boss : public MyCallbacks
{
public:
  Boss() : worker(shared_from_this()) {}

  void go()
  {
    std::cerr << "Calling worker->do_work" << std::endl;
    worker.do_work();
  }

  void callback1()
  {
    std::cerr << "callback1" << std::endl;
  }

private:
  Worker worker;
};

int main (int argc, char const *argv[])
{
  std::tr1::shared_ptr<Boss> boss(new Boss);
  boss->go();
  return 0;
}

1 Ответ

3 голосов
/ 16 декабря 2011

shared_from_this () не может быть вызван в конструкторе, так как сначала должен существовать хотя бы один shared_ptr см. Оператор Требование внизу этой страницы

...