QExplicitlySharedDataPointer Class

template <typename T> class QExplicitlySharedDataPointer

Die Klasse QExplicitlySharedDataPointer stellt einen Zeiger auf ein explizit freigegebenes Objekt dar. Mehr...

Kopfzeile: #include <QExplicitlySharedDataPointer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

Diese Klasse ist stark vergleichbar.

Diese Klasse ist stark vergleichbar mit T* und std::nullptr_t.

Hinweis: Alle Funktionen in dieser Klasse sind reentrant.

Öffentliche Typen

Öffentliche Funktionen

QExplicitlySharedDataPointer()
QExplicitlySharedDataPointer(T *data)
QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<X> &o)
QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<T> &o)
QExplicitlySharedDataPointer(QExplicitlySharedDataPointer<T> &&o)
~QExplicitlySharedDataPointer()
const T *constData() const
T *data() const
void detach()
(since 6.0) T *get() const
(since 6.0) 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=(QExplicitlySharedDataPointer<T> &&other)
QExplicitlySharedDataPointer<T> &operator=(T *o)
QExplicitlySharedDataPointer<T> &operator=(const QExplicitlySharedDataPointer<T> &o)

Geschützte Funktionen

T *clone()
bool operator!=(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)
bool operator!=(const T *const &lhs, const QExplicitlySharedDataPointer<T> &rhs)
bool operator==(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)
bool operator==(const T *const &lhs, const QExplicitlySharedDataPointer<T> &rhs)

Detaillierte Beschreibung

QExplicitlySharedDataPointer<T> macht das Schreiben eigener explizit gemeinsam genutzter Klassen einfach. QExplicitlySharedDataPointer implementiert Thread-sicheres Referenzzählen und stellt damit sicher, dass das Hinzufügen von QExplicitlySharedDataPointers zu Ihren reentranten Klassen diese nicht nicht-reentrant macht.

Bis auf einen großen Unterschied ist QExplicitlySharedDataPointer genau wie QSharedDataPointer. Der große Unterschied besteht darin, dass die Mitgliedsfunktionen von QExplicitlySharedDataPointer nicht die automatische Kopieroperation beim Schreiben (detach()) durchführen, die die nicht-konstanten Mitglieder von QSharedDataPointer durchführen, bevor sie zulassen, dass das gemeinsame Datenobjekt geändert wird. Es gibt eine detach()-Funktion, aber wenn Sie detach() wirklich nutzen wollen, müssen Sie sie selbst aufrufen. Das bedeutet, dass sich QExplicitlySharedDataPointer wie reguläre C++-Zeiger verhalten, mit der Ausnahme, dass sie das Problem der baumelnden Zeiger vermeiden, indem sie eine Referenzzählung durchführen und das gemeinsame Datenobjekt nicht löschen, bevor die Referenzzählung 0 ist.

Es ist sehr aufschlussreich, QExplicitlySharedDataPointer mit QSharedDataPointer zu vergleichen, um ein Beispiel zu geben. Betrachten Sie die Klasse Employee example in QSharedDataPointer, die so modifiziert wurde, dass sie explizites Sharing verwendet, wie in der Diskussion Implicit vs Explicit Sharing erläutert.

Beachten Sie, dass Sie, wenn Sie diese Klasse verwenden, aber feststellen, dass Sie detach() häufig aufrufen, wahrscheinlich stattdessen QSharedDataPointer verwenden sollten.

In der Dokumentation der Mitgliedsfunktionen bezieht sich d pointer immer auf den internen Zeiger auf das gemeinsam genutzte Datenobjekt.

Siehe auch QSharedData und QSharedDataPointer.

Dokumentation der Mitgliedstypen

QExplicitlySharedDataPointer::Type

Dies ist der Typ des gemeinsamen Datenobjekts. Der Zeiger d zeigt auf ein Objekt dieses Typs.

Dokumentation der Mitgliedsfunktionen

[noexcept] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer()

Konstruiert einen QExplicitlySharedDataPointer, initialisiert mit nullptr als d-Zeiger.

[explicit noexcept] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(T *data)

Konstruiert einen QExplicitlySharedDataPointer mit dem Zeiger d, der auf data gesetzt ist, und erhöht die Referenzanzahl von data.

[noexcept] template <typename X> QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<X> &o)

Dieser Kopierkonstruktor unterscheidet sich insofern, als dass o ein anderer Typ eines explizit gemeinsam genutzten Datenzeigers sein kann, der jedoch ein kompatibles gemeinsam genutztes Datenobjekt hat.

Standardmäßig wird der d-Zeiger von o (vom Typ X *) implizit in den Typ T * konvertiert; das Ergebnis dieser Konvertierung wird als d-Zeiger von this gesetzt, und die Referenzanzahl des gemeinsamen Datenobjekts wird erhöht.

[noexcept] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<T> &o)

Dieser Standard-Kopierkonstruktor setzt den d-Zeiger von this auf den d-Zeiger in o und erhöht die Referenzanzahl des gemeinsamen Datenobjekts.

[noexcept] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(QExplicitlySharedDataPointer<T> &&o)

Move-konstruiert eine QExplicitlySharedDataPointer-Instanz, die auf das gleiche Objekt zeigt, auf das o gezeigt hat.

QExplicitlySharedDataPointer::~QExplicitlySharedDataPointer()

Verringert die Referenzanzahl des gemeinsamen Datenobjekts. Wenn der Referenzzähler 0 wird, wird das gemeinsame Datenobjekt gelöscht. Anschließend wird es zerstört.

[protected] T *QExplicitlySharedDataPointer::clone()

Erzeugt eine tiefe Kopie der aktuellen Daten und gibt sie zurück. Diese Funktion wird von detach() aufgerufen, wenn die Referenzanzahl größer als 1 ist, um die neue Kopie zu erstellen. Diese Funktion verwendet den Operator new und ruft den Kopierkonstruktor des Typs T auf.

Siehe QSharedDataPointer<T>::clone() für eine Erklärung, wie man sie benutzt.

[noexcept] const T *QExplicitlySharedDataPointer::constData() const

Gibt einen Konstantenzeiger auf das gemeinsame Datenobjekt zurück.

Siehe auch data().

[noexcept] T *QExplicitlySharedDataPointer::data() const

Gibt einen Zeiger auf das gemeinsame Datenobjekt zurück.

void QExplicitlySharedDataPointer::detach()

Wenn die Referenzanzahl des gemeinsamen Datenobjekts größer als 1 ist, erstellt diese Funktion eine tiefe Kopie des gemeinsamen Datenobjekts und setzt den d-Zeiger dieses Objekts auf die Kopie.

Da QExplicitlySharedDataPointer nicht die automatische Kopie bei Schreiboperationen durchführt, die Mitglieder von QSharedDataPointer durchführen, wird detach() nirgendwo in den Mitgliedsfunktionen dieser Klasse automatisch aufgerufen. Wenn Sie feststellen, dass Sie detach() überall in Ihrem Code aufrufen, sollten Sie stattdessen QSharedDataPointer verwenden.

[noexcept, since 6.0] T *QExplicitlySharedDataPointer::get() const

Dasselbe wie data(). Diese Funktion wird aus Gründen der STL-Kompatibilität bereitgestellt.

Diese Funktion wurde in Qt 6.0 eingeführt.

[noexcept, since 6.0] void QExplicitlySharedDataPointer::reset(T *ptr = nullptr)

Setzt den d-Zeiger von this auf ptr und erhöht den Referenzzähler von ptr, wenn ptr nicht nullptr ist. Der Referenzzähler des alten gemeinsamen Datenobjekts wird dekrementiert, und das Objekt wird gelöscht, wenn der Referenzzähler 0 erreicht.

Diese Funktion wurde in Qt 6.0 eingeführt.

[noexcept] void QExplicitlySharedDataPointer::swap(QExplicitlySharedDataPointer<T> &other)

Tauscht diesen explizit freigegebenen Datenzeiger mit other aus. Dieser Vorgang ist sehr schnell und schlägt nie fehl.

[noexcept] T *QExplicitlySharedDataPointer::take()

Gibt einen Zeiger auf das gemeinsam genutzte Objekt zurück und setzt dieses auf nullptr zurück. (Das heißt, diese Funktion setzt den d-Zeiger von this auf nullptr.)

Hinweis: Der Referenzzähler des zurückgegebenen Objekts wird nicht dekrementiert. Diese Funktion kann zusammen mit dem Konstruktor verwendet werden, der ein QAdoptSharedDataTag Tag-Objekt annimmt, um das gemeinsame Datenobjekt ohne zwischengeschaltete atomare Operationen zu übertragen.

[noexcept] bool QExplicitlySharedDataPointer::operator bool() const

Gibt true zurück, wenn der d-Zeiger von this nicht null ist.

[noexcept] bool QExplicitlySharedDataPointer::operator!() const

Gibt true zurück, wenn der d-Zeiger von this nullptr ist.

T &QExplicitlySharedDataPointer::operator*() const

Ermöglicht den Zugriff auf die Mitglieder des gemeinsamen Datenobjekts.

[noexcept] T *QExplicitlySharedDataPointer::operator->()

Ermöglicht den Zugriff auf die Mitglieder des gemeinsamen Datenobjekts.

[noexcept] T *QExplicitlySharedDataPointer::operator->() const

Bietet konstanten Zugriff auf die Mitglieder des gemeinsamen Datenobjekts.

[noexcept] QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(QExplicitlySharedDataPointer<T> &&other)

Verschieben - weist other dieser QExplicitlySharedDataPointer Instanz zu.

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

Setzt den d-Zeiger von this auf o und erhöht die Referenzanzahl von o. Der Referenzzähler des alten gemeinsamen Datenobjekts von this wird dekrementiert. Wenn der Referenzzähler des alten gemeinsamen Datenobjekts 0 wird, wird das alte gemeinsame Datenobjekt gelöscht.

[noexcept] QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(const QExplicitlySharedDataPointer<T> &o)

Setzt den d-Zeiger von this auf den d-Zeiger von o und erhöht die Referenzanzahl des gemeinsamen Datenobjekts. Der Referenzzähler des alten gemeinsamen Datenobjekts von this wird dekrementiert. Wenn der Referenzzähler des alten gemeinsamen Datenobjekts 0 wird, wird das alte gemeinsame Datenobjekt gelöscht.

Verwandte Nicht-Mitglieder

[noexcept] bool operator!=(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)

Gibt true zurück, wenn lhs und rhs nicht denselben d-Zeiger haben.

[noexcept] bool operator!=(const T *const &lhs, const QExplicitlySharedDataPointer<T> &rhs)

Gibt true zurück, wenn der d-Zeiger von rhs nicht lhs ist.

[noexcept] bool operator==(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)

Gibt true zurück, wenn lhs und rhs denselben d-Zeiger haben.

[noexcept] bool operator==(const T *const &lhs, const QExplicitlySharedDataPointer<T> &rhs)

Gibt true zurück, wenn der d-Zeiger von rhs lhs ist.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.