Класс QExplicitlySharedDataPointer
шаблон <typename T> класс QExplicitlySharedDataPointerКласс QExplicitlySharedDataPointer представляет указатель на явно разделяемый объект. Подробнее...
| Заголовок: | #include <QExplicitlySharedDataPointer> |
| qmake: | QT += core |
| С тех пор: | Qt 4.4 |
Этот класс был представлен в Qt 4.4.
Примечание: Все функции в этом классе являются реентерабельными.
Типы public
| typedef | Type |
Public Functions
| 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 вместо этого.
END_OF_DOCUMENT_MARKERВ документации по членам функции, указатель d всегда относится к внутреннему указателю на объект общих данных.
См. также QSharedData и QSharedDataPointer.
Документация по типам членов
typedef QExplicitlySharedDataPointer::Type
Это тип объекта общих данных. Указатель d указывает на объект этого типа.
Документация по членам-функциям
QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(QExplicitlySharedDataPointer<T> &&o)
Создаёт экземпляр QExplicitlySharedDataPointer в режиме перемещения, заставив его указывать на тот же объект, на который указывал o.
Эта функция была добавлена в Qt 5.2.
template <typename X> 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
Возвращает указатель const на общий объект данных.
См. также data().
T *QExplicitlySharedDataPointer::data() const
Возвращает указатель на общий объект данных.
void QExplicitlySharedDataPointer::detach()
Если счётчик ссылок на общий объект данных больше 1, эта функция создаёт глубокую копию общего объекта данных и устанавливает указатель d объекта this на копию.
Поскольку QExplicitlySharedDataPointer не выполняет автоматические операции копирования при записи, которые выполняют члены 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
Обеспечивает доступ 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.15/qexplicitlyshareddatapointer.html