[解決済み] Pimplイディオム vs 純粋仮想クラスインターフェース
質問
プログラマがPimplイディオムと純粋仮想クラスと継承のどちらかを選ぶ理由は何だろうと考えていました。
Pimplイディオムは、各パブリックメソッドに明示的な余分なインダイレクトとオブジェクト作成のオーバーヘッドがあることは理解しています。
一方、Pure仮想クラスは継承する実装に対して暗黙のインダイレクト(vtable)があり、オブジェクト生成のオーバヘッドはないと理解しています。
EDIT
: しかし、外部からオブジェクトを作成する場合、ファクトリーが必要になる
純粋仮想クラスがpimplイディオムより望ましくない理由は何ですか?
どのように解決するのですか?
C++のクラスを書くとき、それがどのようなものになるかを考えるのは適切なことです。
-
値の型
値によるコピーで、IDは決して重要ではありません。std::mapのキーになるのが適切です。例えば、"string" クラス、"date" クラス、または "complex number" クラスなどです。このようなクラスのインスタンスを "コピー" することは理にかなっています。
-
エンティティタイプ
アイデンティティは重要です。常に参照渡しで、決して "値" ではありません。多くの場合、クラスのインスタンスをコピーすることは意味を持ちません。意味がある場合は、通常、ポリモーフィックな "Clone" メソッドがより適切です。例 例:Socketクラス、Databaseクラス、quot;policy"クラス、関数型言語におけるquot;closure"となるようなあらゆるもの。
pImplと純粋な抽象ベースクラスの両方は、コンパイル時の依存性を減らすためのテクニックです。
しかし、私はpImplをValue型(タイプ1)の実装にしか使ったことがなく、本当にカップリングとコンパイル時の依存関係を最小化したいときにしか使わない。多くの場合、それは面倒なことに値しないのです。あなたが正しく指摘するように、すべてのパブリックメソッドに対してフォワーディングメソッドを書かなければならないので、より多くの構文的オーバーヘッドがあります。タイプ 2 のクラスでは、私は常に、関連するファクトリーメソッドを持つ純粋な抽象ベースクラスを使用します。
関連
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] C++でインターフェイスを宣言するには?
-
[解決済み] Pythonにおける抽象クラスとインターフェースの違い
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++