問題タブ [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 に答える
555 参照

c++ - C++ 2D エンジン プラットフォームを非依存にする方法

クロス プラットフォームの抽象化された API を使用して単純な 2D スプライト エンジンを作成します ■ デモは完全にクロス プラットフォームであり、プラットフォーム固有のヘッダーはありません ■ クロス プラットフォームのコードはプラットフォームに依存するコードから完全に分離されています。プラットフォームに依存しないファイル内のプラットフォーム固有のヘッダー。

私はこの課題を抱えていますが、どうすればクロスプラットフォームのものを作ることができるかについてひどく混乱しています. 必要なことを実行できるエンジンを既に持っていますが、クロスプラットフォームである必要があります。私は主に、どのようなものを含めることができるのか (または、何かがプラットフォーム固有のコードを使用しているかどうかを知るにはどうすればよいのか) を考えています。また、それらがプラットフォーム固有であるために含めることができない場合、その機能を使用する方法がわかりません。それを含めて。仲間の学生によると、解決策は抽象化と Pimpl のどこかにありますが、私はそれを見つけることができません。

0 投票する
0 に答える
297 参照

c++ - ファイアウォールを効率的にコンパイルするために、コンパイル時のボトルネックを特定する

ビルドに時間がかかるこの大きな C++ 強化プロジェクトがあるため、コンパイル ファイアウォールをセットアップしようとしています。これで、直感に従ってピンプルまたは純粋なインターフェイスを振りかけることができましたが、それはあまり効率的ではないようです...通常、コードの一部を最適化したい場合は、プロファイラーを実行してボトルネックを確認し、次のことにつながります質問: コンパイル時間のボトルネックがどこにあるかを確認するにはどうすればよいですか?

コードはクロスプラットフォームであるため、代替コンパイラを試すことを含むすべての回答を歓迎します(指を交差させます!)

ありがとう、

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

c++ - pimpl イディオム コードのコンパイルに関する問題

私は「ピンプル」イディオムを試してみましたが、コンパイルするための忌まわしきものを手に入れることができません。

Linux Mint で g++ v. 4.6.3 を使用すると、次のエラーが発生します。

これは私のコードです:

人.hh

person.cc

main.cc

コードの誤りとは別に、「pimpl」イディオムを模倣するために私が取ったアプローチについてアドバイスしていただけますか? これはそれに準拠していますか?

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

c++ - C++ const の正確性の脆弱性または意図しない使用法?

私は何かが欠けているか、const-correctness がポインターで意図したとおりに機能しません (または、それが私がテストしたものであるため、おそらくスマートポインターですか?)。とにかく、これは PIMPL イディオムの変形を試してみてわかったことです。

私は次のことを宣言しています。

そして、実装のために、私は次のようなものを持っています:

私が理解に苦しんでいるconstのは、関数A::update_stuff(...)に修飾子を使用する方法とA::update_stuff_impl(...)、実際に変更している場合ですA::pimpl::some_data??! それとも、これは予想される動作ですか、それとも単なる悪い使用法ですか? 後者の場合は、どのように修正できるかを特定していただければ幸いです。

お時間と関心をお寄せいただきありがとうございます。

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

c++ - 内部ポインターを介して実装の詳細を非表示にする

私は次のサードパーティ クラスを持っています (いくつかのポインターのラッパーのみ):

のインターフェイスを変更したいA: 実装の詳細を隠しながら、いくつかのメソッドを無効にし、いくつかの新しいメソッドを追加します。私は次のことをすることにしました:

そうしてもいいですか?多分もっと良い解決策がありますか?インターフェイスを変更したいAのは、自分のニーズに合わず、自分のコードに残しておきたくないからです。

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

c++11 - pimplを持つクラスは、pimplを持つオブジェクトを使用できますか?

Pimplは「実装へのポインター」の略で、クラス内の実装を隠す便利な方法を提供します。このクラスのユーザーからプラットフォーム固有の関数と構造を隠す Window クラスを実装しているため、クラス インターフェイスは非常にきれいに見えます。

舞台裏には厄介な WINAPI 呼び出しなどがあります。サポートされるプラットフォームの範囲を広げることを目指している場合は、クラス ヘッダーを変更する必要はまったくなく、ソース ファイルのみを変更する必要があります。とても便利で、そんなに書き直す必要はありません!

ただし、このオブジェクトは私の問題のようです(クラス内):

これは Direct3D/OpenGL グラフィックス コンテキスト ( 「ContextGraphics」のユーザーが決定できます) であり、ご想像のとおり、pimpl-idiom も使用します。

私が直面している問題はコンパイラです:

Window.cpp|145|エラー: 不完全なタイプ 'クラス ContextGraphics::Helper' の無効な使用|

ContextGraphics.hpp|43|エラー: 'クラス ContextGraphics::Helper' の前方宣言|

コンパイラは、クラス「ContextGraphics::Helper」の実装を見つけられないようです。これは、pimpl を含むクラスが pimpl を含むオブジェクトをまったく使用できるかどうかという問題を提起するだけです。すべての実装を Window クラスのソース ファイル内に配置せずにこれを行うことは可能ですか? 私には、それは合理的な解決策ではないようです。