// Implementation.
struct PrivatePoint {
void SomePrivateMethod();
double x;
double y;
}
struct Point : private PrivatePoint {
double DistanceTo(const Point& other) const;
}
這似乎與Pimpl idiom相似。這有兩個我很喜歡的優點:
- SomePrivateMethod是可測試的。如果SomePrivateMethod在Point中被聲明爲private,那麼您將無法從測試中調用它。如果您將其聲明爲公開或在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);
}
重新耦合:我不認爲這會在實踐中出現問題,因爲PrivatePoint被明確標記爲「不要使用」。 – allyourcode
重新安裝防火牆:有沒有辦法可以輕鬆讀寫Pimpl?快速構建是好的,但是可讀的代碼也是如此:/ – allyourcode
@allyourcode:你對pimpl習語的讀寫有什麼擔心? –