Questo modello di protezione dell’accesso orientato alle chiavi è un idioma conosciuto?

Matthieu M. ha presentato un modello per la protezione dell’accesso in questa risposta che avevo già visto, ma non ho mai preso in considerazione un modello:

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

Qui solo un friend della class chiave ha accesso a 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 } }; 

Consente un controllo dell’accesso più granulare fine rispetto a rendere Foo un friend di Bar ed evita schemi di proxy più complessi.

Qualcuno sa se questo approccio ha già un nome, cioè, è un modello noto?

    Grazie alla tua altra domanda sembra che questo modello sia ora noto come pattern “passkey”.

    In C ++ 11, diventa ancora più pulito, perché invece di chiamare

     b.protectedMethod(SomeKey()); 

    puoi semplicemente chiamare:

     b.protectedMethod({}); 

    Sembra che questo idioma come quello menzionato in un’altra domanda SO qui . È chiamato idioma Avvocato-Cliente e descritto in ulteriori dettagli lì .

    un uomo noioso come me farebbe il codice fowllow:

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

    È piuttosto vicino a questo:

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

    Fondamentalmente se si considera un riferimento a un object di class ben progettato per fornire il controllo degli accessi è necessario implementare qualsiasi politica di controllo accessi che abbia effettivamente senso, applicare questo modello a qualcosa di diverso dal costruttore non sembra avere molto senso.

    Quindi, come afferma l’articolo, se si utilizza questa chiave in congiunzione con quei costruttori per quale controllo di accesso potrebbe avere senso, oggetti che rappresentano parti significative di risorse spaventose, che in C ++ sarebbero generalmente implementate come oggetti RAII, rispetto al nome RAIICap o RAII -La capacità potrebbe davvero avere senso.

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

    In alternativa è ansible fare riferimento ad esso con un nome più generale come autorità di costruzione.

    L’implementazione nell’articolo è un po ‘troppo centrata, ovvero, le principali necessità di creare tutte le chiavi di authorization. Puoi estenderlo e renderlo più flessibile aggiungendo un costruttore pubblico aggiuntivo per la chiave stessa:

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

    In questo modo main potrebbe debind la creazione della chiave ad altre parti del programma.

    Personalmente penso che il nome RAIICap sia abbastanza appropriato per la parte utile di questo modello.

    Qualche tempo fa ho proposto che questo semplice modello sopra potesse essere aggiunto alla libreria standard.

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

    Sfortunatamente ci sono problemi con l’idea che possa esistere un’impronta digitale principale che costituisce una radice computazionale, quindi apparentemente qualcosa del genere non può avere un posto nella libreria standard. Detto questo, almeno per l’uso con il costruttore di classi RAII, questo modello sembra essere abbastanza utile.