可能重复:
clean C++ granular friend equivalent? (Answer: Attorney-Client Idiom)
我想要这几次,并且无法想出一个像样的方法。
假设我在A类中有一个成员函数。我希望能够从一个不相关的B类调用该函数,但通常不能调用。您可能会说,“当然,将该功能设为私有,并宣布B为A的朋友。”这就是我一直在做的事情,但似乎有点矫枉过正。我真的不想让B访问A中的所有内容,只需要一个函数。
简而言之:A::func()
只能由B级调用,但B未被宣布为A的朋友。可能吗?
答案 0 :(得分:5)
您可以将A
的接口拆分为几个纯抽象基类,然后为B
提供对具有适当方法的接口的引用。其他类只会获得不包含此方法的接口。请记住,这不是很可扩展,因为接口的数量很快就会变得非常大。
答案 1 :(得分:5)
一种可能的方法是创建一个包装A::func
的可信类,并将包装器对象传递给B
。这又需要包装器成为A
的朋友,但是你只需要管理一个这样的类,而所有外部类都可以使用包装器。
示例:
class Wrapper;
class A {
private:
void func();
/* other methods */
public:
Wrapper getWrapper();
friend class Wrapper;
};
class Wrapper {
private:
A &ref;
private:
Wrapper(A &obj) : ref(obj) { }
public:
void func() {
ref.func();
}
friend class A;
};
Wrapper A::getWrapper() {
return Wrapper(*this);
}