класс друзей с ограниченным доступом - PullRequest
12 голосов
/ 22 октября 2009

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

Пример:

class A
{
};

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

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

Спасибо

Ответы [ 3 ]

26 голосов
/ 22 октября 2009

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

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

class A
{
};

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

    void setFlags(Key){setFlags();}         

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

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

7 голосов
/ 23 октября 2009

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

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); }
};
2 голосов
/ 23 октября 2009

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

class A{
};

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

}; 

class RestrictedB :public B{  
    friend class A;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...