マッピィ Techlog

日々思うこと

【C++】Pimplが素敵!

C++でライブラリを作ったりするのですが、.hファイルにprivateな変数や関数を書くのが嫌でした。
コメントで「使用禁止」などしても、privateをpublicにされても困りますし。

ところが、Pimplを使えば、そんな変数なども.cppファイルに隠せるんですね。
いや、聞いたことはあったんですが、今まで内々で作業をしてきた自分には不要と思っていました。
まさか、ここで使うことになろうとは!

説明のために簡単なサンプルを挙げてみます。

ClassA.h

#ifndef CLASSA_H
#define CLASSA_H
class ClassA{
public:
    ClassA();
    ~ClassA();
private:
    int mode;
public:
    void printMode();
};
#endif

ClassA.cpp

#include "ClassA.h"
#include <iostream>
ClassA::ClassA(){
    mode = 0;
}
ClassA::~ClassA(){}
void ClassA::printMode(){
    std::cout << "mode = " << mode << std::endl;
}

というもので、printMode()は公開したいけど、modeは隠したい…。
そんな時は以下のようにすればいいみたいです。

ClassA.h

#ifndef CLASSA_H
#define CLASSA_H
#include <memory>
class ClassA{
public:
    ClassA();
    ~ClassA();
private:
	class Impl;
	std::unique_ptr<Impl> impl;
public:
    void printMode();
};
#endif

ClassA.cpp

#include "ClassA.h"
#include <iostream>

class ClassA::Impl
{
public:
	Impl(){ mode = 0;}
private:
	int mode;
public:
	int getMode(){ return mode;}
};  

ClassA::ClassA() : impl(new ClassA::Impl()){
}
ClassA::~ClassA(){}
void ClassA::printMode(){
    std::cout << "mode = " << impl->getMode() << std::endl;
}

追加にあたっては#includeをお忘れなく。

あと、個人的にはClassA::Implが冗長なので、modeをpublicにしてしまったりします。
これはいいか分からないのですが、ここでしか使えないからいいはず!

久々のC++ですが、こういうことを知るたびにまた面白さを再認識させられます!