1. ホーム
  2. c++

[解決済み] なぜ "PIMPL "イディオムを使わなければならないのか?重複

2022-05-17 02:49:57

質問

背景を説明します。

その PIMPL イディオム (Pointer to IMPLementation) は、パブリッククラスが、そのパブリッククラスが属するライブラリの外からは見えないような構造体やクラスをラップする、実装隠蔽のためのテクニックである。

これにより、ライブラリのユーザから内部の実装の詳細やデータを隠蔽することができます。

このイディオムを実装する場合、パブリッククラスのメソッド実装はライブラリにコンパイルされ、ユーザはヘッダファイルのみを持つことになるので、なぜパブリッククラスではなくpimplクラスにパブリックメソッドを配置するのでしょう?

説明するために、このコードでは Purr() の実装を impl クラスに置き、同様にそれをラップしています。

なぜPurrをパブリッククラスで直接実装しないのですか?

// header file:
class Cat {
    private:
        class CatImpl;  // Not defined here
        CatImpl *cat_;  // Handle

    public:
        Cat();            // Constructor
        ~Cat();           // Destructor
        // Other operations...
        Purr();
};


// CPP file:
#include "cat.h"

class Cat::CatImpl {
    Purr();
...     // The actual implementation can be anything
};

Cat::Cat() {
    cat_ = new CatImpl;
}

Cat::~Cat() {
    delete cat_;
}

Cat::Purr(){ cat_->Purr(); }
CatImpl::Purr(){
   printf("purrrrrr");
}

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

  • なぜなら、あなたは Purr() のプライベートメンバを使用できるようにするためです。 CatImpl . Cat::Purr() がなければ、そのようなアクセスは許可されないでしょう。 friend の宣言がなければ、そのようなアクセスは許可されません。
  • なぜなら、1つのクラスが実装し、1つのクラスが転送するというように、責任を混在させないためです。