52

Matthieu M.は、この回答でアクセス保護のパターンを取り上げましたが、これは以前に見たことがありましたが、意識的にパターンを考慮したことはありませんでした。

class SomeKey { 
    friend class Foo;
    SomeKey() {} 
    // possibly make it non-copyable too
};

class Bar {
public:
    void protectedMethod(SomeKey);
};

ここでfriendは、キー クラスの のみが にアクセスできます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
    }
};

これにより、 ofを作成Fooするよりもきめ細かなアクセス制御が可能になり、より複雑なプロキシ パターンを回避できます。friendBar

このアプローチにすでに名前があるかどうか、つまり既知のパターンかどうかを知っている人はいますか?

4

4 に答える 4

15

他の質問のおかげで、このパターンは現在「パスキー」パターンとして知られているようです。

C++11 では、よりクリーンになります。

b.protectedMethod(SomeKey());

あなたはただ呼び出すことができます:

b.protectedMethod({});
于 2014-04-28T06:11:48.950 に答える
7

このイディオムは別の SO question hereで言及されているようです。これは Attorney-Client イディオムと呼ばれ、そこで詳しく説明されています。

于 2010-07-10T17:22:36.993 に答える
2

私のような退屈な男が以下のコードを作成します:</p>

int FraudKey=0;
b.protectedMethod(reinterpret_cast<SomeKey&>(FraudKey));
于 2014-09-19T02:11:13.657 に答える
0

これにかなり近い:

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

基本的に、適切に設計されたクラスのオブジェクトへの参照がアクセス制御を提供すると考える場合、実際に意味のあるアクセス制御ポリシーを実装する必要があります。このパターンをコンストラクター以外のものに適用しても、あまり意味がないようです。

したがって、この記事で述べられているように、このキーをこれらのコンストラクターと組み合わせて使用​​すると、アクセス制御が意味をなす可能性があるもの、恐怖のリソースの重要な部分を表すオブジェクト、C++ では一般的に RAIICap または RAII という名前よりも RAII オブジェクトとして実装されます。 -能力は確かに理にかなっています。

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

別の方法として、construct authority のようなより一般的な名前で参照することもできます。

この記事での実装は、すべての権限キーを作成する必要があるという、少しメイン中心の実装です。キー自体に追加のパブリック コンストラクターを追加することで、それを拡張してより柔軟にすることができます。

template <typename T>
class construct_authority {
  public:
    construct_authority(construct_authority<void> const&)
    friend int main(int,char **);
  private:
    construct_authority(){}
};

そうすれば、メインはキーの作成をプログラムの他の部分に委任できます。

個人的には、RAIICap という名前は、このパターンの有用な部分に非常に適していると思います。

少し前に、上記の単純なテンプレートを標準ライブラリに追加できると提案しました。

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

残念ながら、計算ルートを構成する 1 つのメイン フィンガープリントが存在する可能性があるという考えには問題があるため、このようなものは標準ライブラリに配置できないようです。そうは言っても、少なくとも RAII クラスのコンストラクターで使用する場合、このパターンは非常に便利なようです。

于 2014-12-18T09:13:38.727 に答える