Как получить доступ к функциям-членам класса из слабого указателя в C ?

#c #smart-pointers #weak-ptr

Вопрос:

Я полный новичок в интеллектуальных указателях, и я никогда не имел дела с weak_ptr C .

У меня есть функция в классе Y , которая принимает в качестве параметра a weak_ptr класса X .

Внутри функции в классе 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 и func2 использовать weak_ptr x .

Я не знаю , зачем мне это нужно weak_ptr , но это то, что я должен реализовать.

Я не могу найти ни одного удобного для начинающих примера кода с использованием weak_ptr .

Комментарии:

1.en.cppreference.com/w/cpp/memory/weak_ptr/lock ?

2. Совет: Я почти никогда не нуждался в shared_ptr . Ты, наверное, тоже не знаешь.

3. Я не уверен, почему, но меня попросили специально использовать weak_ptr в моем случае. Хотелось бы знать, в каких сценариях используется weak_ptr и когда они полезны

Ответ №1:

Вам нужно преобразовать его в 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();
}
 

Обоснование заключается в том, что a weak_ptr не является владельцем (в отличие shared_ptr от), поэтому, если бы вы могли разыменовать его напрямую, был бы риск того, что целевой объект будет уничтожен из другого потока, пока вы это делаете.

Возможно, было бы неплохо проверить, не является ли результирующий указатель ( y ) нулевым, прежде чем использовать его, если только сбой, если он равен нулю, не является приемлемым способом обработки ошибки в вашем случае.

Это плохая идея-звонить .lock() каждый раз (вместо одного раза и сохранять результат в переменной), так как цель может быть уничтожена между вызовами (и это было бы дороже).