【C++】Pimpl

2018年10月21日

ヘッダファイルに記述されているクラスのprivateなメンバを隠蔽するイディオム。「pointer to implementation」の略称。

実装方法

まず、ヘッダファイルに書かれたクラス内で「privateなメンバを管理するクラス( ここではImplとする。 )」を前方宣言。そして、std::unique_ptrImplを指定してprivateなメンバとして追加する。

#include <memory>

class Hoge 
{
public:
    Hoge();
    ~Hoge();
private:
    class Impl;

    std::unique_ptr<Impl> pImpl;
};

続いて、Implをcppファイルで定義する。このクラスには、元のクラス( Hoge )で必要となるprivateなメンバをpublicで持たせる。

最後に、元のクラスのコンストラクタでImplを生成する。

#include "Hoge.h"

class Hoge::Impl
{
public:
    // Hogeで利用するprivateなメンバをここに記述
    void Output()
    {
        ::printf( "Hoge" );
    }
};

Hoge::Hoge() :
    pImpl( std::make_unique<Impl>() )
{
}

Hoge::~Hoge() 
{
}

使い方

生成したImplのインスタンスを通してprivateなメンバを利用する。

this->pImpl->Output();

参考書籍