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

Har*_* Sj 0 c++ smart-pointers weak-ptr

我对智能指针完全是新手,而且从未接触过weak_ptrC++。

我在 class 中有一个函数Y,它接受weak_ptrclass 的参数 a X

在类的函数内部Y,我需要X通过weak_ptr.

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

Y.cpp

class Y {
  public : Y();
           ~Y();
           int foo(std::weak_ptr<X> x);
};
Run Code Online (Sandbox Code Playgroud)

X.cpp

class X {
 public : std::string func1();
          int func2();
};
Run Code Online (Sandbox Code Playgroud)

foo()在类的函数内部Y,我需要能够访问函数func1func2使用weak_ptr x.

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

我无法找到任何使用weak_ptr.

Hol*_*Cat 6

您需要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();
}
Run Code Online (Sandbox Code Playgroud)

理由是 aweak_ptr不持有所有权(与 不同shared_ptr),因此如果您可以直接取消引用它,则在执行此操作时,目标对象将存在被其他线程销毁的风险。

在使用之前检查生成的指针 () 是否不为 null 可能是一个好主意y,除非如果它为 null 则崩溃是处理您的情况下的错误的可接受的方法。

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