В C++, учитывая функцию членства в классе A, мы можем ограничить его доступ только к классу B, не давая B завершают друга доступ к A? [дубликат]

8
задан Community 23 May 2017 в 12:31
поделиться

2 ответа

Одним из возможных способов может быть создание доверенного класса, который обертывает 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);
}
5
ответ дан 5 December 2019 в 17:33
поделиться

Вы можете разделить интерфейс A на несколько чистых абстрактных базовых классов и затем дать B ссылку на интерфейс, который имеет соответствующий метод. Другие классы получат только те интерфейсы, которые не содержат этого метода. Имейте в виду, что это не очень масштабируемо, так как количество интерфейсов может быстро стать очень большим.

5
ответ дан 5 December 2019 в 17:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: