Чистый эквивалент C++ для друга? (Ответ: Идиома адвоката-клиента)C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Чистый эквивалент C++ для друга? (Ответ: Идиома адвоката-клиента)

Сообщение Anonymous »

Почему в C++ есть общедоступные члены, которые каждый может вызывать, и объявления, которые предоставляют все частные члены данным внешним классам или методам, но не предлагают синтаксиса для предоставления определенных членов данным вызывающим объектам?

Я хочу выразить интерфейсы с некоторыми подпрограммами, которые будут вызываться только известными вызывающими объектами, без необходимости предоставлять этим вызывающим сторонам полный доступ ко всем частным объектам, что кажется вполне разумным. Лучшее, что я мог придумать сам (ниже), а также предложения других до сих пор вращаются вокруг идиом/шаблонов различной косвенности, где мне действительно просто нужен способ иметь 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); }
};
Я далек от того, чтобы стать гуру в области организации программного обеспечения, но мне кажется, что простота интерфейса и принцип наименьших привилегий прямо противоречат этому аспекту языка. Более ясным примером моего желания может быть класс Person с объявленными методами, такими как takePill(Medicine *) TellTheTruth() и forfeitDollars(unsigned int), вызов которых должны рассматриваться только экземплярами/методами-членами Physician, Judge или TaxMan соответственно. Мне не нравится необходимость в одноразовых прокси-классах или классах интерфейса для каждого основного аспекта интерфейса, но, пожалуйста, сообщите, если знаете, что я что-то упускаю.

От Дрю Холла принят ответ: Доктор Доббс - Дружба и идиома адвокат-клиент

В приведенном выше коде класс-оболочка изначально назывался «Прокси» вместо «Поверенный» и вместо ссылок использовались указатели. но в остальном было эквивалентно тому, что нашел Дрю, и которое я тогда счел лучшим общеизвестным решением. (Чтобы не слишком сильно себя хвалить...) Я также изменил подпись «restricted», чтобы продемонстрировать пересылку параметров. Общая стоимость этой идиомы — один класс и одно объявление друга для каждого набора разрешений, одно объявление друга для каждого утвержденного вызывающего объекта и одна оболочка пересылки для каждого предоставленного метода для каждого набора разрешений. Большая часть лучшего обсуждения ниже вращается вокруг шаблона переадресации вызовов, которого очень похожая идиома «Ключ» избегает за счет меньшей прямой защиты.

Подробнее здесь: https://stackoverflow.com/questions/321 ... ient-idiom
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»