問題タブ [pimpl-idiom]
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++ - pimplクラスのデフォルト値を初期化するのに最適な場所は?
私はPImplをかなり広範囲に使用しており、自分が困惑していることに気付いたのは、Pimpl構造体のメンバーを正確に初期化する場所です。オプションは、Private
構造体のコンストラクターを作成してそこで初期化するか、メインクラスのコンストラクターで初期化することです。
myclass.hpp:
myclass.cpp:
Private
現時点では、何らかの理由で新しいオブジェクトを作成したり、それらをコピーしたりする場合を除いて、2つの違いはあまりわかりません。その場合は、オプションAの方が適している可能性があります。また、初期化リスト内の変数を初期化することもできます。しかし、オプションBの方が読みやすく、おそらく保守しやすい傾向があることがわかりました。スケールをどちらかの方向に傾ける可能性のあるものがここにありますか?
c++ - テンプレート化されたピンプル転送
私は一種のテンプレート化された階層に関連する指標をたくさん持っています。
そして、それらによってインデックス付けされたオブジェクトを生成してキャッシュすることになっているクラス。このクラスに pimpl を使用したいのですが、テンプレートを使用して関数呼び出しを実装クラスに転送する方法があるかどうか疑問に思っています。何かのようなもの
c# - pimplイディオムはc#で使用されていますか?
私は C# のバックグラウンドを持ち、最近 C++ の学習を開始しました。私が遭遇したことの 1 つは、pimpl イディオムです。私はいくつかの大企業で C# 開発を行ったことがありますが、これに遭遇したことはありません。
これは間違っているかもしれませんが、ヘッダー ファイルを使用し、部分クラス オプションがないため、C++ では必要であると理解しています。
しかし、C# では、常にクラス ライブラリを使用してアプリケーションを構築していました。ライブラリ コードで何かが変更された場合、それを dll に再コンパイルし、アプリケーション プロジェクトで新しい dll を参照します。
同じことがC++でできない理由がよくわかりません。ピンプルは、私には醜いハックのように見えます。
c++ - C++ Pimpl と純粋な仮想インターフェイスのパフォーマンス
この件に関する投稿がかなりあることは承知していますが、この正確な質問に対する答えを見つけるのに苦労しています.
関数呼び出しの場合、純粋仮想インターフェイスと pimpl のどちらが高速ですか?
一見すると、pimpl を使用すると 1 回ではなく 2 回の関数呼び出しが必要になるため、純粋仮想インターフェイスの方が高速であるように思えます...または、この場合、ある種の巧妙なコンパイラのトリックが引き継がれるのでしょうか?
編集: これらのどれを使用して、非常に頻繁に大量に生成する必要があるいくつかのオブジェクトのシステム依存部分を抽象化するかを決定しようとしています。
編集:
この時点で言う価値があると思いますが、私の問題の根本は、特定のインターフェイスの実装を切り替えることが本当の目的である場合に、複数のプラットフォームでコードを機能させる方法として、Abstract Factory の設計パターンを間違えたことです。実行時に。
c++ - コンパイラは、自明に見えるが自明ではないdtorを最適化/インライン化しようとすると、足元で自分自身を撃ちます。何が間違っているのでしょうか。
私はこの共有pimpl*を持っています。実装オブジェクトを転送宣言し、カスタム実装された共有ポインターオブジェクトを使用して、pimplイディオムを実装します(ここでも、共有セマンティクスを使用します)。凝縮された、それはこのように見えます:
Foo.h
Foo.cpp
さて、(私が思うに)コンパイラは(オブジェクトや他のBar.cpp
オブジェクトを使用する)コンパイル時に本当に賢くなり、次のように文句を言います。Foo
SharedPtr
~SharedPtr<Foo_impl>
と以外に誰が電話をかけている可能性がFoo
ありFooFactory
ますか?それはどこから来て、どうすれば修正できますか?
注:~Foo
仮想化は役に立ちません。これは私にとってさらに不可解です。
* implが共有されているという事実はここでは関係ありません。私は、典型的な「copy-ctor/assignmentメソッドを定義してください」というコメントを避けたいだけです。pimplポインタが共有されることは完全に意図的です。
編集:SharedPtr
インターフェース:
c++ - 名前のない名前空間で変数を宣言する
私の現在の仕事では、変数が cpp ファイルの名前のない名前空間で宣言されており、メンバー変数であるかのようにそのクラスでのみ使用されています。
インターフェイス情報のみを .h に保持し、実装を .cpp に保持する興味深い方法であり、通常の pimpl イディオムよりも手間がかかりません。
ニキビをいつも使っている人を見かけますが、このアプローチは一度もありません。何か問題はありますか?
qt - QImageコピーオンライト
にQImage
基づいていQSharedData
ますか?Qimage
フォローするpimpl
か?copy on write
たとえば、Qimageを(コピーコンまたは割り当てを介して)コピーすると、ピクセルのディープコピーが作成されますか?
.net - PIMPL を使用して C++/CLI から C# クラスを使用する方法
アンマネージ アプリケーションから C# クラスを使用する必要があります。次の C# クラスがあるとします。
次に、次の C++/CLI クラスを作成します。
これを行うと、不完全なクラス型へのポインターが許可されないため、何かを取得できません。私は生まれながらの管理されていない開発者ではないので、質問が少しばかげている場合はご容赦ください:\
java - Java プログラミングのイディオム : プライベート実装クラス
いくつかのコードでこの構造を見つけました。
プライベートな静的クラスに A を実装させるメリットはありますか? これは、C++ の Pimpl イディオムを思い出させました。JavaでPimplイディオムを使用する利点はありますか?
c++ - C++11 の「移動元」オブジェクトの有効な状態を構成するものは何ですか?
私は、C++11 のムーブ セマンティクスがどのように機能するかについて頭を悩ませようとしてきましたが、ムーブ元オブジェクトが満たす必要がある条件を理解するのにかなりの苦労をしています。セマンティクスを移動するという議論はpimplsに最適です。
私の問題の最も簡単な例は、次のような pimpl イディオムに関係しています。
では、引っ越してきた後はどうすればよいのFoo
でしょうか。移動元のオブジェクトを安全に破棄し、割り当てることができます。どちらも非常に重要です。ただし、 でやろうとするdo_stuff
とFoo
爆発します。の定義にムーブ セマンティクスを追加する前はFoo
、everyFoo
は できるという不変条件を満たしていましたがdo_stuff
、それはもはや当てはまりません。(たとえば)moved-fromFoo
を配置すると、新しい動的割り当てが必要になり、移動セマンティクスの目的が部分的に無効になるため、優れた代替手段はあまりないようです。impl_
入っているかどうかを確認do_stuff
して、デフォルトに初期化できましたFooImpl
そうであれば、それは(通常は偽の)チェックを追加します。メソッドがたくさんある場合は、すべてのメソッドでチェックを行うことを忘れないでください。
do_stuff
できることは合理的な不変条件であるという考えをあきらめるべきですか?