Класс QExplicitlySharedDataPointer
Класс QExplicitlySharedDataPointer представляет указатель на явно разделяемый объект. Подробнее...
| Заголовок: | #include <QExplicitlySharedDataPointer> |
| qmake: | QT += core |
| С момента: | Qt 4.4 |
Примечание: Все функции в этом классе являются реентерабельными.
Типы публичного доступа
| typedef | Type |
Функции публичного доступа
| QExplicitlySharedDataPointer() | |
| QExplicitlySharedDataPointer(T *data) | |
| QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<T> &o) | |
| QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<X> &o) | |
| QExplicitlySharedDataPointer(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=(const QExplicitlySharedDataPointer<T> &o) |
| QExplicitlySharedDataPointer<T> & | operator=(T *o) |
| QExplicitlySharedDataPointer<T> & | operator=(QExplicitlySharedDataPointer<T> &&other) |
| bool | operator==(const QExplicitlySharedDataPointer<T> &other) const |
| bool | operator==(const T *ptr) const |
Защищенные функции
| T * | clone() |
Подробное описание
Класс QExplicitlySharedDataPointer представляет указатель на явно разделяемый объект.
QExplicitlySharedDataPointer<T> упрощает создание собственных классов с явным разделением. QExplicitlySharedDataPointer реализует безопасную для потоков подсчет ссылок, гарантируя, что добавление QExplicitlySharedDataPointers в ваши реентерабельные классы не сделает их нереентерабельными.
За исключением одного существенного различия, QExplicitlySharedDataPointer аналогичен QSharedDataPointer. Главное различие заключается в том, что члены QExplicitlySharedDataPointer не выполняют автоматическую операцию копирования при записи (detach()), которую неконстантные члены QSharedDataPointer выполняют перед разрешением изменения разделяемого объекта данных. Функция detach() доступна, но если вам действительно нужно отсоединиться, вы должны вызвать её самостоятельно. Это означает, что QExplicitlySharedDataPointers ведут себя как обычные указатели C++, за исключением того, что подсчет ссылок и удаление разделяемого объекта данных до тех пор, пока счетчик ссылок не станет равным 0, предотвращают проблему «висящего указателя».
Полезно сравнить QExplicitlySharedDataPointer с QSharedDataPointer на примере. Рассмотрим пример Employee в QSharedDataPointer, измененный для использования явного разделения, как объяснено в обсуждении Неявное против явного разделения.
Обратите внимание, что если вы используете этот класс, но обнаруживаете, что часто вызываете detach(), вам, вероятно, следует использовать QSharedDataPointer вместо него.
В документации по методам d указатель всегда относится к внутреннему указателю на разделяемый объект данных.
См. также QSharedData и QSharedDataPointer.
Документация по типу члена
typedef QExplicitlySharedDataPointer::Type
Это тип разделяемого объекта данных. d указатель указывает на объект этого типа.
Документация по функциям члена
QExplicitlySharedDataPointer::QExplicitlySharedDataPointer()
Создает QExplicitlySharedDataPointer, инициализированный нулевым d указателем.
QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(T *data)
Создает QExplicitlySharedDataPointer с d указателем, установленным на data, и увеличивает счетчик ссылок data.
QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<T> &o)
Этот стандартный конструктор копирования устанавливает d указатель объекта this на d указатель в o и увеличивает счетчик ссылок разделяемого объекта данных.
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(QExplicitlySharedDataPointer<T> &&o)
Создаёт экземпляр QExplicitlySharedDataPointer, позволяя ему указывать на тот же объект, на который указывал o.
Эта функция была добавлена в Qt 5.2.
QExplicitlySharedDataPointer::~QExplicitlySharedDataPointer()
Уменьшает счётчик ссылок на общий объект данных. Если счётчик ссылок становится равным 0, общий объект данных удаляется. Тогда и this уничтожается.
[protected] T *QExplicitlySharedDataPointer::clone()
Создаёт и возвращает глубокую копию текущих данных. Эта функция вызывается функцией detach(), когда счётчик ссылок больше 1, для создания новой копии. Эта функция использует operator 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 не выполняет автоматические операции копирования при записи, которые выполняют члены QSharedDataPointer, detach() не вызывается автоматически нигде в членах этого класса. Если вы обнаруживаете, что вызываете detach() везде в своём коде, рассмотрите использование QSharedDataPointer вместо него.
void QExplicitlySharedDataPointer::reset()
Сбрасывает this в значение null. То есть, эта функция устанавливает указатель d для this в 0, но сначала уменьшает счётчик ссылок на общий объект данных и удаляет общий объект данных, если счётчик ссылок стал равным 0.
void QExplicitlySharedDataPointer::swap(QExplicitlySharedDataPointer<T> &other)
Обменивает указатель явно разделяемых данных текущего экземпляра с указателем явно разделяемых данных в other.
T *QExplicitlySharedDataPointer::take()
Возвращает указатель на общий объект и сбрасывает this в значение null. То есть, эта функция устанавливает указатель d для this в nullptr.
Эта функция была добавлена в Qt 5.12.
bool QExplicitlySharedDataPointer::operator bool() const
Возвращает true, если указатель d для this не равен null.
bool QExplicitlySharedDataPointer::operator!() const
Возвращает true, если указатель d для this равен null.
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=(const QExplicitlySharedDataPointer<T> &o)
Устанавливает указатель d для this в указатель d для o и увеличивает счётчик ссылок на общий объект данных. Счётчик ссылок на старый общий объект данных this уменьшается. Если счётчик ссылок на старый общий объект данных становится равным 0, старый общий объект данных удаляется.
QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(T *o)
Устанавливает указатель d для this в o и увеличивает счётчик ссылок o. Счётчик ссылок на старый общий объект данных this уменьшается. Если счётчик ссылок на старый общий объект данных становится равным 0, старый общий объект данных удаляется.
QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(QExplicitlySharedDataPointer<T> &&other)
Перемещает присваивание other этому экземпляру QExplicitlySharedDataPointer.
Эта функция была добавлена в Qt 5.2.
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.12/qexplicitlyshareddatapointer.html