問題タブ [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が機能しない
これは非常に厄介な間違いですが、ここで何が起こっているのかわかりません。
単純な例はたくさんありますが、なぜこれが機能しないのかわかりません(これは多かれ少なかれ例の1つでしたが、違いはわかりません)。
非常に単純なPimplの例がありますが、機能しません。
と
これをコンパイルするとエラーが発生します。C2100:不正な間接参照。
ありがとう。
c++ - C++: コンパイル時の依存関係を自動的に減らすツール
にきびイディオムについて読んだ後、私はぞっとしました!
.h/.cpp ファイルを調べて、放棄できる依存関係を推測できるツールはありませんか?
c++ - C ++:オブジェクトへの共有ポインターではなく共有オブジェクトを作成する
boost::shared_ptrは本当に気になります。確かに、そのようなものの有用性は理解していますが、shared_ptr<A>
として使用できればと思いA*
ます。次のコードを検討してください
HelpfulContainerを作成した人は誰でも、Aオブジェクトへのポインターを保持したい他の人について考えていませんでした。HelpfulClass boost::shared_ptrオブジェクトを提供することはできません。しかし、私たちができることの1つは、pimlpイディオムを使用して、それ自体がAであるSharedAを作成することです。
そして、main関数は次のようになります。
だから、私の質問はこれです:上記のパターンは良いパターンですか、それとも私がまだ検討していないものがありますか?私の現在のプロジェクトは、HelpfulContainer
必要なポインターを削除する上記のようなクラスを継承しましたが、HelpfulContainerに存在するデータ構造が必要です。
更新:この質問は後続の質問です。
c++ - C++: テンプレート化された共有の作成shared_ptr ではなくオブジェクト物体
私の前の質問によると、引数として取るメソッドで使用できるように、 a が実際に(またはおそらく)boost::shared_ptr<A>
のサブクラスであることを望みます。A
A*
A*
次のクラスを検討してください。
前の質問で、これを処理するために SharedA オブジェクトを作成することを提案しましたが、おそらくそうなります。
テンプレートクラスを作成して、これらすべてを処理できるとしたら、それは大変なことです。
これがあれば (適切なコンストラクターと共にShared<T>
)、次のことができます。
質問:
これは役に立ちますか?または、特に悪いコードを扱っているコーナーケースでのみそのユーティリティが使用されます。例えば:
void aFunctionYouHaveToUse(A* a) { /有用なアルゴリズムを実行してから/
a を削除します。}そのようなテンプレート化されたクラスを構築することは可能ですか? (リフレクションが必要だと思いますよね?)それを構築できるとしたら、どうやって?
c++ - すべてのメソッドをクラス定義に入れる
pimpl イディオムを使用する場合、すべてのメソッド定義をクラス定義内に配置することをお勧めしますか? 例えば:
私の知る限り、クラス定義内にメソッド定義を配置することに関する唯一の問題は、(1) クラス定義を含むファイルで実装が表示されることと、(2) コンパイラがメソッドをインライン化する可能性があることです。
この場合、クラスはプライベート ファイルで定義されているため、これらは問題ではありません。また、メソッドは 1 か所でしか呼び出されないため、インライン化は効果がありません。
クラス内に定義を配置する利点は、メソッド シグネチャを繰り返す必要がないことです。
それで、これでいいですか?他に注意すべき問題はありますか?
c++ - テンプレートコンストラクターを持つクラスのスマートポインターを使用したPimpl:奇妙な不完全な型の問題
次のように、pImplイディオムでスマートポインタを使用する場合
明らかな問題は、のデストラクタが生成されるFoo::Impl
時点で不完全であるということです。Foo
コンパイラは通常、そこで警告を発し、boost::checked_delete
Boostスマートポインタによって内部的に使用され、クラスFoo::Impl
が完了したことを静的にアサートし、そうでない場合はエラーをトリガーします。
したがって、上記の例をコンパイルするには、次のように記述する必要があります。
Foo::~Foo
実装ファイルに空を実装します。ここで、Foo::Impl
が完了します。デストラクタの実装に失敗することはないため、これはベアポインタに対するスマートポインタの利点です。
ここまでは順調ですね。しかし、同様のクラスにテンプレートコンストラクターを導入しようとすると、奇妙な動作に遭遇しましたBar
(完全なコード、自分で試してみてください)。
この例をVisualStudio2005 SP1でコンパイルすると、次のエラーが発生しますが、エラーは発生しBar
ませんFoo
。
家に帰ったらすぐに最近のgccでこれを試してみます。
何が起こっているのかわかりません。デストラクタが定義されている時点(つまり、でBar.cpp
)で、の定義Bar::Impl
が利用可能であるため、問題はないはずです。なぜこれが機能し、機能しFoo
ないのBar
ですか?
ここで何が欠けていますか?
c++ - 動的メモリ割り当てを使用しない Pimpl イディオム
プロジェクトの特定の部分に pimpl イディオムを使用したいと考えています。プロジェクトのこれらの部分は、たまたま動的メモリ割り当てが禁止されている部分でもあり、この決定は私たちの管理下にありません。
だから私が求めているのは、動的メモリ割り当てなしでpimplイディオムを実装するクリーンで良い方法はありますか?
編集
その他の制限事項: 組み込みプラットフォーム、標準 C++98、外部ライブラリなし、テンプレートなし。
qt - pimpl イディオム構造体のメモリ リーク
私たちはクラスで pimpl イディオムを使用しています。pimpl 構造体は、次のように pimpl ポインターを含むクラスで宣言されます。
pimpl の実装は、MyClassImpl.cpp という別のファイルにあります。次に例を示します。
pimplポインターを含むクラスのコンストラクターでは、メンバー変数の初期化リストに次のようなものがあります
これで、次のようにソース コードでメモリ リーク検出を有効にしました。
プログラムが終了すると、MyClassImpl() 構造体 m_Impl(new MyClassImpl()) でメモリ リークが報告されることがわかりました。
m_Impl は boost::scoped_ptr であり、QString、QVariant、および shared_ptr はすべて管理されているため、その理由がわかりません。何か案は?
c++ - テンプレート引数に依存する内部クラス
次の例を考えてみましょう:
g++ (バージョン 4.3.0) を使用してコンパイルした場合
コンパイルエラーは次のとおりです。
私が実際にアーカイブしようとしているのは、列挙値に応じて異なる Imp 実装を持つことです (この例では、列挙型の代わりに int を使用しましたが、問題にはなりません)。
これが許可されていない理由を誰かが説明できますか? 最初のエラーが発生するのはなぜですか? (これ: 修飾名は '{' トークンの前にクラスを指定しません)
テンプレートパラメータに依存するpimplの実装に関して、私は新しい質問を作成しました(より良い例で)here