如何让两个类私有访问Rectangle的paint方法且不引入依赖?
解决Rectangle私有方法仅让Foo和Bar访问且互不依赖的问题
方案一:引入中间权限代理类
通过一个中间类作为权限中转,让Rectangle只信任这个代理类,再由代理类分别授权给Foo和Bar。这样Foo和Bar无需知晓彼此的存在。
代码实现:
// Rectangle.h class RectangleAccess; class Rectangle { private: void paint() {} // 仅让代理类访问私有方法 friend class RectangleAccess; }; // RectangleAccess.h // 只需前向声明Foo和Bar,无需包含它们的头文件 class Foo; class Bar; class RectangleAccess { private: // 封装对Rectangle::paint的调用 static void callPaint(Rectangle& rect) { rect.paint(); } // 分别授权给Foo和Bar friend class Foo; friend class Bar; }; // Foo.h #include "Rectangle.h" #include "RectangleAccess.h" class Foo { public: void operateRectangle(Rectangle& rect) { // 通过代理类间接调用私有方法 RectangleAccess::callPaint(rect); } }; // Bar.h #include "Rectangle.h" #include "RectangleAccess.h" class Bar { public: void operateRectangle(Rectangle& rect) { RectangleAccess::callPaint(rect); } };
方案二:模板特化+独立友元声明
针对Foo和Bar分别特化Rectangle模板,在特化版本中同时声明对方为友元。Rectangle的头文件只需前向声明两个类,避免Foo和Bar互相依赖。
代码实现:
// Rectangle.h // 前向声明Foo和Bar,无需包含头文件 class Foo; class Bar; // 基础模板,默认无友元 template <class T> class Rectangle { private: void paint() {} }; // 针对Foo的特化版本,同时允许Foo和Bar访问 template <> class Rectangle<Foo> { private: void paint() {} friend class Foo; friend class Bar; }; // 针对Bar的特化版本,同时允许Foo和Bar访问 template <> class Rectangle<Bar> { private: void paint() {} friend class Foo; friend class Bar; }; // Foo.h #include "Rectangle.h" class Foo { public: void useRectangle() { Rectangle<Foo> rect; rect.paint(); // 合法访问 } }; // Bar.h #include "Rectangle.h" class Bar { public: void useRectangle() { Rectangle<Bar> rect; rect.paint(); // 合法访问 } };
方案对比
- 方案一更灵活:后续若需新增有权限的类,只需在
RectangleAccess中添加friend声明,无需修改Rectangle类本身。 - 方案二更直接:无需额外代理类,但如果有权限的类数量增加,特化版本会增多,维护成本上升。
内容的提问来源于stack exchange,提问作者Yakov Dan
相关产品推荐
相关产品推荐

