例えば
// Implementation.
struct PrivatePoint {
void SomePrivateMethod();
double x;
double y;
}
struct Point : private PrivatePoint {
double DistanceTo(const Point& other) const;
}
これはPimplイディオムに似ているようです。これには、私が本当に気に入っている2つの利点があります。
- SomePrivateMethodはテスト可能です。代わりにSomePrivateMethodがPointでプライベートとして宣言されている場合、テストから呼び出すことはできません。それをパブリックまたはPointで保護されていると宣言した場合、テストはそれを呼び出すことができますが、Pointの通常のユーザーもそうすることができます。
- プライベートデータへのアクセスは、Pimplイディオムで行う方法と比較して、読み取りと書き込みが簡単です。これは、ポインターを経由する必要がないためです。
。
Point::DistanceTo(const Point& other) {
SomePrivateMethod();
double dx = other.x - x;
double dy = other.y - y;
return sqrt(dx * dx + dy * dy);
}
対。
Point::DistanceTo(const Point& other) {
ptr->SomePrivateMethod();
double dx = other.ptr->x - ptr->x;
double dy = other.ptr->y - ptr->y;
return sqrt(dx * dx + dy * dy);
}