这种面向密钥的访问保护模式是一种已知的习惯用法吗?

时间:2010-07-10 16:43:02

标签: c++ design-patterns friend access-control

Matthieu M.this answer中提出了一种我以前见过的访问保护模式,但从未有意识地考虑过模式:

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
    }
};

它允许更精细的访问控制,而不是Foo friend Bar,并避免更复杂的代理模式。

有谁知道这种方法是否已经有了名称,即是一种已知模式?

4 个答案:

答案 0 :(得分:12)

感谢your other question,看起来这种模式现在被称为“密钥”模式。

在C ++ 11中,它变得更加清晰,因为它不是调用

b.protectedMethod(SomeKey());

你可以打电话:

b.protectedMethod({});

答案 1 :(得分:7)

似乎这个成语就像在另一个SO问题here中提到的那样。它被称为律师 - 客户成语,并在更详细地描述there

答案 2 :(得分:2)

像我这样无聊的男人会做出有价值的代码:

int FraudKey=0;
b.protectedMethod(reinterpret_cast<SomeKey&>(FraudKey));

答案 3 :(得分:0)

非常接近这个:

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

基本上,如果你考虑对一个精心设计的类的对象的引用来提供 您需要实现任何实际有意义的访问控制策略的访问控制,将此模式应用于构造函数以外的任何其他内容似乎没有多大意义。

正如文章所述,如果你将这个键与那些构造函数结合使用 访问控制可能有意义,表示恐慌资源的重要部分的对象,在C ++中通常将实现为RAII对象,而不是名称RAIICap或RAII-Capability确实有意义。

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

或者,您可以使用更通用的名称来引用它,例如构造权限。

本文中的实现主要集中在一点,即主要需要创建所有权限密钥。您可以通过为密钥本身添加额外的公共构造函数来扩展它并使其更加灵活:

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

这样主要可以将密钥创建委托给程序的其他部分。

我个人认为RAI​​ICap名称非常适合这种模式的有用部分。

前段时间我提出上面这个简单的模板可以添加到标准库中。

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

不幸的是,存在一个问题,即可能有一个构成计算根的主指纹,所以这样的东西显然不能在标准库中占有一席之地。话虽如此,至少对于RAII类的构造函数的使用,这种模式似乎非常有用。