如何优雅实现仅向指定类暴露另一类的单个方法?
仅向指定类暴露单个方法的简洁实现
你的思路核心是通过私有构造的标记类限制方法调用权限,这个方向是对的,但现有实现可以进一步简化,去掉冗余的中间类和单例逻辑。
优化方案一:将访问标记内聚到目标类中
直接把用于权限控制的标记类放在Bar内部,同时仅允许Foo构造该标记,结构更紧凑,代码量更少:
class Foo; class Bar { public: // 仅允许持有AccessKey的调用者访问 void bar(AccessKey) { // 这里写bar方法的实际逻辑 } private: // 私有构造的访问标记,仅Foo能构造 class AccessKey { friend class Foo; AccessKey() = default; }; }; class Foo { public: Foo() { Bar().bar(Bar::AccessKey{}); // 编译通过,Foo可构造AccessKey } }; class Foo2 { public: Foo2() { // Bar().bar(Bar::AccessKey{}); // 编译失败,无法构造私有AccessKey } };
优化方案二:直接用友元限定私有方法
如果不需要保持bar的公共可见性,更简单的方式是把bar设为私有,仅让Foo成为Bar的友元:
class Foo; class Bar { private: void bar() { // 实际逻辑 } friend class Foo; // 仅Foo可访问bar }; class Foo { public: Foo() { Bar().bar(); // 编译通过 } }; class Foo2 { public: Foo2() { // Bar().bar(); // 编译失败,无访问权限 } };
原方案的冗余点说明
你原来的实现中,BarMethodGuard作为中间类完全可以省略,而且Guard的单例设计是不必要的——我们只需要一个无法被外部构造的标记对象,临时构造即可,不需要全局单例。
内容的提问来源于stack exchange,提问作者Edvard Davtyan
相关产品推荐
相关产品推荐

