Класс 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 не выполняют автоматическую операцию копирования при записи (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, чтобы создать новую копию. Эта функция использует 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 в нулевое значение — то есть, эта функция устанавливает указатель 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.13/qexplicitlyshareddatapointer.html