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

标签 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. 避免循环引用。

但是有一些问题:

  1. 如何在 A 类中创建弱指针?首先,我应该确定 A 的一个实例是由某个 shared_ptr 管理的。即使我真的确定,我如何才能找到这个 shared_ptr 实例?
  2. 一般来说,如何确保我仅通过共享指针使用某些类的实例?我可以尝试创建工厂方法并将构造函数设为私有(private),但这会导致错误:make_shared 需要一个公共(public)构造函数。

提前致谢!

编辑:

问题的更详细解释:我有一个类 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 不能保证这个引用的对象仍然存在(所有裸指针的通病)。所以我想传递一个弱指针,我的问题就是它。

最佳答案

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

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

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

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

关于C++:通过 std::weak_ptr 将委托(delegate)传递给其他对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21637265/

相关文章:

C++ 无法通过虚拟基 A 从基 A 转换为派生类型 B

c++ - 在 C++ 中从排序的整数 vector 中搜索和删除元素的最快方法

c++ - 为什么 utf-8 字符在 cmd.exe 中不显示?

c# - 使用 Action 委托(delegate)根据泛型调用正确的函数

java - Java中的函数指针

swift - 使用具有复杂模型结构的 MVVM

c++ - C++ 头文件中的声明和初始化过多

c++ - 在可以转换为另一个模板类型的类模板中重载赋值运算符

c++ - 检查模板是否具有给定类型的特化

c++ - 类中的 static const std::array