1

pimpl-idiom を使用するライブラリのインターフェイスを定義しようとしています。以下は、私が定義する典型的なインターフェイス クラスです。

struct A {
public:
   void func1();
   void func2();
   virtual void notif1();
   virtual void notif2();
private:
   class AImpl;
   AImpl *impl;
}

関数 func1()、func2() はインターフェース関数です。そして、notif1()、notif2() は、アプリケーションが (A のサブクラスで) 実装する必要がある通知関数です。

これは、ライブラリのインターフェイスを定義する正しい方法ですか? この方法に欠点はありますか、それともより良い解決策はありますか?


すべての答えをありがとう。したがって、私が収集したすべての回答から、ライブラリのインターフェイスを表すには、次の方法が適していることがわかります。

// Forward declaration
class AImpl;

struct A {
public:
   void func1();
   void func2();
private:
   virtual void notif1();
   virtual void notif2();
   AImpl *impl;
}

インターフェイス ライブラリはインターフェイス関数を実装し、アプリケーションは派生クラスで通知関数を実装します。このパターンに従うライブラリの良い例はありますか?

4

2 に答える 2

3
  • pimplは、クラスをヘッダーのみにすることができなくなったことを意味します。つまり、ライブラリのユーザーにとっては、ヘッダーを#includeするだけでは不十分ですが、ライブラリのオブジェクトコードに対してもリンクする必要があります。
  • 不透明なメンバーにアクセスするたびにポインターを逆参照する必要があるため、ヘッダー内のクラスの実行時のパフォーマンスはわずかに遅くなります。代わりに、イディオムを使用すると、クラスの不透明なメンバーをより頻繁に変更できます。しかし、それは本番環境のライブラリにとってあまり利点ではありません。それは、とにかくあまり変わらないはずだからです。

それは良い考えではないと思います。

于 2011-05-19T23:15:05.250 に答える
1

構造体A内でAImplクラスを宣言する必要はありません。

私は一般的に前向きな宣言をします:

//Forward Declaraion.
class AImpl;

struct A {
public:
   void func1();
   void func2();
   virtual void notif1();
   virtual void notif2();
private:
   AImpl *impl;
}
于 2011-05-19T23:14:54.673 に答える