例如
// Implementation.
struct PrivatePoint {
void SomePrivateMethod();
double x;
double y;
}
struct Point : private PrivatePoint {
double DistanceTo(const Point& other) const;
}
这似乎类似于Pimpl 成语。这有两个我非常喜欢的优点:
- SomePrivateMethod 是可测试的。如果 SomePrivateMethod 在 Point 中被声明为私有,您将无法从测试中调用它。如果您在 Point 中将其声明为 public 或 protected,测试将能够调用它,但 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);
}