Подробные спецификаторы доступа C++

У меня есть следующий класс:-

class A {
  public:
    // some stuff that everyone should see
  protected:
    // some stuff that derived classes should see
  private:
    // some stuff that only I can see
    void f();
    void g();
};

Теперь я хочу, чтобы f () была доступна только из определенного набора классов (скажем, классов B,C,D) и g () была доступна из определенного другого набора классов (скажем, классов D,E,F). Есть ли способ указать это в C++? Если я сделаю все классы друзьями A, тогда оба f & g будут доступны из B,C,D,E,F (вместе с другими частными членами A), а это не то, что я хочу.

Это возможно, или я должен изменить свою объектную модель?

1 ответ

Решение
class A_f {
    friend class B;
    void f();
};

class A_g {
    friend class C;
    void g();
};

class A: public A_f, public A_g {
    friend class A_f;
    friend class A_g;
private:
    void do_f();
    void do_g();
};

inline void A_f::f() { static_cast<A *>(this)->do_f(); }
inline void A_g::g() { static_cast<A *>(this)->do_g(); }

void B::something(A *a) {
    a->f();
}
Другие вопросы по тегам