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 |
注意:このクラスの関数はすべてリエントラントです。
パブリック型
パブリック関数
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 を比較することは有益です。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 の参照カウントをインクリメントします。
[noexcept]
template <typename X> QExplicitlySharedDataPointer::QExplicitlySharedDataPointer(const QExplicitlySharedDataPointer<X> &o)
このコピー・コンストラクタは、o を異なる型の明示的共有データ・ポインタとすることができるが、互換性のある共有データ・オブジェクトを持つことができるという点で異なる。
デフォルトでは、o (X *
型)のdポインタは暗黙のうちにT *
型に変換される。この変換結果はthisの dポインタとして設定され、共有データオブジェクトの参照カウントがインクリメントされる。
しかし、QExplicitlySharedDataPointer
ヘッダーを含む前にマクロQT_ENABLE_QEXPLICITLYSHAREDDATAPOINTER_STATICCAST
が定義された場合、o のdポインターは 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ポインタを o のdポインタに設定し、共有データオブジェクトの参照カウントをインクリメントする。
[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 にセットし、ptr がnullptr
でない場合、ptr の参照カウントをインクリメントする。古い共有データ・オブジェクトの参照カウントがデクリメントされ、参照カウントが 0 になるとオブジェクトが削除されます。
この関数は Qt 6.0 で導入されました。
[noexcept]
void QExplicitlySharedDataPointer::swap(QExplicitlySharedDataPointer<T> &other)
この明示的に共有されたデータ・ポインターをother と交換する。この操作は非常に高速で、失敗することはない。
[noexcept]
T *QExplicitlySharedDataPointer::take()
共有オブジェクトへのポインタを返し、this を nullptr
にリセットする(つまり、この関数はthisのd ポインタを nullptr
にセットする)。
注意: 返されたオブジェクトの参照カウントはデクリメントされません。この関数は、QAdoptSharedDataTag タグ・オブジェクトを受け取るコンストラクタと一緒に使用することで、アトミック操作を介さずに共有データ・オブジェクトを転送することができます。
[noexcept]
bool QExplicitlySharedDataPointer::operator bool() const
thisのd ポインタが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)
thisのd ポインタを o に設定し、o の参照カウントをインクリメントする。thisの古い共有データ・オブジェクトの参照カウントがデクリメントされる。古い共有データ・オブジェクトの参照カウントが0になると、古い共有データ・オブジェクトは削除される。
[noexcept]
QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(const QExplicitlySharedDataPointer<T> &o)
thisの dポインタを o のdポインタに設定し、共有データ・オブジェクトの参照カウントをインクリメントする。thisの古い共有データオブジェクトの参照カウントがデクリメントされる。古い共有データ・オブジェクトの参照カウントが0になると、古い共有データ・オブジェクトは削除される。
関連する非会員
[noexcept]
bool operator!=(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)
lhs とrhs が同じd ポインタでない場合、true
を返す。
[noexcept]
bool operator!=(const T *ptr, const QExplicitlySharedDataPointer<T> &rhs)
rhs のd ポインタが ptr でない場合、true
を返す。
[noexcept]
bool operator==(const QExplicitlySharedDataPointer<T> &lhs, const QExplicitlySharedDataPointer<T> &rhs)
lhs とrhs が同じd ポインタの場合、true
を返す。
[noexcept]
bool operator==(const T *ptr, const QExplicitlySharedDataPointer<T> &rhs)
rhs のd ポインタが 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.