Класс QExplicitlySharedDataPointer
шаблон <typename T> class QExplicitlySharedDataPointerКласс QExplicitlySharedDataPointer представляет указатель на явно совместно используемый объект. Подробнее...
| Заголовок: | #include <QExplicitlySharedDataPointer> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
Примечание: Все функции в этом классе являются перевходными.
Публичные типы
| Тип |
Публичные функции
| 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() |
| T * | get() const |
| void | reset(T *ptr = nullptr) |
| void | swap(QExplicitlySharedDataPointer<T> &other) |
| T * | take() |
| bool | operator bool() const |
| bool | operator!() const |
| T & | operator*() const |
| T * | operator->() |
| T * | operator->() const |
| QExplicitlySharedDataPointer<T> & | operator=(T *o) |
Защищенные функции
| T * | clone() |
Связанные нечлены
| bool | operator!=(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs) |
| bool | operator!=(const T *ptr, const QExplicitlySharedDataPointer<T> &rhs) |
| bool | operator==(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs) |
| bool | operator==(const T *ptr, const QExplicitlySharedDataPointer<T> &rhs) |
Подробное описание
QExplicitlySharedDataPointer<T> упрощает написание собственных классов с явным совместным использованием. QExplicitlySharedDataPointer реализует защищённый от многопоточности счётчик ссылок, гарантируя, что добавление QExplicitlySharedDataPointers в ваши перевходные классы не сделает их неперевходными.
За исключением одного существенного отличия, QExplicitlySharedDataPointer аналогичен QSharedDataPointer. Существенное отличие заключается в том, что методы QExplicitlySharedDataPointer не выполняют автоматическую операцию «копирования при записи» (detach()), которую неконстантные члены QSharedDataPointer выполняют перед разрешением изменения объекта совместно используемых данных. Функция detach() доступна, но если вы действительно хотите выполнить detach(), вы должны вызвать её самостоятельно. Это означает, что QExplicitlySharedDataPointers ведут себя как обычные указатели C++, за исключением того, что, выполняя учёт ссылок и не удаляя объект совместно используемых данных до тех пор, пока счётчик ссылок не станет равным 0, они избегают проблемы «висящего указателя».
Полезно сравнить QExplicitlySharedDataPointer с QSharedDataPointer на примере. Рассмотрим пример Employee в QSharedDataPointer, модифицированный для использования явного совместного использования, как описано в обсуждении Неявное против явного совместного использования.
Обратите внимание, что если вы используете этот класс, но обнаруживаете, что часто вызываете detach(), вам, вероятно, следует использовать QSharedDataPointer вместо него.
В документации к методам указатель d всегда относится к внутреннему указателю на объект совместно используемых данных.
См. также QSharedData и QSharedDataPointer.
Документация по типам членов
QExplicitlySharedDataPointer::Тип
Это тип объекта совместно используемых данных. Указатель d указывает на объект этого типа.
Документация по функциям членов
[since 5.2] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(QExplicitlySharedDataPointer<T> &&o)
Перемещающее создание экземпляра QExplicitlySharedDataPointer, делая его указателем на тот же объект, на который указывал o.
Эта функция была введена в Qt 5.2.
шаблон <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.
[since 5.2] 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() для объяснения использования.
const T *QExplicitlySharedDataPointer::constData() const
Возвращает константный указатель на объект общих данных.
См. также data().
T *QExplicitlySharedDataPointer::data() const
Возвращает указатель на объект общих данных.
void QExplicitlySharedDataPointer::detach()
Если счетчик ссылок объекта общих данных больше 1, эта функция создает глубокую копию объекта общих данных и устанавливает указатель d объекта this на копию.
Так как QExplicitlySharedDataPointer не выполняет автоматические операции «копирования при записи», которые выполняют члены QSharedDataPointer, detach() не вызывается автоматически нигде в функциях-членах этого класса. Если вы обнаруживаете, что вызываете detach() везде в своём коде, рассмотрите использование QSharedDataPointer вместо этого.
[since 6.0] T *QExplicitlySharedDataPointer::get() const
То же, что и data(). Эта функция предоставляется для совместимости со STL.
Эта функция была добавлена в Qt 6.0.
[since 6.0] void QExplicitlySharedDataPointer::reset(T *ptr = nullptr)
Устанавливает указатель d объекта this на ptr и увеличивает счетчик ссылок ptr, если ptr не nullptr. Счетчик ссылок старого объекта общих данных уменьшается, и объект удаляется, если счетчик ссылок достигает 0.
Эта функция была добавлена в Qt 6.0.
void QExplicitlySharedDataPointer::swap(QExplicitlySharedDataPointer<T> &other)
Меняет указатель на явно общий объект данных этого экземпляра с указателем на явно общий объект данных в other.
[since 5.12] T *QExplicitlySharedDataPointer::take()
Возвращает указатель на общий объект и устанавливает this в nullptr. (То есть, эта функция устанавливает указатель d объекта this на nullptr.)
Примечание: Счетчик ссылок возвращенного объекта не будет уменьшен. Эта функция может быть использована вместе с конструктором, принимающим объект QAdoptSharedDataTag, чтобы передать объект общих данных без вмешательства атомарных операций.
Эта функция была добавлена в Qt 5.12.
bool QExplicitlySharedDataPointer::operator bool() const
Возвращает true если указатель d объекта this не равен нулю.
bool QExplicitlySharedDataPointer::operator!() const
Возвращает true если указатель d объекта this равен nullptr.
T &QExplicitlySharedDataPointer::operator*() const
Обеспечивает доступ к членам объекта общих данных.
T *QExplicitlySharedDataPointer::operator->()
Обеспечивает доступ к членам объекта общих данных.
T *QExplicitlySharedDataPointer::operator->() const
Обеспечивает доступ к членам объекта общих данных с константным доступом.
QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(T *o)
Устанавливает указатель d объекта this на o и увеличивает счетчик ссылок o. Счетчик ссылок старого объекта общих данных объекта this уменьшается. Если счетчик ссылок старого объекта общих данных становится равным 0, старый объект общих данных удаляется.
Связанные нечлены
bool operator!=(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)
Возвращает true если lhs и rhs не имеют одинакового указателя d.
bool operator!=(const T *ptr, const QExplicitlySharedDataPointer<T> &rhs)
Возвращает true если указатель d объекта rhs не равен ptr.
bool operator==(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)
Возвращает true если lhs и rhs имеют одинаковый указатель d.
bool operator==(const T *ptr, const QExplicitlySharedDataPointer<T> &rhs)
Возвращает true если указатель d объекта rhs равен ptr.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qexplicitlyshareddatapointer.html