Класс друзей с ограниченным доступом
Я хочу создать класс класса friend класса B. Я хочу сделать это, поскольку они очень сильно взаимодействуют, и A необходимо изменить внутренние элементы класса B (которые я не хочу раскрывать с помощью публики). Но я хочу убедиться, что он имеет доступ только к нескольким выбранным функциям не ко всем функциям.
Пример:
class A
{
};
class B
{
private:
void setState();
void setFlags();
friend class A
};
Я хочу, чтобы A имел возможность доступа к setState, но не setFlags... Есть ли шаблон дизайна или хороший способ сделать это, или я оставил с предоставлением полного доступа или вообще никакого доступа в этом случае.
Спасибо
Ответы
Ответ 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;
};