【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++ですが、こういうことを知るたびにまた面白さを再認識させられます!