Класс QExplicitlySharedDataPointer
Класс QExplicitlySharedDataPointer представляет указатель на явным образом совместно используемый объект. Подробнее...
| Заголовок: | #include <QExplicitlySharedDataPointer> |
| qmake: | QT += core |
| С момента: | Qt 4.4 |
Этот класс был представлен в Qt 4.4.
Примечание: Все функции в этом классе являются реентерабельными.
Общедоступные типы
| typedef | 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() |
| void | reset() |
| void | swap(QExplicitlySharedDataPointer<T> &other) |
| T * | take() |
| bool | operator bool() const |
| bool | operator!() const |
| bool | operator!=(const QExplicitlySharedDataPointer<T> &other) const |
| bool | operator!=(const T *ptr) const |
| T & | operator*() const |
| T * | operator->() |
| T * | operator->() const |
| QExplicitlySharedDataPointer<T> & | operator=(T *o) |
| bool | operator==(const QExplicitlySharedDataPointer<T> &other) const |
| bool | operator==(const T *ptr) const |
Защищенные функции
| T * | clone() |
Подробное описание
QExplicitlySharedDataPointer<T> упрощает написание собственных классов с явным совместным использованием. QExplicitlySharedDataPointer реализует безопасную для потоков обработку счетчика ссылок, гарантируя, что добавление QExplicitlySharedDataPointers в ваши реентерабельные классы не сделает их нереентерабельными.
За исключением одного существенного отличия, QExplicitlySharedDataPointer аналогичен QSharedDataPointer. Главное отличие состоит в том, что члены QExplicitlySharedDataPointer не выполняют автоматическую операцию copy-on-write (detach()), которую неконстантные члены QSharedDataPointer выполняют перед предоставлением возможности изменения общего объекта данных. Функция detach() доступна, но если вам действительно нужно выполнить detach(), вы должны вызвать ее самостоятельно. Это означает, что QExplicitlySharedDataPointers ведут себя как обычные указатели C++, за исключением того, что при обработке счетчика ссылок и не удалении общего объекта данных, пока счетчик ссылок не станет равным 0, они избегают проблемы висячих указателей.
Полезно сравнить QExplicitlySharedDataPointer с QSharedDataPointer на примере. Рассмотрим пример Employee в QSharedDataPointer, измененный для использования явного совместного использования, как описано в обсуждении Неявное и явное совместное использование.
Обратите внимание, что если вы используете этот класс, но обнаруживаете, что часто вызываете detach(), скорее всего, вы должны использовать QSharedDataPointer вместо этого.
В документации по функциям членов d-указатель всегда относится к внутреннему указателю на общий объект данных.
См. также QSharedData и QSharedDataPointer.
Документация по типу члена
typedef QExplicitlySharedDataPointer::Type
Это тип общего объекта данных. d-указатель указывает на объект этого типа.
Документация по функциям члена
QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(QExplicitlySharedDataPointer<T> &&o)
Перемещающее создание экземпляра QExplicitlySharedDataPointer, что делает его указывающим на тот же объект, на который указывал o.
Эта функция была введена в Qt 5.2.
QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<X> &o)
Этот конструктор копирования отличается тем, что позволяет o быть указателем на другой тип явно совместно используемых данных, но с совместимым объектом общих данных.
По умолчанию d-указатель o (типа X *) неявно преобразуется в тип T *; результат этого преобразования устанавливается как d-указатель this, а счетчик ссылок на общий объект данных увеличивается.
Однако, если макрос QT_ENABLE_QEXPLICITLYSHAREDDATAPOINTER_STATICCAST определен до включения заголовка QExplicitlySharedDataPointer, тогда d-указатель o претерпевает static_cast в тип T *. Результат приведения типа затем устанавливается как d-указатель 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-указатель this на d-указатель в o и увеличивает счетчик ссылок на общий объект данных.
QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(T *data)
Создаёт QExplicitlySharedDataPointer с указателем d, установленным на data, и увеличивает счётчик ссылок объекта data.
QExplicitlySharedDataPointer::QExplicitlySharedDataPointer()
Создаёт QExplicitlySharedDataPointer, инициализированный значением nullptr в качестве указателя d.
QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(QExplicitlySharedDataPointer<T> &&other)
Перемещающее присваивание значения other экземпляру QExplicitlySharedDataPointer.
Данная функция была добавлена в Qt 5.2.
QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(const QExplicitlySharedDataPointer<T> &o)
Устанавливает указатель d для this на указатель d объекта o и увеличивает счётчик ссылок на общий объект данных. Счётчик ссылок на старый общий объект данных для this уменьшается. Если счётчик ссылок на старый общий объект данных становится равным 0, старый общий объект данных удаляется.
QExplicitlySharedDataPointer::~QExplicitlySharedDataPointer()
Уменьшает счётчик ссылок общего объекта данных. Если счётчик ссылок становится равным 0, общий объект данных удаляется. После этого this уничтожается.
[protected] T *QExplicitlySharedDataPointer::clone()
Создаёт и возвращает глубокую копию текущих данных. Эта функция вызывается функцией detach() при счётчике ссылок больше 1 для создания новой копии. Эта функция использует оператор new и вызывает конструктор копирования типа T.
См. QSharedDataPointer<T>::clone() для объяснения использования.
Данная функция была добавлена в Qt 4.5.
const T *QExplicitlySharedDataPointer::constData() const
Возвращает константный указатель на общий объект данных.
См. также data().
T *QExplicitlySharedDataPointer::data() const
Возвращает указатель на общий объект данных.
void QExplicitlySharedDataPointer::detach()
Если счётчик ссылок общего объекта данных больше 1, эта функция создаёт глубокую копию общего объекта данных и устанавливает указатель d для this на эту копию.
Поскольку QExplicitlySharedDataPointer не выполняет автоматические операции copy-on-write, которые выполняют члены QSharedDataPointer, detach() не вызывается автоматически нигде в функциях-членах этого класса. Если вы обнаруживаете, что вызываете detach() везде в своём коде, рассмотрите возможность использования QSharedDataPointer вместо этого.
void QExplicitlySharedDataPointer::reset()
Сбрасывает this в значение null — то есть эта функция устанавливает указатель d для this на nullptr, но сначала уменьшает счётчик ссылок общего объекта данных и удаляет общий объект данных, если счётчик ссылок стал 0.
void QExplicitlySharedDataPointer::swap(QExplicitlySharedDataPointer<T> &other)
Меняет местами указатель явно-общих данных этого экземпляра с указателем явно-общих данных в other.
T *QExplicitlySharedDataPointer::take()
Возвращает указатель на общий объект и сбрасывает this в nullptr. То есть эта функция устанавливает указатель d для this на nullptr.
Данная функция была добавлена в Qt 5.12.
bool QExplicitlySharedDataPointer::operator bool() const
Возвращает true если указатель d для this не равен null.
bool QExplicitlySharedDataPointer::operator!() const
Возвращает true если указатель d для this равен nullptr.
bool QExplicitlySharedDataPointer::operator!=(const QExplicitlySharedDataPointer<T> &other) const
Возвращает true если other и this не имеют одинакового указателя d.
bool QExplicitlySharedDataPointer::operator!=(const T *ptr) const
Возвращает true если указатель d для this не равен ptr.
T &QExplicitlySharedDataPointer::operator*() const
Обеспечивает доступ к членам общего объекта данных.
T *QExplicitlySharedDataPointer::operator->()
Обеспечивает доступ к членам общего объекта данных.
T *QExplicitlySharedDataPointer::operator->() const
Обеспечивает доступ в режиме чтения к членам общего объекта данных.
QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(T *o)
Устанавливает указатель d для this на o и увеличивает счётчик ссылок объекта o. Счётчик ссылок на старый общий объект данных для this уменьшается. Если счётчик ссылок на старый общий объект данных становится равным 0, старый общий объект данных удаляется.
bool QExplicitlySharedDataPointer::operator==(const QExplicitlySharedDataPointer<T> &other) const
Возвращает true если other и this имеют одинаковый указатель d.
bool QExplicitlySharedDataPointer::operator==(const T *ptr) const
Возвращает true если указатель d для this равен ptr.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qexplicitlyshareddatapointer.html