1. ホーム
  2. c++

[解決済み] Pimplイディオム vs 純粋仮想クラスインターフェース

2022-08-11 05:01:36

質問

プログラマがPimplイディオムと純粋仮想クラスと継承のどちらかを選ぶ理由は何だろうと考えていました。

Pimplイディオムは、各パブリックメソッドに明示的な余分なインダイレクトとオブジェクト作成のオーバーヘッドがあることは理解しています。

一方、Pure仮想クラスは継承する実装に対して暗黙のインダイレクト(vtable)があり、オブジェクト生成のオーバヘッドはないと理解しています。

EDIT : しかし、外部からオブジェクトを作成する場合、ファクトリーが必要になる

純粋仮想クラスがpimplイディオムより望ましくない理由は何ですか?

どのように解決するのですか?

C++のクラスを書くとき、それがどのようなものになるかを考えるのは適切なことです。

  1. 値の型

    値によるコピーで、IDは決して重要ではありません。std::mapのキーになるのが適切です。例えば、"string" クラス、"date" クラス、または "complex number" クラスなどです。このようなクラスのインスタンスを "コピー" することは理にかなっています。

  2. エンティティタイプ

    アイデンティティは重要です。常に参照渡しで、決して "値" ではありません。多くの場合、クラスのインスタンスをコピーすることは意味を持ちません。意味がある場合は、通常、ポリモーフィックな "Clone" メソッドがより適切です。例 例:Socketクラス、Databaseクラス、quot;policy"クラス、関数型言語におけるquot;closure"となるようなあらゆるもの。

pImplと純粋な抽象ベースクラスの両方は、コンパイル時の依存性を減らすためのテクニックです。

しかし、私はpImplをValue型(タイプ1)の実装にしか使ったことがなく、本当にカップリングとコンパイル時の依存関係を最小化したいときにしか使わない。多くの場合、それは面倒なことに値しないのです。あなたが正しく指摘するように、すべてのパブリックメソッドに対してフォワーディングメソッドを書かなければならないので、より多くの構文的オーバーヘッドがあります。タイプ 2 のクラスでは、私は常に、関連するファクトリーメソッドを持つ純粋な抽象ベースクラスを使用します。