ライブラリのユーザーに対して実装の詳細を隠すことができるように、pimpl イディオムを使用してクラス ライブラリを作成したいと考えています。
内部からのみ呼び出し可能なメソッドを持ちながら、一部のメソッドがパブリックでユーザーの観点から呼び出し可能なクラスを作成することは可能ですか?
今のところ、friend キーワードを使用し、内部メソッドを private と宣言するソリューションしか見当たりません。
例: MyPartiallyVisibleClass: ユーザーがアクセスできるメソッドと、ライブラリの内部のみがアクセスできるメソッドが混在するクラス。InternalClass: ライブラリ内の内部クラス。ユーザーはこれが存在することを決して知りません。
// MyPartiallyVisibleClass.h: Will be included by the user.
class MyPartiallyVisibleClass
{
private:
class Impl; // Forward declare the implementation
Impl* pimpl;
InternalMethod(); // Can only be called from within the library-internals.
public:
UserMethod(); // Will be visible and callable from users perspective.
}
// MyPartiallyVisibleClass.cpp
class MyPartiallyVisibleClass::Impl
{
private:
InternalMethod();
public:
UserMethod();
friend class InternalClass;
}
// Internal class that will not be included into users application.
class InternalClass
{
public:
InternalMethod()
{
MyPartiallyVisibleClass pvc;
pvc.InternalMethod();
}
}
これを行うより良い方法はありますか?