問題タブ [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
ライブラリのユーザーが外部依存関係 (boost など) を必要としないように pimpl イディオムを使用したいのですが、メソッドがヘッダーにある必要があるため、クラスがテンプレート化されている場合は不可能に思えます。代わりに何かできることはありますか?
c++ - ポータブルC++アライメント?
Pimplイディオムをローカルストレージイディオムに適用したい:
mytype.h
mytype.cpp
このアプローチで私が抱えている唯一の懸念は、の調整ですm_storage
。char
intと同じように整列されるとは限りません。アトミックには、さらに制限の厳しい配置要件があります。アライメント値を定義(およびアサート)する機能を提供するストレージを宣言するためのchar配列よりも優れたものを探しています。何か知っていますか?多分ブーストライブラリはすでにこれを行っていますか?
c++ - 継承とあいまいな pimpl ヘルパー
pimpl イディオムのユーティリティ クラスの作成をいじっていますが、助けが必要な問題がいくつかあります。
これは私が持っているものです
:
pimpl.h
pimpl_impl.h
そして、これはあなたがそれを使用する方法です:
A.h
A.cpp
これは非常にうまく機能しますが、継承を図に入れるとすぐに機能しなくなります。
pimpl
曖昧になった…
これを回避する方法についてのアイデアはありますか?
c++ - テンプレート内のpimpl-idiom; どのスマートポインタ?
私は通常、pimplにboost :: scoped_ptrを使用します(コピーコンストラクターを処理するのを忘れても驚きがないため、1つの理由があります)
ただし、テンプレートでは、scoped_ptrのデストラクタの要件を満たすために、implが完全に定義されているcppファイルにデストラクタを配置することはできません。とにかく動作しますが、動作することが保証されているのか、それとも偶然なのかはわかりません。「ベストプラクティス」または標準はありますか?scoped_ptrは、コピー不可能なクラスのpimplsに最適なスマートポインターですか?
c++ - GotW #101「ソリューション」は実際に何かを解決しますか?
まず、C++11 の pimpl に関する Herb の Sutters GotW の投稿をお読みください。
GotW #101 で提案されている解決策を理解するのに苦労しています。私が理解できる限りでは、GotW #100 で苦労して解決されたすべての問題が復讐をもって戻ってきました。
メンバは標準外の
pimpl
テンプレートであり、定義は使用時に表示されません (class widget
のクラス定義および の暗黙的に生成された特別なメンバ関数widget
)。明示的なインスタンス化もありません。これにより、リンク中に未解決の外部エラーが発生します。widget::impl
インスタンス化が定義されている時点ではまだ不完全pimpl<widget::impl>::~pimpl()
です(実際にはインスタンス化されているとは思いませんが、参照されているだけです)。そのため、不完全な型へのポインターを呼び出します。自明でないデストラクタがある場合、未定義の動作が発生します。std::unique_ptr<widget::impl>::~unique_ptr()
delete
widget::impl
widget::impl
完全なコンテキストでコンパイラが特別なメンバーを生成するように強制する理由を説明してください。仕組みが見えないからです。
GotW #101 がまだ完全なwidget::~widget()
実装ファイルでの明示的な定義を必要とする場合widget::impl
は、「より堅牢な」コメント (@sehe が回答で引用したもの) について説明してください。
ラッパーが「ボイラープレートの一部を削除する」という GotW #101 の中心的な主張を見ていますが、これは (段落の残りの部分に基づいて)widget::~widget()
宣言と定義を意味しているように思えます。ですから、GotW #101 では、それはなくなっています。
ハーブさん、お立ち寄りの際は、参照用にここにソリューション コードをカット アンド ペーストしてもよろしいかどうかお知らせください。
c++ - PIMPLでデストラクタを提供する必要があります
上記のコンパイルエラーの解決策は、手動でデストラクタを提供することです。示された理由は次のとおりです。
デストラクタを手動で定義することを忘れないでください。その理由は、コンパイラが暗黙のデストラクタを生成するときに、型implが不完全であるため、そのデストラクタが呼び出されないためです。
質問>上記のアイデアを理解するのはまだ難しいので、ここで手動デストラクタを提供する必要がある理由について少し詳しく知りたいと思います。
ありがとうございました
c++ - PIMPLイディオムは実際に実際に使用されていますか?
私はハーブサッターの「ExceptionalC++」という本を読んでいて、その本でPIMPLイディオムについて学びました。基本的に、アイデアは、のprivate
オブジェクトの構造を作成し、class
それらを動的に割り当ててコンパイル時間を短縮することです(また、プライベート実装をより適切に非表示にします)。
例えば:
次のように変更できます:
そして、.cppファイルでは、次の定義があります。
これはかなり興味深いように思えますが、私が働いた会社でも、ソースコードを見たオープンソースプロジェクトでも、この種のアプローチを見たことがありません。それで、このテクニックが実際に実際に使われているのだろうか?
どこでも使用する必要がありますか、それとも注意して使用する必要がありますか?また、この手法は、組み込みシステム(パフォーマンスが非常に重要な場合)での使用が推奨されていますか?
c++ - pimpl に unique_ptr を使用するにはどうすればよいですか?
これは、pimpl に unique_ptr を使用しようとしたときに表示されるものを簡略化したものです。クラスにポインターを所有させたいので、unique_ptrを選択しました-pimplポインターとクラスの寿命を同じにしたいのです。
とにかく、ここにヘッダーがあります:
ソースは次のとおりです。
これらをライブラリにコンパイルできました。しかし、テストプログラムでそれを使用しようとすると、
これはよく知られている安全機能です。フォローしてみました。
私の問題は、Help::Impl 宣言をヘッダーに入れると、pimpl の利点がなくなるように見えることです。クラスのレイアウトはユーザーに表示されます。定義は非表示になっていますが、Help クラスとプライベート メンバーを使用してそれを行うこともできました。また、Impl の宣言を含めることで、別個に保持したかった新しいヘッダーが取り込まれます。
私は何が欠けていますか?人々は Impl 宣言に何をどこに入れますか? Help dtor のやり方が間違っていますか? ああ!
c++ - pImplポインターを呼び出し元のタイプに変換し直す
私は自分のプログラムでpimplイディオムを使用していますが、1つの場所で立ち往生しています。私のコードは
私のClassImpl->GetP()には
ご覧のとおり、pImplbactを発信者タイプに変換する必要があります。方法は何ですか?
キャスティングは使いたくない
アドバイスをお願いします
c++ - pimplクラスから呼び出し元クラスのコピーコンストラクタを呼び出す方法は?
pImpl クラスから copyconstuctor を呼び出したいかどうかを知りたいのですが、どうすればよいですか? 例えば:
どうすればこれを達成できますか?