QExplicitlySharedDataPointer Class
template <typename T> class QExplicitlySharedDataPointerQExplicitlySharedDataPointer クラスは、明示的に共有されたオブジェクトへのポインタを表します。詳細...
| ヘッダー: | #include <QExplicitlySharedDataPointer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| 継承元: | QSharedDataPointerBase |
注:このクラスのすべての関数は再入可能である。
QExplicitlySharedDataPointer との比較
| カテゴリ | 比較可能な型 |
|---|---|
| strong | QExplicitlySharedDataPointer の比較カテゴリ比較可能な型strongQExplicitlySharedDataPointer |
| strong | T* および std::nullptr_t。 |
パブリック型
パブリック関数
| 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() |
| 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 *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) |
詳細な説明
QExplicitlySharedDataPointer は、テンプレートパラメータT によって、QSharedData から派生する共有データクラスの型が指定されるテンプレートクラスです。
QExplicitlySharedDataPointer<T> を使用すると、独自の明示的に共有されるクラスを簡単に作成できます。QExplicitlySharedDataPointerはスレッドセーフな参照カウントを実装しており、再入可能なクラスに QExplicitlySharedDataPointer を追加しても、そのクラスが再入不可能になることはありません。
1つの大きな違いを除けば、QExplicitlySharedDataPointerはQSharedDataPointer と全く同じです。その大きな違いは、QExplicitlySharedDataPointerのメンバ関数が、QSharedDataPointer の非constメンバが共有データオブジェクトの変更を許可する前に実行する自動コピー・オン・ライト操作(detach())を行わないことです。detach() 関数は用意されていますが、本当にdetach() を行いたい場合は、自分で呼び出す必要があります。つまり、QExplicitlySharedDataPointer は通常の C++ ポインタと同様に振る舞いますが、参照カウントを行い、参照カウントが 0 になるまで共有データオブジェクトを削除しないことで、ダングリングポインタの問題を回避している点が異なります。
例を用いて、QExplicitlySharedDataPointerとQSharedDataPointer を比較してみると参考になります。QSharedDataPointer にあるEmployee example を、Implicit vs Explicit Sharing での解説に従って明示的な共有を使用するように修正したものを考えてみてください。
なお、このクラスを使用していて、detach() を頻繁に呼び出していることに気づいた場合は、代わりにQSharedDataPointer を使用すべきでしょう。
メンバ関数のドキュメントにおいて、d ポインタは常に共有データオブジェクトへの内部ポインタを指します。
QSharedData およびQSharedDataPointerも参照してください 。
メンバ関数のドキュメント
[noexcept] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer()
nullptr をdポインタとして初期化したQExplicitlySharedDataPointerを構築します。
[explicit noexcept] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(T *data)
d ポインタを`data ` に設定した `QExplicitlySharedDataPointer` を生成し、`data` の参照カウントを 1 増やします。
[noexcept] template <typename X> QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<X> &o)
このコピーコンストラクタの特徴は、o が、明示的に共有されたデータポインタの異なる型であっても、互換性のある共有データオブジェクトを持つものである限り、それを許容する点にあります。
デフォルトでは、o のd ポインタ(型は\a X * )は、暗黙的に\a T * 型に変換されます。この変換の結果がthis のd ポインタに設定され、共有データオブジェクトの参照カウントがインクリメントされます。
[noexcept] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<T> &o)
この標準のコピーコンストラクタは、thisのd ポインタを `o ` 内のd ポインタに設定し、共有データオブジェクトの参照カウントを 1 増やします。
[noexcept] QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(QExplicitlySharedDataPointer<T> &&o)
QExplicitlySharedDataPointerのインスタンスをMoveコンストラクタで生成し、o が指していたのと同じオブジェクトを指すようにします。
QExplicitlySharedDataPointer::~QExplicitlySharedDataPointer()
共有データオブジェクトの参照カウントを1減らします。参照カウントが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 ポインタをそのコピーに設定します。
QExplicitlySharedDataPointer は、QSharedDataPointer のメンバが実行するような書き込み時の自動コピーを行わないため、このクラスのメンバ関数内ではどこでも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)
ptr がnullptr でない場合、このオブジェクト のdポインタを ptr に設定し、ptr の参照カウントを1増やします。古い共有データオブジェクトの参照カウントは1減らされ、参照カウントが0になるとそのオブジェクトは削除されます。
この関数は Qt 6.0 で導入されました。
[noexcept] void QExplicitlySharedDataPointer::swap(QExplicitlySharedDataPointer<T> &other)
この明示的に共有されたデータポインタを、other と交換します。この操作は非常に高速で、失敗することはありません。
[noexcept] T *QExplicitlySharedDataPointer::take()
共有オブジェクトへのポインタを返し、これを nullptr にリセットします(つまり、この関数はthisのd ポインタを nullptr に設定します)。
注: 返されるオブジェクトの参照カウントは 減算されません。この関数は、QAdoptSharedDataTag タグオブジェクトを受け取るコンストラクタと組み合わせて使用することで、原子操作を介さずに共有データオブジェクトを転送することができます。
[noexcept] QExplicitlySharedDataPointer::operator bool() const
このオブジェクトのd ポインタが nullでなければ、true を返します。
[noexcept] bool QExplicitlySharedDataPointer::operator!() const
このオブジェクトのd ポインタが `nullptr` である場合、true を返します。
T &QExplicitlySharedDataPointer::operator*() const
共有データオブジェクトのメンバへのアクセスを提供します。
[noexcept] T *QExplicitlySharedDataPointer::operator->()
共有データオブジェクトのメンバへのアクセスを提供します。
[noexcept] T *QExplicitlySharedDataPointer::operator->() const
共有データオブジェクトのメンバへのconstアクセスを提供します。
[noexcept] QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(QExplicitlySharedDataPointer<T> &&other)
other をこのQExplicitlySharedDataPointer インスタンスに割り当てます。
[noexcept] QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(T *o)
このオブジェクトの d ポインタを`o ` に設定し、o の参照カウントを 1 増やします。このオブジェクトの古い共有データオブジェクトの参照カウントは 1 減らされます。古い共有データオブジェクトの参照カウントが 0 になると、そのオブジェクトは削除されます。
[noexcept] QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(const QExplicitlySharedDataPointer<T> &o)
このオブジェクトのd ポインタを、o のd ポインタに設定し、共有データオブジェクトの参照カウントを 1 増やします。このオブジェクトの古い共有データオブジェクトの参照カウントは 1 減らされます。古い共有データオブジェクトの参照カウントが 0 になると、そのオブジェクトは削除されます。
関連する非メンバー関数
[noexcept] bool operator!=(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)
lhs とrhs のd ポインタが同一でない場合、true を返します。
[noexcept] bool operator!=(const T *const &lhs, const QExplicitlySharedDataPointer<T> &rhs)
rhs のdポインタがlhsでない場合、true を返す。
[noexcept] bool operator==(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)
lhs とrhs が同じd ポインタを指している場合、true を返します。
[noexcept] bool operator==(const T *const &lhs, const QExplicitlySharedDataPointer<T> &rhs)
rhs のdポインタがlhs である場合、true を返します。
© 2026 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.