QExplicitlySharedDataPointer Class
template <typename T> class QExplicitlySharedDataPointerQExplicitlySharedDataPointer クラスは、明示的に共有されたオブジェクトへのポインタを表します。詳細...
Header: | #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()
d ポインタとして nullptr
で初期化された 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()
共有オブジェクトへのポインタを返し、これを 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
共有データ・オブジェクトのメンバへの const アクセスを提供します。
[noexcept]
QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(QExplicitlySharedDataPointer<T> &&other)
このQExplicitlySharedDataPointer インスタンスにother を代入します。
[noexcept]
QExplicitlySharedDataPointer<T> &QExplicitlySharedDataPointer::operator=(T *o)
このインスタンスの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
を返す。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。