1

重複の可能性:
Pimpl イディオムと純粋な仮想クラス インターフェイス

非表示の実装では、「プロキシ クラス」または「ハンドル クラス」または「チェシャ猫の笑顔」テクニックについて多くのことを読みました。このテクニックでは、本質的に「実際の」クラスへのポインタをデータ メンバーとしてパブリック/プロキシ クラスに含めます。 、そして「実際の」クラスにすべてを実装します。

しかし、いくつかのサンプル コードを見ていたところ、ハンドル クラスに「ダミー」メソッドを記述してからハンドル クラスの実際のメソッドを呼び出す必要がないため、より簡単に思われる別の手法に気付きました。データメンバーがまったく必要なく、全体的により合理化されているようです。

手法は、すべてのパブリック メソッドを としてstruct(またはすべてが であるクラスとしてpublic) 定義し、すべてのvirtual=0メンバー関数をそれ以上何も定義しないことです。したがって、実装はありません。次に、これへのポインターを返す静的関数を定義してstruct、クライアントがクラスを使用できるようにします。しかし、裏では、このメソッドは構造体のサブクラスを実際に返します。このサブクラス内では、さらに多くの処理を行うことができます。

これが非常に簡単で、別のクラスへのポインターであるデータ メンバーを含み、データ メンバーのメソッドへのパブリック クラスの呼び出しを実装する必要があるパブリック クラスよりもエレガントであると主張するなら、なぜこれが実装の非表示で最も議論されている手法は?

4

1 に答える 1

0

この記事に記載されているように:

ほとんどの人がPIMPLアプローチを推奨する理由は、いくつかの明確な利点があるためです。

  • ファクトリ関数は必要ありません。new()、delete()を使用するか、スタック上にオブジェクトを作成できます。
  • 簡単にサブクラス化できます。
  • インターフェイスメソッドは仮想ではないため、呼び出す方が速い場合があります。(一方、実装オブジェクトに到達するには、追加のメモリフェッチが必要です。)
  • PIMPLは、外部インターフェイスや他のクラスとの関係を変更することなく、既存のクラスに導入できます。

抽象クラスメソッドには、独自の利点がいくつかあります。

  • パブリックインターフェイスのメソッドの転送スタブを作成する必要がないため、コードがよりクリーンになり、入力が大幅に削減されます。
  • 複数のクラスが同じインターフェースを実装できます。使用する特定の実装を静的または動的に選択できるため、柔軟性が向上します。
于 2013-01-23T05:13:32.163 に答える