QExplicitlySharedDataPointer Class

template <typename T> class QExplicitlySharedDataPointer

QExplicitlySharedDataPointer クラスは、明示的に共有されたオブジェクトへのポインタを表します。詳細...

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

注意:このクラスの関数はすべてリエントラントです。

パブリック型

パブリック関数

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)

保護された関数

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 はスレッドセーフな参照カウントを実装しており、リエントラントなクラスに QExplicitlySharedDataPointer を追加してもリエントラントでなくなることはありません。

1つの大きな違いを除けば、QExplicitlySharedDataPointer はQSharedDataPointer と同じです。その大きな違いとは、QExplicitlySharedDataPointerのメンバ関数は、共有データ・オブジェクトの変更を許可する前に、QSharedDataPointer の非定数メンバが行う書き込み時の自動コピーdetach())を行わないということです。利用可能なdetach ()関数がありますが、本当にdetach ()したい場合は、自分で呼び出す必要があります。つまり、QExplicitlySharedDataPointersは通常のC++ポインタと同じように動作しますが、参照カウントを行い、参照カウントが0になるまで共有データ・オブジェクトを削除しないことで、ダングリング・ポインタの問題を回避しています。

例としてQExplicitlySharedDataPointerとQSharedDataPointer を比較することは有益です。QSharedDataPointerEmployee example を、Implicit vs Explicit Sharing で説明されているように、明示的共有を使用するように変更して考えてみましょう。

このクラスを使用しているにもかかわらず、detach() を頻繁に呼び出す場合は、おそらくQSharedDataPointer を代わりに使用する必要があることに注意してください。

メンバ関数のドキュメントでは、d ポインタは常に共有データ・オブジェクトへの内部ポインタを指します。

QSharedData およびQSharedDataPointerも参照してください

メンバ型ドキュメント

QExplicitlySharedDataPointer::Type

これは共有データ・オブジェクトの型である。dポインタはこの型のオブジェクトを指す。

メンバ関数ドキュメント

[noexcept] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer()

nullptrd ポインタとして初期化された QExplicitlySharedDataPointer を構築します。

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

d ポインタが data に設定された QExplicitlySharedDataPointer を構築し、data の参照カウントをインクリメントします。

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

このコピー・コンストラクタは、o を異なる型の明示的共有データ・ポインタとすることができるが、互換性のある共有データ・オブジェクトを持つことができるという点で異なる。

デフォルトでは、oX * 型)のdポインタは暗黙のうちにT * 型に変換される。この変換結果はthisの dポインタとして設定され、共有データオブジェクトの参照カウントがインクリメントされる。

しかし、QExplicitlySharedDataPointer ヘッダーを含む前にマクロQT_ENABLE_QEXPLICITLYSHAREDDATAPOINTER_STATICCAST が定義された場合、odポインターは static_cast を経てT * 型に変換される。そして、キャストの結果がこの dポインタとして設定され、共有データ・オブジェクトの参照カウントがインクリメントされる。

警告: このようなstatic_cast に依存することは潜在的に危険です:

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

Qt 5.4 以降、キャストはデフォルトで無効になっています。Qt 5.4以降、キャストはデフォルトで無効になっています。QT_ENABLE_QEXPLICITLYSHAREDDATAPOINTER_STATICCAST マクロを定義することで、キャストを有効に戻すことができ、(この機能に依存していた)古いコードを修正せずにコンパイルできるようになります。

注: QT_ENABLE_QEXPLICITLYSHAREDDATAPOINTER_STATICCAST マクロの使用は非推奨です。このマクロは Qt の将来のバージョンで削除される予定です。

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

この標準的なコピーコンストラクタは、thisの dポインタを odポインタに設定し、共有データオブジェクトの参照カウントをインクリメントする。

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

Move-QExplicitlySharedDataPointerインスタンスを構築し、o が指していたのと同じオブジェクトを指すようにする。

QExplicitlySharedDataPointer::~QExplicitlySharedDataPointer()

共有データ・オブジェクトの参照カウントを減少させる。参照カウントが0になると、共有データオブジェクトは削除される。その後破棄されます。

[protected] T *QExplicitlySharedDataPointer::clone()

現在のデータのディープコピーを作成し、返す。この関数は、新しいコピーを作成するために、参照カウントが 1 より大きいときにdetach() から呼び出される。この関数はnew 演算子を使用し、T 型のコピーコンストラクタを呼び出します。

使い方の説明はQSharedDataPointer<T>::clone() を参照。

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

共有データオブジェクトへの const ポインタを返します。

data()も参照してください

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

共有データオブジェクトへのポインタを返します。

void QExplicitlySharedDataPointer::detach()

共有データ・オブジェクトの参照カウントが1より大きい場合、この関数は共有データ・オブジェクトのディープ・コピーを作成し、その dポインタをコピーに設定する。

QSharedDataPointer のメンバが行うような書き込み操作時の自動コピーはQExplicitlySharedDataPointer では行わないため、このクラスのメンバ関数のどこでも自動的に detach() が呼び出されることはありません。コードのあちこちでdetach()を呼び出している場合は、代わりにQSharedDataPointer

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

data() と同じ。この関数は STL との互換性のために提供されています。

この関数は Qt 6.0 で導入されました。

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

この dポインタを ptr にセットし、ptrnullptr でない場合、ptr の参照カウントをインクリメントする。古い共有データ・オブジェクトの参照カウントがデクリメントされ、参照カウントが 0 になるとオブジェクトが削除されます。

この関数は Qt 6.0 で導入されました。

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

この明示的に共有されたデータ・ポインターをother と交換する。この操作は非常に高速で、失敗することはない。

[noexcept] T *QExplicitlySharedDataPointer::take()

共有オブジェクトへのポインタを返し、this を nullptr にリセットする(つまり、この関数はthisd ポインタを nullptr にセットする)。

注意: 返されたオブジェクトの参照カウントはデクリメントされません。この関数は、QAdoptSharedDataTag タグ・オブジェクトを受け取るコンストラクタと一緒に使用することで、アトミック操作を介さずに共有データ・オブジェクトを転送することができます。

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

thisd ポインタがNULL でない場合、true を返す。

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

thisの dポインタが nullptr の場合、true を返す。

T &QExplicitlySharedDataPointer::operator*() const

共有データ・オブジェクトのメンバーへのアクセスを提供します。

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

共有データ・オブジェクトのメンバーへのアクセスを提供します。

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

共有データオブジェクトのメンバへの定数アクセスを提供する。

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

Move-other をこのQExplicitlySharedDataPointer インスタンスに割り当てる。

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

thisd ポインタを o に設定し、o の参照カウントをインクリメントする。thisの古い共有データ・オブジェクトの参照カウントがデクリメントされる。古い共有データ・オブジェクトの参照カウントが0になると、古い共有データ・オブジェクトは削除される。

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

thisの dポインタを odポインタに設定し、共有データ・オブジェクトの参照カウントをインクリメントする。thisの古い共有データオブジェクトの参照カウントがデクリメントされる。古い共有データ・オブジェクトの参照カウントが0になると、古い共有データ・オブジェクトは削除される。

関連する非会員

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

lhsrhs が同じd ポインタない場合、true を返す。

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

rhsd ポインタが ptrない場合、true を返す。

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

lhsrhs が同じd ポインタの場合、true を返す。

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

rhsd ポインタが ptr の場合、true を返す。

© 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.