Класс QExplicitlySharedDataPointer
шаблон <typename T> класс QExplicitlySharedDataPointerКласс QExplicitlySharedDataPointer представляет указатель на явным образом совместно используемый объект. Подробнее...
| Заголовок: | #include <QExplicitlySharedDataPointer> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
Примечание: Все функции в этом классе являются реентерабельными.
Открытые типы
| Type |
Открытые функции
| QExplicitlySharedDataPointer(QExplicitlySharedDataPointer<T> &&o) | |
| QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<X> &o) | |
| QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<T> &o) | |
| QExplicitlySharedDataPointer(T *data) | |
| QExplicitlySharedDataPointer() | |
| QExplicitlySharedDataPointer<T> & | operator=(QExplicitlySharedDataPointer<T> &&other) |
| QExplicitlySharedDataPointer<T> & | operator=(const QExplicitlySharedDataPointer<T> &o) |
| ~QExplicitlySharedDataPointer() | |
| const T * | constData() const |
| T * | data() const |
| void | detach() |
| T * | get() const |
| void | reset(T *ptr = nullptr) |
| void | swap(QExplicitlySharedDataPointer<T> &other) |
| T * | take() |
| bool | operator bool() const |
| bool | operator!() const |
| T & | operator*() const |
| T * | operator->() |
| T * | operator->() const |
| QExplicitlySharedDataPointer<T> & | operator=(T *o) |
Защищенные функции
| T * | clone() |
Связанные нечлены
| bool | operator!=(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs) |
| bool | operator!=(const T *ptr, const QExplicitlySharedDataPointer<T> &rhs) |
| bool | operator==(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs) |
| bool | operator==(const T *ptr, const QExplicitlySharedDataPointer<T> &rhs) |
Подробное описание
QExplicitlySharedDataPointer<T> упрощает написание собственных классов с явным совместным использованием. QExplicitlySharedDataPointer реализует потокобезопасный подсчёт ссылок, гарантируя, что добавление QExplicitlySharedDataPointers в ваши реентерабельные классы не сделает их нереентерабельными.
За исключением одного существенного различия, QExplicitlySharedDataPointer подобен QSharedDataPointer. Существенное отличие заключается в том, что члены QExplicitlySharedDataPointer не выполняют автоматическую операцию копирования при записи (detach()), которую выполняют неконстантные члены QSharedDataPointer перед разрешением изменения общего объекта данных. Функция detach() доступна, но если вам действительно нужно выполнить отсоединение, вы должны вызвать её самостоятельно. Это означает, что QExplicitlySharedDataPointer ведут себя как обычные указатели C++, за исключением того, что, выполняя подсчёт ссылок и не удаляя общий объект данных, пока счёт ссылок не станет равным 0, они избегают проблемы с висячими указателями.
Поучительно сравнить QExplicitlySharedDataPointer с QSharedDataPointer на примере. Рассмотрим пример сотрудника в QSharedDataPointer, изменённый для использования явного совместного использования, как объяснено в обсуждении Неявное и явное совместное использование.
Обратите внимание, что если вы используете этот класс, но обнаруживаете, что часто вызываете detach(), возможно, вам следует использовать QSharedDataPointer вместо этого.
В документации по членам функции указатель d всегда относится к внутреннему указателю на общий объект данных.
См. также QSharedData и QSharedDataPointer.
Документация по типам членов
QExplicitlySharedDataPointer::Type
Это тип общего объекта данных. Указатель d pointer указывает на объект этого типа.
Документация по функциям членов
[since 5.2] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(QExplicitlySharedDataPointer<T> &&o)
Перемещающее создание экземпляра QExplicitlySharedDataPointer, делая его указывающим на тот же объект, на который указывал o.
Эта функция была представлена в Qt 5.2.
шаблон <typename X> QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<X> &o)
Этот конструктор копирования отличается тем, что позволяет o быть указателем на другой тип явно совместно используемых данных, но с совместимым общим объектом данных.
По умолчанию, указатель d pointer объекта o (типа X *) неявно преобразуется в тип T *; результат этого преобразования устанавливается как указатель d pointer объекта this, а счёт ссылок на общий объект данных увеличивается.
Однако, если макрос QT_ENABLE_QEXPLICITLYSHAREDDATAPOINTER_STATICCAST определён перед включением заголовка QExplicitlySharedDataPointer, то указатель d pointer объекта o подвергается static_cast в тип T *. Результат преобразования затем устанавливается как указатель d pointer объекта this, а счёт ссылок на общий объект данных увеличивается.
Предупреждение: полагаться на такие static_cast потенциально опасно, поскольку это позволяет компиляции такого кода:
QExplicitlySharedDataPointer<Base> base(new Base);
QExplicitlySharedDataPointer<Derived> derived(base); // !!! DANGER !!! Начиная с Qt 5.4, приведение типов отключено по умолчанию. Его можно включить, определив макрос QT_ENABLE_QEXPLICITLYSHAREDDATAPOINTER_STATICCAST, а значит, старый код (который полагался на эту функцию), сможет компилироваться без изменений.
QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<T> &o)
Этот стандартный конструктор копирования устанавливает указатель d для этого объекта на указатель d в o и увеличивает счётчик ссылок на общий объект данных.
QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(T *data)
Конструирует QExplicitlySharedDataPointer с указателем d, установленным на data, и увеличивает счётчик ссылок на data.
QExplicitlySharedDataPointer::QExplicitlySharedDataPointer()
Конструирует QExplicitlySharedDataPointer, инициализированный nullptr в качестве указателя d.
[since 5.2] QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(QExplicitlySharedDataPointer<T> &&other)
Перемещающее присваивание other экземпляру этого QExplicitlySharedDataPointer.
Эта функция была добавлена в Qt 5.2.
QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(const QExplicitlySharedDataPointer<T> &o)
Устанавливает указатель d для этого объекта на указатель d объекта o и увеличивает счётчик ссылок на общий объект данных. Счётчик ссылок на старый общий объект данных этого объекта уменьшается. Если счётчик ссылок на старый общий объект данных становится равным 0, старый общий объект данных удаляется.
QExplicitlySharedDataPointer::~QExplicitlySharedDataPointer()
Уменьшает счётчик ссылок на общий объект данных. Если счётчик ссылок становится равным 0, общий объект данных удаляется. Затем уничтожается этот объект.
[protected] T *QExplicitlySharedDataPointer::clone()
Создаёт и возвращает глубокую копию текущих данных. Эта функция вызывается функцией detach(), когда счётчик ссылок больше 1, для создания новой копии. Эта функция использует operator new и вызывает конструктор копирования типа T.
См. QSharedDataPointer<T>::clone() для объяснения использования.
const T *QExplicitlySharedDataPointer::constData() const
Возвращает константный указатель на общий объект данных.
См. также data().
T *QExplicitlySharedDataPointer::data() const
Возвращает указатель на общий объект данных.
void QExplicitlySharedDataPointer::detach()
Если счётчик ссылок на общий объект данных больше 1, эта функция создаёт глубокую копию общего объекта данных и устанавливает указатель d для этого объекта на копию.
Поскольку QExplicitlySharedDataPointer не выполняет автоматические операции «копирование при записи», которые выполняют члены QSharedDataPointer, detach() не вызывается автоматически нигде в членах этой функции. Если вы обнаружили, что вызываете detach() везде в своём коде, рассмотрите использование QSharedDataPointer вместо него.
[since 6.0] T *QExplicitlySharedDataPointer::get() const
То же, что и data(). Эта функция предоставляется для совместимости со STL.
Эта функция была добавлена в Qt 6.0.
[since 6.0] void QExplicitlySharedDataPointer::reset(T *ptr = nullptr)
Устанавливает указатель d для этого объекта на ptr и увеличивает счётчик ссылок на ptr, если ptr не nullptr. Счётчик ссылок на старый общий объект данных уменьшается, а объект удаляется, если счётчик ссылок достигает 0.
Эта функция была добавлена в Qt 6.0.
void QExplicitlySharedDataPointer::swap(QExplicitlySharedDataPointer<T> &other)
Обменивает указатель на явное совместное использование данных этого экземпляра с указателем на явное совместное использование данных в other.
[since 5.12] T *QExplicitlySharedDataPointer::take()
Возвращает указатель на общий объект и сбрасывает этот объект в nullptr. (То есть эта функция устанавливает указатель d для этого объекта на nullptr.)
Примечание: Счётчик ссылок на возвращаемый объект не будет уменьшен. Эта функция может использоваться вместе с конструктором, принимающим объект QAdoptSharedDataTag, для передачи общего объекта данных без вмешательства атомарных операций.
Эта функция была добавлена в Qt 5.12.
bool QExplicitlySharedDataPointer::operator bool() const
Возвращает true если указатель d для этого объекта не равен null.
bool QExplicitlySharedDataPointer::operator!() const
Возвращает true если указатель d для этого объекта равен nullptr.
T &QExplicitlySharedDataPointer::operator*() const
Предоставляет доступ к членам общего объекта данных.
T *QExplicitlySharedDataPointer::operator->()
Предоставляет доступ к членам общего объекта данных.
T *QExplicitlySharedDataPointer::operator->() const
Предоставляет доступ к членам общего объекта данных с константной ссылкой.
QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(T *o)
Устанавливает указатель d для этого объекта на o и увеличивает счётчик ссылок на o. Счётчик ссылок на старый общий объект данных этого объекта уменьшается. Если счётчик ссылок на старый общий объект данных становится равным 0, старый общий объект данных удаляется.
Связанные внечленённые функции
bool operator!=(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)
Возвращает true если lhs и rhs не имеют одинаковый указатель d.
bool operator!=(const T *ptr, const QExplicitlySharedDataPointer<T> &rhs)
Возвращает true если указатель d для rhs не равен ptr.
bool operator==(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)
Возвращает true если lhs и rhs имеют одинаковый указатель d.
bool operator==(const T *ptr, const QExplicitlySharedDataPointer<T> &rhs)
Возвращает true если указатель d для rhs равен ptr.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qexplicitlyshareddatapointer.html