Класс QWeakPointer
Класс QWeakPointer хранит слабую ссылку на общий указатель. Подробнее...
| Заголовок: | #include <QWeakPointer> |
| qmake: | QT += core |
| С тех пор: | Qt 4.5 |
Этот класс был представлен в Qt 4.5.
Примечание: Все функции в этом классе являются реентерабельными.
Открытые функции
| QWeakPointer(const QSharedPointer<T> &other) | |
| QWeakPointer(const QWeakPointer<T> &other) | |
| QWeakPointer() | |
| QWeakPointer<T> & | operator=(const QSharedPointer<T> &other) |
| QWeakPointer<T> & | operator=(const QWeakPointer<T> &other) |
| ~QWeakPointer() | |
| void | clear() |
| T * | data() const |
| bool | isNull() const |
| QSharedPointer<T> | lock() const |
| void | swap(QWeakPointer<T> &other) |
| QSharedPointer<T> | toStrongRef() const |
| bool | operator bool() const |
| bool | operator!() const |
Связанные нечлены
| QWeakPointer<X> | qWeakPointerCast(const QWeakPointer<T> &src) |
| bool | operator!=(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2) |
| bool | operator!=(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2) |
| bool | operator!=(const QWeakPointer<T> &lhs, std::nullptr_t) |
| bool | operator!=(std::nullptr_t, const QWeakPointer<T> &rhs) |
| bool | operator==(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2) |
| bool | operator==(const QWeakPointer<T> &lhs, std::nullptr_t) |
| bool | operator==(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2) |
| bool | operator==(std::nullptr_t, const QWeakPointer<T> &rhs) |
Подробное описание
Класс QWeakPointer — это автоматическая слабая ссылка на указатель в C++. Ее нельзя использовать для непосредственного разыменования указателя, но можно использовать для проверки, был ли указатель удален или нет в другом контексте.
Объекты QWeakPointer могут создаваться только путем присваивания из QSharedPointer.
Важно отметить, что QWeakPointer не предоставляет автоматических операторов преобразования, чтобы предотвратить ошибки. Несмотря на то, что QWeakPointer отслеживает указатель, его не следует рассматривать как указатель сам по себе, поскольку он не гарантирует, что указанный объект останется допустимым.
Поэтому для доступа к указателю, который отслеживает QWeakPointer, необходимо сначала преобразовать его в QSharedPointer и проверить, является ли полученный объект пустым или нет. QSharedPointer гарантирует, что объект не удаляется, поэтому если вы получаете ненулевой объект, вы можете использовать указатель. См. QWeakPointer::toStrongRef() для примера.
QWeakPointer также предоставляет метод QWeakPointer::data(), который возвращает отслеживаемый указатель, не гарантируя, что он останется допустимым. Эта функция предоставляется, если вы можете гарантировать внешними средствами, что объект не будет удален (или если вам нужен только сам указатель) и стоимость создания QSharedPointer с помощью toStrongRef() слишком высока.
См. также QSharedPointer и QScopedPointer.
Документация по функциям-членам
QWeakPointer::QWeakPointer(const QSharedPointer<T> &other)
Создает QWeakPointer, который хранит слабую ссылку на указатель, на который ссылается other.
Если T является производным типом шаблонного параметра этого класса, QWeakPointer выполнит автоматическое преобразование. В противном случае у вас возникнет ошибка компиляции.
QWeakPointer::QWeakPointer(const QWeakPointer<T> &other)
Создает QWeakPointer, который хранит слабую ссылку на указатель, на который ссылается other.
Если T является производным типом шаблонного параметра этого класса, QWeakPointer выполнит автоматическое преобразование. В противном случае у вас возникнет ошибка компиляции.
QWeakPointer::QWeakPointer()
Создает QWeakPointer, который не указывает ни на что.
QWeakPointer<T> &QWeakPointer::operator=(const QSharedPointer<T> &other)
Присваивает этому объекту указатель other. Текущая ссылка на указатель отбрасывается, но не удаляется.
Если T является производным типом шаблонного параметра этого класса, QWeakPointer выполнит автоматическое преобразование. В противном случае у вас возникнет ошибка компиляции.
QWeakPointer<T> &QWeakPointer::operator=(const QWeakPointer<T> &other)
Присваивает этому объекту указатель other. Текущая ссылка на указатель отбрасывается, но не удаляется.
Если T является производным типом шаблонного параметра этого класса, QWeakPointer выполнит автоматическое преобразование. В противном случае у вас возникнет ошибка компиляции.
QWeakPointer::~QWeakPointer()
Удаляет объект QWeakPointer. Указанный этим объектом указатель не будет удален.
void QWeakPointer::clear()
Очищает объект QWeakPointer, удаляя ссылку на указатель.
T *QWeakPointer::data() const
Возвращает значение отслеживаемого указателя этим QWeakPointer, не гарантируя, что он не будет удален. Для гарантии используйте toStrongRef(), который возвращает объект QSharedPointer. Если эта функция определит, что указатель уже удален, она возвращает nullptr.
В порядке получения значения указателя и использования его, например, в отладочных утверждениях:
qDebug("Tracking %p", weakref.data()); Однако, разыменование указателя разрешено только в том случае, если вы можете гарантировать внешними средствами, что указатель не будет удален. Например, если вы уверены, что ни один другой поток не может его удалить, ни функции, которые вы можете вызвать.
Если это так, то следующий код является корректным:
// this pointer cannot be used in another thread
// so other threads cannot delete it
QWeakPointer<int> weakref = obtainReference();
Object *obj = weakref.data();
if (obj) {
// if the pointer wasn't deleted yet, we know it can't get
// deleted by our own code here nor the functions we call
otherFunction(obj);
} Используйте эту функцию с осторожностью.
Эта функция была добавлена в Qt 4.6.
См. также isNull() и toStrongRef().
bool QWeakPointer::isNull() const
Возвращает true, если этот объект ссылается на nullptr.
Обратите внимание, что из-за природы слабых ссылок, объект, на который ссылается QWeakPointer, может быть nullptr в любой момент, поэтому значение, возвращаемое этой функцией, может измениться с false на true от одного вызова к другому.
QSharedPointer<T> QWeakPointer::lock() const
То же, что и toStrongRef().
Эта функция предоставлена для совместимости API со std::weak_ptr.
Эта функция была добавлена в Qt 5.4.
void QWeakPointer::swap(QWeakPointer<T> &other)
Меняет местами этот слабый указатель с other. Эта функция очень быстрая и никогда не терпит неудачу.
Эта функция была добавлена в Qt 5.4.
QSharedPointer<T> QWeakPointer::toStrongRef() const
Преобразует эту слабую ссылку в сильную и возвращает объект QSharedPointer, содержащий эту ссылку. При преобразовании в QSharedPointer, эта функция проверяет, был ли объект удалён. Если нет, эта функция увеличивает счётчик ссылок на общий объект, тем самым гарантируя, что он не будет удалён.
Поскольку эта функция может не получить действительную сильную ссылку на общий объект, вы всегда должны проверить, удалось ли преобразование, вызвав QSharedPointer::isNull() на возвращаемом объекте.
Например, следующий код преобразует QWeakPointer в сильную ссылку и, если это удалось, выводит значение целого числа, которое хранилось:
QWeakPointer<int> weakref;
// ...
QSharedPointer<int> strong = weakref.toStrongRef();
if (strong)
qDebug() << "The value is:" << *strong;
else
qDebug() << "The value has already been deleted"; См. также QSharedPointer::QSharedPointer().
bool QWeakPointer::operator bool() const
Возвращает true, если сохранённый указатель не nullptr. Эта функция подходит для использования в if-constructs, например:
if (weakref) { ... } Обратите внимание, что из-за природы слабых ссылок, объект, на который ссылается QWeakPointer, может стать nullptr в любой момент, поэтому возвращаемое значение этой функции может измениться с true на false от одного вызова к другому.
См. также isNull().
bool QWeakPointer::operator!() const
Возвращает true, если этот объект ссылается на nullptr. Эта функция подходит для использования в if-constructs, например:
if (!weakref) { ... } Обратите внимание, что из-за природы слабых ссылок, объект, на который ссылается QWeakPointer, может стать nullptr в любой момент, поэтому возвращаемое значение этой функции может измениться с false на true от одного вызова к другому.
См. также isNull().
Связанные нечлены
QWeakPointer<X> QWeakPointer::qWeakPointerCast(const QWeakPointer<T> &src)
Возвращает слабый указатель на указатель, хранящийся в src, приведённый к типу X. Типы T и X должны принадлежать одной иерархии для успешного static_cast.
Обратите внимание, что X должен иметь те же cv-квалификаторы (const и volatile), что и T, иначе код не будет компилироваться. Используйте qSharedPointerConstCast для отмены const-квалификатора.
bool QWeakPointer::operator!=(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2)
Возвращает true если ptr1 и ptr2 ссылаются на разные указатели.
Если параметр шаблона ptr2 отличается от параметра шаблона ptr1, QSharedPointer попытается выполнить автоматическое static_cast для обеспечения равенства сравниваемых указателей. Если параметр шаблона ptr2 не является базовым или производным типом от параметра шаблона ptr1, произойдёт ошибка компиляции.
bool QWeakPointer::operator!=(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
Возвращает true если ptr1 и ptr2 ссылаются на разные указатели.
Если параметр шаблона ptr2 отличается от параметра шаблона ptr1, QSharedPointer попытается выполнить автоматическое static_cast для обеспечения равенства сравниваемых указателей. Если параметр шаблона ptr2 не является базовым или производным типом от параметра шаблона ptr1, произойдёт ошибка компиляции.
bool QWeakPointer::operator!=(const QWeakPointer<T> &lhs, std::nullptr_t)
Возвращает true если lhs ссылается на допустимый (т.е. не нулевой) указатель.
Эта функция была добавлена в Qt 5.8.
См. также QWeakPointer::isNull().
bool QWeakPointer::operator!=(std::nullptr_t, const QWeakPointer<T> &rhs)
Возвращает true если rhs ссылается на допустимый (т.е. не нулевой) указатель.
Эта функция была добавлена в Qt 5.8.
См. также QWeakPointer::isNull().
bool QWeakPointer::operator==(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2)
Возвращает true если ptr1 и ptr2 ссылаются на один и тот же указатель.
Если параметр шаблона ptr2 отличается от параметра шаблона ptr1, QSharedPointer попытается выполнить автоматическое static_cast для обеспечения равенства сравниваемых указателей. Если параметр шаблона ptr2 не является базовым или производным типом от параметра шаблона ptr1, произойдёт ошибка компиляции.
bool QWeakPointer::operator==(const QWeakPointer<T> &lhs, std::nullptr_t)
Возвращает true если lhs ссылается на nullptr.
Эта функция была добавлена в Qt 5.8.
См. также QWeakPointer::isNull().
bool QWeakPointer::operator==(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
Возвращает true если ptr1 и ptr2 ссылаются на один и тот же указатель.
Если параметр шаблона ptr2 отличается от параметра шаблона ptr1, QSharedPointer попытается выполнить автоматическое static_cast для обеспечения равенства сравниваемых указателей. Если параметр шаблона ptr2 не является базовым или производным типом от параметра шаблона ptr1, произойдёт ошибка компиляции.
bool QWeakPointer::operator==(std::nullptr_t, const QWeakPointer<T> &rhs)
Возвращает true если rhs ссылается на nullptr.
Эта функция была добавлена в Qt 5.8.
См. также QWeakPointer::isNull().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qweakpointer.html