Является ли этот ключ-ориентированный шаблон защиты доступа известной идиомой?

Matthieu M. разработал шаблон для защиты доступа в этом ответе, который я видел раньше, но никогда не считал его шаблоном:

class SomeKey { friend class Foo; SomeKey() {} // possibly make it non-copyable too }; class Bar { public: void protectedMethod(SomeKey); }; 

Здесь только friend of class class имеет доступ к protectedMethod() :

 class Foo { void do_stuff(Bar& b) { b.protectedMethod(SomeKey()); // fine, Foo is friend of SomeKey } }; class Baz { void do_stuff(Bar& b) { b.protectedMethod(SomeKey()); // error, SomeKey::SomeKey() is private } }; 

Он позволяет осуществлять более мелкомасштабный контроль доступа, чем делать Foo friend Bar и избегать более сложных прокси-шаблонов.

Кто-нибудь знает, имеет ли этот подход уже имя, т. Е. Это известный шаблон?

Благодаря вашему другому вопросу, похоже, этот шаблон теперь известен как шаблон «passkey».

В C ++ 11 он становится еще более чистым, потому что вместо вызова

 b.protectedMethod(SomeKey()); 

вы можете просто позвонить:

 b.protectedMethod({}); 

Похоже, эта идиома, подобная той, что упоминается в другом SO-вопросе здесь . Он называется идиомой Адвокат-Клиент и более подробно описан там .

какой-то скучный человек, как я, сделает код fowllow:

 int FraudKey=0; b.protectedMethod(reinterpret_cast(FraudKey)); 

Его довольно близко к этому:

http://minorfs.wordpress.com/2013/01/18/raiicap-pattern-injected-singleton-alternative-for-c/

В принципе, если вы считаете ссылку на объект хорошо продуманного classа, который должен обеспечить управление доступом, вам нужно реализовать любую политику управления доступом, которая действительно имеет смысл, применение этого шаблона ко всему, кроме конструктора, похоже, не имеет такого смысла.

Как говорится в статье, если вы используете этот ключ в сочетании с теми конструкторами, для которых может иметь смысл управление доступом, объекты, которые представляют значительную часть ресурсов пугает, то в C ++ обычно реализуются как объекты RAII, чем имя RAIICap или RAII Способность действительно имеет смысл.

http://www.eros-os.org/essays/capintro.html

В качестве альтернативы вы можете ссылаться на него с более общим именем, например, над конструкцией.

Реализация в этой статье немного в основном сосредоточена, то есть в основном необходимо создать все ключи полномочий. Вы можете расширить его и сделать его более гибким, добавив дополнительный публичный конструктор для самого ключа:

 template  class construct_authority { public: construct_authority(construct_authority const&) friend int main(int,char **); private: construct_authority(){} }; 

Таким образом, главная функция может делегировать создание ключа другим частям программы.

Лично я считаю, что имя RAIICap вполне подходит для полезной части этого шаблона.

Некоторое время назад я предложил, чтобы этот простой шаблон выше можно было добавить в стандартную библиотеку.

https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/p_v-aYIvO1E

К сожалению, есть проблемы с идеей о том, что может быть один основной отпечаток, который представляет собой вычислительный корень, поэтому что-то вроде этого, по-видимому, не может иметь места в стандартной библиотеке. Сказав это, по крайней мере, для использования с конструктором classов RAII, эта схема представляется весьма полезной.

  • UI Design Pattern для Windows Forms (например, MVVM для WPF)
  • ViewPager и fragmentы - какой способ сохранить состояние fragmentа?
  • Реляционные шаблоны проектирования баз данных?
  • Что такое инверсия контроля?
  • Шаблоны проектирования: абстрактный завод по сравнению с заводским методом
  • Почему и как избежать утечек памяти обработчика событий?
  • Как объяснить инъекцию зависимости к 5-летнему ребенку?
  • Разница между статическим classом и одноэлементным шаблоном?
  • Инъекция зависимостей и шаблон Singleton Design
  • Синглтон, поясняющий Джон Скит
  • Можете ли вы объяснить шаблон дизайна контекста?
  • Interesting Posts

    Как выбрать сетевой интерфейс по умолчанию для Интернета?

    Перечисления Java: два типа перечислений, каждый из которых содержит ссылки друг на друга?

    Как я могу написать «использовать эту ячейку или, если пусто, использовать эту другую ячейку» в Excel 2007?

    Как сжать жесткий диск более эффективно

    DataContract Сериализация XML и атрибуты XML

    Удаление символической ссылки папки Ubuntu удаляет содержимое целевой папки, когда выполняется через OSX & Samba

    C ++: инициализатор конструктора для массивов

    Как запустить диалог свойств файла из командной строки?

    Что такое утилизация Addomain

    Вход в кросс-домен – как автоматически войти в систему при переходе из одного домена в другой

    Вывод типа Java: ссылка неоднозначна в Java 8, но не Java 7

    Какие функции C99 доступны в компиляторе MS Visual Studio?

    Является ли String.Format таким же эффективным, как StringBuilder

    Firebase DatabaseException: Не удалось преобразовать значение типа java.lang.Long в String

    MySQL SELECT WHERE datetime соответствует день (и не обязательно время)

    Давайте будем гением компьютера.