Spec-Zone.ru › Qt 6.0

Класс QExplicitlySharedDataPointer

шаблон <typename T> класс 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 не выполняют автоматическое копирование при записи (copy on write) (detach()), которое выполняют неконстантные члены QSharedDataPointer перед разрешением модификации разделяемого объекта данных. Функция detach() доступна, но если вы действительно хотите выполнить открепление, вы должны вызвать её самостоятельно. Это означает, что QExplicitlySharedDataPointers ведут себя как обычные указатели C++, за исключением того, что, выполняя подсчёт ссылок и не удаляя разделяемый объект данных до тех пор, пока счётчик ссылок не станет равным 0, они избегают проблемы «висящих указателей».

Полезно сравнить QExplicitlySharedDataPointer с QSharedDataPointer на примере. Рассмотрим пример Employee в QSharedDataPointer, измененный для использования явного совместного использования, как объяснено в обсуждении Неявное и явное совместное использование.

Обратите внимание, что если вы используете этот класс, но обнаруживаете, что многократно вызываете detach(), то вам, вероятно, следует использовать QSharedDataPointer вместо него.

В документации по членам функциям, указатель d всегда относится к внутреннему указателю на объект совместных данных.

См. также QSharedData и QSharedDataPointer.

Документация по типам членов

QExplicitlySharedDataPointer::Type

Это тип объекта совместных данных. Указатель d указывает на объект этого типа.

Документация по членам-функциям

[since 5.2] 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 данного объекта, и счетчик ссылок на объект совместных данных увеличивается.

Однако, если макрос QT_ENABLE_QEXPLICITLYSHAREDDATAPOINTER_STATICCAST определен перед включением заголовка QExplicitlySharedDataPointer, то указатель d объекта o подвергается static_cast в тип T *. Результат преобразования затем устанавливается как указатель d данного объекта, и счетчик ссылок на объект совместных данных увеличивается.

Предупреждение: полагаться на такое 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.0/qexplicitlyshareddatapointer.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API