c++ - 为什么我不能将shared_from_this 与回调接口(interface)对象一起使用?

标签 c++ boost shared-ptr smart-pointers

当我尝试将从回调接口(interface)继承的派生类中的shared_from_this()传递到在构造函数中采用回调基类shared_ptr的第三个类时,我遇到了错误的weak_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;
}

最佳答案

无法在构造函数中调用shared_from_this(),因为首先必须存在至少一个shared_ptr see the Requires statement at the bottom of this page

关于c++ - 为什么我不能将shared_from_this 与回调接口(interface)对象一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8528841/

相关文章:

c++ - 为什么 shared_ptr<T> 期望在 T 中复制/移动构造函数?

c++ - 构造可变参数模板参数列表

c++ - 无法使用 Microsoft Visual Studio 2012 列出初始化 vector

python - Boost Python Hello World 示例在 Python 中不起作用

c++ - Boost::log:基于级别的不同格式(HTML 格式)

c++ - 在什么意义上 weak_ptr 'own' 是 shared_ptr?

c++ - 子类是否分配其祖先的内存和方法?

c++ - C++98 中的自定义 dynamic_pointer_cast 实现

c++ - 与 Arduino 的串行通信仅在重启后的第一条消息上失败

c++ - 异常安全 C++ 共享指针