QExplicitlySharedDataPointer Class

template <typename T> class QExplicitlySharedDataPointer

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

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 を比較することは有益です。QSharedDataPointerEmployee example を、Implicit vs Explicit Sharing で説明されているように、明示的共有を使用するように変更して考えてみましょう。

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

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

QSharedData およびQSharedDataPointerも参照のこと

メンバ型ドキュメント

QExplicitlySharedDataPointer::Type

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

メンバ関数ドキュメント

[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 を異なるタイプの明示的共有データポインタにすることができますが、互換性のある共有データオブジェクトを持つという点で異なります。

デフォルトでは、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)

この標準コピーコンストラクタは、thisd ポインタを 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()

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

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

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

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

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

thisd ポインタが 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ポインタを 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 を返す。

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。