如何从 C++ 中的弱指针访问类成员函数?

问题描述

我是智能指针的完全新手,我从未在 C++ 中处理过 weak_ptr

我在类 Y 中有一个函数,它接受类 weak_ptrX 作为参数。

在类Y函数内部,我需要通过X访问类weak_ptr的成员函数

作为参考,这里是一个粗略的类定义

Y.cpp

class Y {
  public : Y();
           ~Y();
           int foo(std::weak_ptr<X> x);
};

X.cpp

class X {
 public : std::string func1();
          int func2();
};

在类 foo()Y 函数内部,我需要能够使用 func1 访问函数 func2weak_ptr x。>

我不知道为什么我需要使用 weak_ptr,但这正是我应该实现的。

我无法使用 weak_ptr 找到任何适合初学者的示例代码

解决方法

您需要先使用 shared_ptr 将其转换为 .lock()

int foo(std::weak_ptr<X> x)
{
    std::shared_ptr<X> y = x.lock(); // Or `auto y = x.lock();`.
    y->do_stuff();
}

基本原理是 weak_ptr 不拥有所有权(与 shared_ptr 不同),因此如果您可以直接取消引用它,则存在目标对象被不同线程销毁的风险当你这样做的时候。

在使用结果指针 (y) 之前检查它是否不为 null 可能是个好主意,除非在它为 null 时崩溃是处理您案例中错误的可接受方式。

每次都调用 .lock() 是一个坏的想法(而不是一次并将结果保存到变量中),因为目标可以在调用之间被破坏(而且它会更多成本高)。