問題タブ [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.

0 投票する
2 に答える
732 参照

c++ - pimplクラスのデフォルト値を初期化するのに最適な場所は?

私はPImplをかなり広範囲に使用しており、自分が困惑していることに気付いたのは、Pimpl構造体のメンバーを正確に初期化する場所です。オプションは、Private構造体のコンストラクターを作成してそこで初期化するか、メインクラスのコンストラクターで初期化することです。

myclass.hpp:

myclass.cpp:

Private現時点では、何らかの理由で新しいオブジェクトを作成したり、それらをコピーしたりする場合を除いて、2つの違いはあまりわかりません。その場合は、オプションAの方が適している可能性があります。また、初期化リスト内の変数を初期化することもできます。しかし、オプションBの方が読みやすく、おそらく保守しやすい傾向があることがわかりました。スケールをどちらかの方向に傾ける可能性のあるものがここにありますか?

0 投票する
1 に答える
406 参照

c++ - テンプレート化されたピンプル転送

私は一種のテンプレート化された階層に関連する指標をたくさん持っています。

そして、それらによってインデックス付けされたオブジェクトを生成してキャッシュすることになっているクラス。このクラスに pimpl を使用したいのですが、テンプレートを使用して関数呼び出しを実装クラスに転送する方法があるかどうか疑問に思っています。何かのようなもの

0 投票する
3 に答える
2672 参照

c# - pimplイディオムはc#で使用されていますか?

私は C# のバックグラウンドを持ち、最近 C++ の学習を開始しました。私が遭遇したことの 1 つは、pimpl イディオムです。私はいくつかの大企業で C# 開発を行ったことがありますが、これに遭遇したことはありません。

これは間違っているかもしれませんが、ヘッダー ファイルを使用し、部分クラス オプションがないため、C++ では必要であると理解しています。

しかし、C# では、常にクラス ライブラリを使用してアプリケーションを構築していました。ライブラリ コードで何かが変更された場合、それを dll に再コンパイルし、アプリケーション プロジェクトで新しい dll を参照します。

同じことがC++でできない理由がよくわかりません。ピンプルは、私には醜いハックのように見えます。

0 投票する
2 に答える
1971 参照

c++ - C++ Pimpl と純粋な仮想インターフェイスのパフォーマンス

この件に関する投稿がかなりあることは承知していますが、この正確な質問に対する答えを見つけるのに苦労しています.

関数呼び出しの場合、純粋仮想インターフェイスと pimpl のどちらが高速ですか?

一見すると、pimpl を使用すると 1 回ではなく 2 回の関数呼び出しが必要になるため、純粋仮想インターフェイスの方が高速であるように思えます...または、この場合、ある種の巧妙なコンパイラのトリックが引き継がれるのでしょうか?

編集: これらのどれを使用して、非常に頻繁に大量に生成する必要があるいくつかのオブジェクトのシステム依存部分を抽象化するかを決定しようとしています。

編集:
この時点で言う価値があると思いますが、私の問題の根本は、特定のインターフェイスの実装を切り替えることが本当の目的である場合に、複数のプラットフォームでコードを機能させる方法として、Abstract Factory の設計パターンを間違えたことです。実行時に

0 投票する
1 に答える
145 参照

c++ - コンパイラは、自明に見えるが自明ではないdtorを最適化/インライン化しようとすると、足元で自分自身を撃ちます。何が間違っているのでしょうか。

私はこの共有pimpl*を持っています。実装オブジェクトを転送宣言し、カスタム実装された共有ポインターオブジェクトを使用して、pimplイディオムを実装します(ここでも、共有セマンティクスを使用します)。凝縮された、それはこのように見えます:

Foo.h

Foo.cpp

さて、(私が思うに)コンパイラは(オブジェクトや他のBar.cppオブジェクトを使用する)コンパイル時に本当に賢くなり、次のように文句を言います。Foo SharedPtr

~SharedPtr<Foo_impl>と以外に誰が電話をかけている可能性がFooありFooFactoryますか?それはどこから来て、どうすれば修正できますか?

注:~Foo仮想化は役に立ちません。これは私にとってさらに不可解です。


* implが共有されているという事実はここでは関係ありません。私は、典型的な「copy-ctor/assignmentメソッドを定義してください」というコメントを避けたいだけです。pimplポインタが共有されることは完全に意図的です。


編集:SharedPtrインターフェース:

0 投票する
2 に答える
1892 参照

c++ - 名前のない名前空間で変数を宣言する

私の現在の仕事では、変数が cpp ファイルの名前のない名前空間で宣言されており、メンバー変数であるかのようにそのクラスでのみ使用されています。

インターフェイス情報のみを .h に保持し、実装を .cpp に保持する興味深い方法であり、通常の pimpl イディオムよりも手間がかかりません。

ニキビをいつも使っている人を見かけますが、このアプローチは一度もありません。何か問題はありますか?

0 投票する
1 に答える
1042 参照

qt - QImageコピーオンライト

QImage基づいていQSharedDataますか?Qimageフォローするpimplか?copy on writeたとえば、Qimageを(コピーコンまたは割り当てを介して)コピーすると、ピクセルのディープコピーが作成されますか?

0 投票する
1 に答える
600 参照

.net - PIMPL を使用して C++/CLI から C# クラスを使用する方法

アンマネージ アプリケーションから C# クラスを使用する必要があります。次の C# クラスがあるとします。

次に、次の C++/CLI クラスを作成します。

これを行うと、不完全なクラス型へのポインターが許可されないため、何かを取得できません。私は生まれながらの管理されていない開発者ではないので、質問が少しばかげている場合はご容赦ください:\

0 投票する
1 に答える
3281 参照

java - Java プログラミングのイディオム : プライベート実装クラス

いくつかのコードでこの構造を見つけました。

プライベートな静的クラスに A を実装させるメリットはありますか? これは、C++ の Pimpl イディオムを思い出させました。JavaでPimplイディオムを使用する利点はありますか?

0 投票する
2 に答える
5922 参照

c++ - C++11 の「移動元」オブジェクトの有効な状態を構成するものは何ですか?

私は、C++11 のムーブ セマンティクスがどのように機能するかについて頭を悩ませようとしてきましたが、ムーブ元オブジェクトが満たす必要がある条件を理解するのにかなりの苦労をしています。セマンティクスを移動するという議論はpimplsに最適です

私の問題の最も簡単な例は、次のような pimpl イディオムに関係しています。

では、引っ越してきた後はどうすればよいのFooでしょうか。移動元のオブジェクトを安全に破棄し、割り当てることができます。どちらも非常に重要です。ただし、 でやろうとするdo_stuffFoo爆発します。の定義にムーブ セマンティクスを追加する前はFoo、everyFooは できるという不変条件を満たしていましたがdo_stuff、それはもはや当てはまりません。(たとえば)moved-fromFooを配置すると、新しい動的割り当てが必要になり、移動セマンティクスの目的が部分的に無効になるため、優れた代替手段はあまりないようです。impl_入っているかどうかを確認do_stuffして、デフォルトに初期化できましたFooImplそうであれば、それは(通常は偽の)チェックを追加します。メソッドがたくさんある場合は、すべてのメソッドでチェックを行うことを忘れないでください。

do_stuffできることは合理的な不変条件であるという考えをあきらめるべきですか?