Spec-Zone.ru › Qt 5.12

Класс QExplicitlySharedDataPointer

Класс QExplicitlySharedDataPointer представляет указатель на явно разделяемый объект. Подробнее...

Заголовок: #include <QExplicitlySharedDataPointer>
qmake: QT += core
С момента: Qt 4.4
  • Список всех членов, включая унаследованные

Примечание: Все функции в этом классе являются реентерабельными.

Типы публичного доступа

typedef Type

Функции публичного доступа

QExplicitlySharedDataPointer()
QExplicitlySharedDataPointer(T *data)
QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<T> &o)
QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<X> &o)
QExplicitlySharedDataPointer(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=(const QExplicitlySharedDataPointer<T> &o)
QExplicitlySharedDataPointer<T> & operator=(T *o)
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 вместо него.

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

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

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

typedef QExplicitlySharedDataPointer::Type

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

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

QExplicitlySharedDataPointer::QExplicitlySharedDataPointer()

Создает QExplicitlySharedDataPointer, инициализированный нулевым d указателем.

QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(T *data)

Создает QExplicitlySharedDataPointer с d указателем, установленным на data, и увеличивает счетчик ссылок data.

QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<T> &o)

Этот стандартный конструктор копирования устанавливает d указатель объекта this на d указатель в o и увеличивает счетчик ссылок разделяемого объекта данных.

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(QExplicitlySharedDataPointer<T> &&o)

Создаёт экземпляр QExplicitlySharedDataPointer, позволяя ему указывать на тот же объект, на который указывал o.

Эта функция была добавлена в Qt 5.2.

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 в значение null. То есть, эта функция устанавливает указатель d для this в 0, но сначала уменьшает счётчик ссылок на общий объект данных и удаляет общий объект данных, если счётчик ссылок стал равным 0.

void QExplicitlySharedDataPointer::swap(QExplicitlySharedDataPointer<T> &other)

Обменивает указатель явно разделяемых данных текущего экземпляра с указателем явно разделяемых данных в other.

T *QExplicitlySharedDataPointer::take()

Возвращает указатель на общий объект и сбрасывает this в значение null. То есть, эта функция устанавливает указатель d для this в nullptr.

Эта функция была добавлена в Qt 5.12.

bool QExplicitlySharedDataPointer::operator bool() const

Возвращает true, если указатель d для this не равен null.

bool QExplicitlySharedDataPointer::operator!() const

Возвращает true, если указатель d для this равен null.

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=(const QExplicitlySharedDataPointer<T> &o)

Устанавливает указатель d для this в указатель d для o и увеличивает счётчик ссылок на общий объект данных. Счётчик ссылок на старый общий объект данных this уменьшается. Если счётчик ссылок на старый общий объект данных становится равным 0, старый общий объект данных удаляется.

QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(T *o)

Устанавливает указатель d для this в o и увеличивает счётчик ссылок o. Счётчик ссылок на старый общий объект данных this уменьшается. Если счётчик ссылок на старый общий объект данных становится равным 0, старый общий объект данных удаляется.

QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(QExplicitlySharedDataPointer<T> &&other)

Перемещает присваивание other этому экземпляру QExplicitlySharedDataPointer.

Эта функция была добавлена в Qt 5.2.

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.12/qexplicitlyshareddatapointer.html

Spec-Zone.ru

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