【c++】激震が走った、Pimplイディオム

概要

いきなりですが、

C++では、嫌でもprivateな変数や関数も.hファイルに宣言する必要がある。

と思ってませんか?

この記事を読めばその常識は覆ります!

今日C++のためのAPIデザイン
を読んでいて、激震が走りました。

冒頭にも書いた様に、

C++では嫌でもprivateな変数や関数も.hファイルに宣言する必要がある。

そう思っていた時期が僕にもありました。

でも、違うんです。

どうやらPimplと言うイディオムを使うとcppファイルに隠蔽出来るそうです。

Pimpl導入前のコード

簡単な例で示してみましょう。
ここにHogeと言うクラスがあり、インスタンス化されたらhogeと出力されるクラスがあります。

// Hoge.h
class Hoge
{
public:
    Hoge();
    ~Hoge();

private:
    void printHoge();
};

// Hoge.cpp
#include "Hoge.h"

Hoge::Hoge()
{
    this->printHoge();
}

Hoge::~Hoge() {}

void Hoge::printHoge()
{
    CCLOG("hoge");
}

Pimpl導入後のコード

// Hoge.h
class Hoge
{
public:
    Hoge();
    ~Hoge();

private:
    class Impl;
    Impl* hoge;
};

// Hoge.cpp
#include "Hoge.h"

class Hoge::Impl
{
public:
    void printHoge();
};

Hoge::Hoge()
    : hoge(new Hoge::Impl())
{
    this->hoge->printHoge();
}

Hoge::~Hoge() {}

void Hoge::Impl::printHoge()
{
    CCLOG("hoge");
}

解説

ヘッダファイル

まず、privateでclass宣言します。
名前はなんでも良いと思います。
Hogeクラスでprivateに行いたい動作を記述するクラス名となります。
ヘッダファイルではこのクラスのインスタンスを宣言するところまでを記述。

実装ファイル

16-20行目
– 新しいクラスのインターフェースを宣言します。
publicにしないとHogeクラス内からでも使えないので注意。

23行目
– 新しいクラスをコンストラクタでインスタンス化します。

25行目
– 新しいクラスのインスタンスを通じてメソッドを呼び出します。

27行目
– もともとHogeクラスでprivateで行いたかった実装をここに書きます。

あとがき

これはかなりの衝撃でしたね。
僕はObjective-CからC++に来ました。
Objective-Cではヘッダに書かずに.mファイルに直接実装すればprivateな関数になっていたのですが、
C++ではそうはいきません。
いかないはずだったんです!

でもこのPimplでそのストレスからも解放されそうです。

【cocos2d-x】cocos記事一覧
cocos記事一覧 Pimpl 激震が走った、Pimplイディオム enum enum struct(class)とは cast 決定版!*_castまとめ sqlit...
誰かのお役に立てば。

Twitterフォローお願いします

毎日技術ブログを更新しています。

「次回以降も記事を読んでみたい!」
「この辺分からなかったから質問したい!」

そんな時は、是非@daiki1003のフォローお願いします♪

コメント

タイトルとURLをコピーしました