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

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 *ptr, const QExplicitlySharedDataPointer<T> &rhs)
bool operator==(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)
bool operator==(const T *ptr, 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 erlauben, dass das gemeinsam genutzte 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 QExplicitlySharedDataPointer sich wie normale C++-Zeiger verhalten, mit der Ausnahme, dass sie das Problem der baumelnden Zeiger vermeiden, indem sie eine Referenzzählung durchführen und das gemeinsam genutzte Datenobjekt erst löschen, wenn 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 der Referenzzähler des gemeinsamen Datenobjekts wird erhöht.

Wenn jedoch das Makro QT_ENABLE_QEXPLICITLYSHAREDDATAPOINTER_STATICCAST definiert wird, bevor der Header QExplicitlySharedDataPointer eingefügt wird, dann wird der d-Zeiger von o in den Typ static_cast umgewandelt ( T *). Das Ergebnis des Casts wird dann als d-Zeiger dieses Typs gesetzt, und der Referenzzähler des gemeinsam genutzten Datenobjekts wird inkrementiert.

Warnung: Sich auf solche static_cast zu verlassen ist potentiell gefährlich, weil es Code wie diesen kompilieren lässt:

    QExplicitlySharedDataPointer<Base> base(new Base);
    QExplicitlySharedDataPointer<Derived> derived(base); // !!! DANGER !!!

Ab Qt 5.4 ist der Cast standardmäßig deaktiviert. Es ist möglich, ihn wieder zu aktivieren, indem man das QT_ENABLE_QEXPLICITLYSHAREDDATAPOINTER_STATICCAST Makro definiert, und somit zu ermöglichen, dass alter Code (der sich auf diese Funktion verlassen hat) ohne Änderungen kompiliert werden kann.

Hinweis: Die Verwendung des Makros QT_ENABLE_QEXPLICITLYSHAREDDATAPOINTER_STATICCAST ist veraltet. Das Makro wird in einer zukünftigen Version von Qt entfernt werden.

[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()

Erstellt 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 *ptr, const QExplicitlySharedDataPointer<T> &rhs)

Gibt true zurück, wenn der d-Zeiger von rhs nicht ptr 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 *ptr, const QExplicitlySharedDataPointer<T> &rhs)

Gibt true zurück, wenn der d-Zeiger von rhs ptr 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.