C ++:通过std :: weak_ptr将委托传递给其他对象

时间:2014-02-07 20:34:49

标签: c++ c++11 delegates shared-ptr weak-ptr

我有两个类,例如A和B.我想传递A作为B的参考。

class I
{
public:
    virtual void callback() = 0;
};

class B
{
public:
    B(I* callback) : _callback(callback) {}
private:
    I* _callback;
};

class A : public I
{
public:
    A() : _b(new B(this)) {}
private:
    B* _b;
};

我想:

  1. 摆脱裸指针(例如,在std :: shared_ptr和std :: weak_ptr的帮助下)。
  2. 避免循环引用。
  3. 但是有一些问题:

    1. 如何在A类中创建弱指针?首先,我应该确定A的实例是由一些shared_ptr管理的。即使我非常确定,我怎样才能找到这个shared_ptr实例?
    2. 通常,我如何通过共享指针确保我只使用某些类的实例?我可以尝试创建工厂方法并使构造函数成为私有,但它会导致错误:make_shared需要公共contstructor。
    3. 提前致谢!

      修改

      问题的更详细解释:我有一个A类。这个类想要将一部分工作传递给B类。所以我在A里面有一个共享指针B。我希望B能异步地执行此操作,当有一些进展或工作完成时,B应该调用A的回调。所以B应该引用A。

      class I
      {
      public:
          virtual void isDone() = 0;
      };
      
      class B
      {
      public:
          B(I* callback) : _callback(callback) //how do I take and store callback inside B???
          {
              //async invocation of run()
          }
      private:
          weak_ptr<I> _callback;
      
          void run()
          {
              if(_callback.get())
              {
                  _callback->isDone();
              }
          }
      };
      
      class A : public I
      {
      public:
          A() : _b(new B(this)) {} //how do I pass this to B???
      private:
          shared_ptr<B> _b;
      
          virtual void isDone()
          {
              cout << "job is complete" << '\n';
          }
      };
      

      所以问题是:如何将A传递给B?我可以尝试通过裸指针或引用来做到这一点,但这是安全的,因为B不能保证这个引用的对象仍然存活(所有裸指针的常见问题)。所以我想通过一个弱指针,我的问题就是它。

1 个答案:

答案 0 :(得分:1)

第一个问题可以通过std::enable_shared_from_this来解决,它允许您从A类中安全地创建共享指针实例。

第二个问题可以通过使用属于类A的静态工厂方法而不是像这样使用std :: make_shared来解决:

static std::shared_ptr<A> create() {
    return std::shared_ptr<A>(new A());
}

然后,您可以将A的构造函数设为私有。