Одним из возможных способов может быть создание доверенного класса, который обертывает 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);
}
Вы можете разделить интерфейс A
на несколько чистых абстрактных базовых классов и затем дать B
ссылку на интерфейс, который имеет соответствующий метод. Другие классы получат только те интерфейсы, которые не содержат этого метода. Имейте в виду, что это не очень масштабируемо, так как количество интерфейсов может быстро стать очень большим.