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

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++ 中通常将实现为 RAII 对象,而不是名称 RAIICap 或 RAII - 能力确实是有道理的。

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

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

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

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

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

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

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

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

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

于 2014-12-18T09:13:38.727 回答