問題タブ [qshareddata]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - QObject から継承しながら QSharedData を使用できますか?
Qt でプライベート実装 (暗黙の共有) を非表示にするにはどうすればよいですか?
Employee.h ヘッダーに次の Employee.cpp があります。
しかし、EmployeeData をプライベート パーツ、たとえば Employee.cpp に移動すると、次のエラーが表示されます: エラー: 不完全な型 'struct EmployeeData' の無効な使用</p>
ただし、定義を次のように変更すると、正常に動作します。
したがって、 QObject から継承しながら QSharedData を使用できますか?
qt - QSharedData ベースの構造を自動的に生成する方法はありますか?
QSharedData
Qt には、およびを介して参照カウントが統合されたオブジェクトを作成するためのビルトイン サポートがありQSharedDataPointer
ます。すべてうまく機能しますが、そのようなオブジェクトごとに多くのコードを記述する必要がありますQSharedData
。
5 ~ 10 個のフィールドを持つ単純な構造の場合、これには非常に多くのほぼ同じコードが必要です。そのようなクラスの生成を自動化する方法はありますか? たぶん、短い説明を取り、すべてのアクセサーで実装クラスとオブジェクトクラスを自動的に生成するジェネレーターがいくつか存在するのでしょうか?
c++ - プライベート (非表示) QSharedData
呼び出し元から隠したいデータ メンバーを持つクラスがあります (型のヘッダーを含めるとコンパイル時間が大幅に長くなり、このクラスを使用するすべてのプロジェクトでインクルード パスにパスを追加する必要があるため) )。
このクラスはQSharedDataPointer
、このデータを格納するために使用します。このようにして、デフォルトのコピー コンストラクターを使用してコピーできます。
このクラスの基本構造は次のとおりです。
同じヘッダーファイルで(から継承する)を定義せずにこれを行うための巧妙なトリックはありますか? または、データ フィールドを非表示にする他の良い方法はありますか?MySharedClassData
QSharedData
私はすでに の前方宣言を試みましたが、これはうまくいきませんでした (事実にもMySharedClassData
かかわらず)。m_data
private
私が現在できる唯一の解決策は、m_data
として宣言するQSharedDataPointer<QSharedData>
ことですが、アクセスするたびにデータメンバーをキャストする必要があります。より良い解決策はありますか?
c++ - すべてのデータクラスをQSharedDataとして実装し、QSharedDataPointerで使用する必要がありますか?
私はQtの初心者であり、いくつかのデータクラスを作成する必要があります。QSharedDataPointer
例(ここ)のようにこれらすべてのクラスを作成するのは良いアプローチでしょうか、それともこれはオーバーヘッドが大きすぎるのでしょうか(作業量が多いという事実を除けば)?
私のクラスは、以下のクラスと非常によく似ていますEmployee
。1万や数百万ではなく、数百のインスタンスを処理する必要があります。
QSharedData / QShareDataPointerを使用する動機は、手動のメモリ管理を簡素化し、共通のコードスタイルを使用することです。しかし、私がいくつかの警告を監督しているかどうかはまだわかりません。
例から:
qt - QImageコピーオンライト
にQImage
基づいていQSharedData
ますか?Qimage
フォローするpimpl
か?copy on write
たとえば、Qimageを(コピーコンまたは割り当てを介して)コピーすると、ピクセルのディープコピーが作成されますか?
c++ - QSharedDataと継承
を使用しながら型システムを作成しようとしていQSharedData
ます。考え方は単純で、さまざまなデータ型があり、それぞれが基本抽象クラスから派生します。それぞれに実際のデータを格納するために使用したいのですQSharedData
が、派生クラスのそれぞれに異なるデータが格納されます。私は今、最も基本的な例を作ろうとしていますが、いくつか問題があります。
これらが私の基本的な純粋な仮想クラスであるとしましょう。
ここで、単一の値を表すためのクラスを作成するとします(つまり、最小の例として)。基本値クラスから派生しcAtomicValue
ています。また、値を保持するデータクラスも派生しています。
この段階では問題なく動作し、デバッガーで正しいポインターの種類を確認できます。しかし、今は値を設定して取得するための関数を追加したいのですが、その方法がわかりません。セッターを例にとってみましょう。値を設定するには、クラスのメンバーを介してクラスのvalue_
メンバーにアクセスする必要があります。ただし、は基本クラスのポインタ( )を保持しているため、何らかの方法で正しい型()にキャストする必要があります。私はこれをやってみました:cAtomicData
data_
cAtomicValue
data_
cAbstractData
cAtomicData
detach()
基本クラスが純粋な仮想であるために呼び出せず、基本クラスのコピーを作成しようとするため、明らかに機能しません。次に、ポインタ自体をキャストしようとしました。
しかし、invalid static_cast ...
エラーが発生します。
どうすればいいですか、基本的に正しい方法でやっていますか?
c++ - QSharedDataPointer と QSharedData の代替実装
Qt の代替ライブラリで、暗黙の共有のために QSharedDataPointer や QSharedData のようなシステムに出くわした人がいるかどうか疑問に思っていました。
可能であればシステムに余分な依存関係を追加することを避けようとしており、単に私のオプションが何であるか疑問に思っています。
c++ - QSharedData のクラッシュ
Qt 5.2.0 アプリケーションでまれに、かなり一貫したクラッシュが発生し、診断にかなりの時間を費やしていますが、関連していると思われますQSharedData
。アプリケーションは高度にマルチスレッド化されており、これがおそらく問題の一部です。
問題のクラスは次のとおりです。
ここでクラッシュが発生し、 Route を に挿入しますQMap
。
m_lastRouteMap はQMap<quint16, Route>
です。
スタック トレースは次のようになります。
#5 で QMap::insert を実行し、#4 で (Route "=" 演算子を介して) コピーを作成します。#3 で、問題の Qt コードは次のようになります。
「delete old」を押して、dtor の 1 つQDateTime
(実際にはプライベートQTimeZone
メンバー) で seg faulting を実行しています。
私のezspSendUnicast()
メソッドは、クラッシュする前に何十万回も繰り返し実行できます。(valgrindによると)メモリをリークしているとは思いません。ezspSendUnicast() に渡している Route オブジェクトは適切にミューテックスで保護されていると思いますが、何かを見落としている可能性があります (ただしQSharedData
、いずれにせよ、コピー オン ライトに対してはスレッド セーフであると考えていました)。
この問題に取り組む方法についての洞察をいただければ幸いです。