C ++でPImplイディオムを使用する多くのソースコードが表示されます。その目的はプライベートデータ/タイプ/実装を非表示にすることであるため、依存関係を削除し、コンパイル時間とヘッダーインクルードの問題を減らすことができると思います。
しかし、C ++のインターフェイス/純粋な抽象クラスにもこの機能があり、データ/型/実装を隠すために使用することもできます。また、オブジェクトを作成するときに呼び出し元にインターフェイスを表示させるために、インターフェイスのヘッダーでファクトリメソッドを宣言できます。
比較は次のとおりです。
費用:
パブリックラッパー関数の実装を繰り返す必要さえないため、インターフェイスの方法のコストは低く
void Bar::doWork() { return m_impl->doWork(); }
なります。インターフェイスで署名を定義するだけです。よく理解された:
インターフェイステクノロジーは、すべてのC ++開発者によく理解されています。
パフォーマンス:
インターフェイス方法のパフォーマンスは、PImplイディオムよりも悪くありません。どちらも余分なメモリアクセスです。パフォーマンスは同じだと思います。
以下は私の質問を説明するための擬似コードです。
// Forward declaration can help you avoid include BarImpl header, and those included in BarImpl header.
class BarImpl;
class Bar
{
public:
// public functions
void doWork();
private:
// You don't need to compile Bar.cpp after changing the implementation in BarImpl.cpp
BarImpl* m_impl;
};
インターフェイスを使用して同じ目的を実装できます。
// Bar.h
class IBar
{
public:
virtual ~IBar(){}
// public functions
virtual void doWork() = 0;
};
// to only expose the interface instead of class name to caller
IBar* createObject();
それでは、PImplのポイントは何ですか?
Impl
クラスにパブリック関数を追加してもが壊れませんABI
が、インターフェイスにパブリック関数を追加しても壊れABI
ます。