Я хочу выразить интерфейсы с некоторыми подпрограммами, которые будут вызываться только известными вызывающими объектами, без необходимости предоставлять этим вызывающим сторонам полный доступ ко всем частным объектам, что кажется вполне разумным. Лучшее, что я мог придумать сам (ниже), а также предложения других до сих пор вращаются вокруг идиом/шаблонов различной косвенности, где мне действительно просто нужен способ иметь single, простые определения классов, которые явно указывают, какие члены (более детально, чем я, мои дети или абсолютно любой) могут получить доступ к каким членам. Как лучше всего выразить концепцию, представленную ниже?
Код: Выделить всё
// Can I grant Y::usesX(...) selective X::restricted(...) access more cleanly?
void Y::usesX(int n, X *x, int m) {
X::AttorneyY::restricted(*x, n);
}
struct X {
class AttorneyY; // Proxies restricted state to part or all of Y.
private:
void restricted(int); // Something preferably selectively available.
friend class AttorneyY; // Give trusted member class private access.
int personal_; // Truly private state ...
};
// Single abstract permission. Can add more friends or forwards.
class X::AttorneyY {
friend void Y::usesX(int, X *, int);
inline static void restricted(X &x, int n) { x.restricted(n); }
};
От Дрю Холла принят ответ: Доктор Доббс - Дружба и идиома адвокат-клиент
В приведенном выше коде класс-оболочка изначально назывался «Прокси» вместо «Поверенный» и вместо ссылок использовались указатели. но в остальном было эквивалентно тому, что нашел Дрю, и которое я тогда счел лучшим общеизвестным решением. (Чтобы не слишком сильно себя хвалить...) Я также изменил подпись «restricted», чтобы продемонстрировать пересылку параметров. Общая стоимость этой идиомы — один класс и одно объявление друга для каждого набора разрешений, одно объявление друга для каждого утвержденного вызывающего объекта и одна оболочка пересылки для каждого предоставленного метода для каждого набора разрешений. Большая часть лучшего обсуждения ниже вращается вокруг шаблона переадресации вызовов, которого очень похожая идиома «Ключ» избегает за счет меньшей прямой защиты.
Подробнее здесь: https://stackoverflow.com/questions/321 ... ient-idiom
Мобильная версия