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