Подтвердить что ты не робот

Класс друзей с ограниченным доступом

Я хочу создать класс класса friend класса B. Я хочу сделать это, поскольку они очень сильно взаимодействуют, и A необходимо изменить внутренние элементы класса B (которые я не хочу раскрывать с помощью публики). Но я хочу убедиться, что он имеет доступ только к нескольким выбранным функциям не ко всем функциям.

Пример:

class A
{
};

class B
{
private:
 void setState();
void setFlags();
friend class A
};

Я хочу, чтобы A имел возможность доступа к setState, но не setFlags... Есть ли шаблон дизайна или хороший способ сделать это, или я оставил с предоставлением полного доступа или вообще никакого доступа в этом случае.

Спасибо

4b9b3361

Ответ 1

Это зависит от того, что вы подразумеваете под "хорошим способом":) У mod.lang.С++. модерируемый у нас был тот же вопрос некоторое время назад. Вы можете увидеть обсуждение, которое оно произвело там.

IIRC, мы закончили использование подхода "друг вложенного ключа". Применительно к вашему примеру это даст:

class A
{
};

class B
{
public:
     class Key{
         friend class A;
         Key();
     };

    void setFlags(Key){setFlags();}         

private:
  void setState();
  void setFlags();
};

Идея состоит в том, что public setFlags() должен быть вызван с помощью "Key", и только друзья Key могут создавать один, поскольку его ctor является закрытым.

Ответ 2

Один подход - через явные интерфейсы, потому что разработчик интерфейса может выбрать, кому они дают:

class NearlyPrivateInterface {
public:
   virtual void setState() = 0;
   virtual void setFlags() = 0;
};

class A {
public:
   void attach(NearlyPrivateInterface* instanceOfB);
};

class B: private NearlyPrivateInterface {
public:
   void attach(A& a) { a.attach(this); }
};

Ответ 3

Вы можете сделать следующее:

class A{
};

class B{
private: 
    void setFlags();
protected:
    void setState();

}; 

class RestrictedB :public B{  
    friend class A;
};