C++ 为什么赢了';这段代码,实现密钥模式,编译?

C++ 为什么赢了';这段代码,实现密钥模式,编译?,c++,c++11,design-patterns,friend-class,C++,C++11,Design Patterns,Friend Class,下面是代码c++11: #include<stdio.h> #include<iostream> template<typename T> class Passkey { friend T; Passkey() {} Passkey(const Passkey&) {} Passkey& operator=(const Passkey&) = delete; }; class Access; cla

下面是代码c++11:

#include<stdio.h>
#include<iostream>

template<typename T>
class Passkey
{
    friend T;
    Passkey() {}
    Passkey(const Passkey&) {}
    Passkey& operator=(const Passkey&) = delete;
};

class Access;

class MyClass
{
   public:
      MyClass() {}

   private:
      void func(Passkey<Access>) { std::cout<<"here" << std::endl;}
};

class Access
{
    public:
      void tryme(MyClass& c) { c.func(Passkey<Access>());} 
};

int main ()
{
   MyClass c;
   Access a;
   a.tryme(c);
   return 0;
}
#包括
#包括
样板
类密钥
{
朋友T;
密钥(){}
密钥(常量密钥&){}
密码和运算符=(常量密码和)=删除;
};
类访问;
类MyClass
{
公众:
MyClass(){}
私人:
void func(Passkey){std::cout
func()
MyClass
访问
private
方法,除非它是
MyClass
朋友,否则不能调用
func

使
密码
成为
访问
朋友
(据我所知…)不允许使用
MyClass
私有
方法

通过

私有成员不能在类之外访问;只能通过类的方法访问它们


正如pewt所说,
MyClass::func()
必须是
public
,以便
Access::tryme()
能够访问它。在中,
Citizen::getSocialSecurityNumber()
实际上是
public
,这很好,因为访问受到不同的限制


您的
MyClass::func()
接受一个
密钥
参数,并且除了
访问
类本身
之外,实际上不允许任何人构造这样的对象。所有
密钥
的函数都是
私有的
。通过构造,
访问
密钥
的唯一
朋友
,因此只有
 Access
可以构造调用
func()
所需的“键”。因此
func()
的行为就好像它是私有的,而实际上它本身并不是私有的。

密码模式的全部要点是避免使用
friend
这样的密码。但是OP做的密码是错误的。我已经根据实现了它。我想它是不正确的。啊,谢谢。不熟悉该模式:我只是在评论为什么代码是私有的不是在构建。@LightnessRacesinOrbit我读到的每一篇关于passkey的文章都是这样使用friend实现的。你有什么不同的地方吗?链接的文章实现它的方式与你上面使用它的方式不同。啊,是的,就是这样。我完全忽略了这一点,并认为该函数是私有的,但显然是有意义的。谢谢!Glad我们可以提供帮助。如果您发现您的问题已经得到回答,请记住。请更正您的行号,请参阅。编译器正在确切地告诉您为什么它没有编译。您认为这是错误的吗?如果是,为什么?如果不是,为什么您希望从类外访问私有成员(并且没有
朋友
)?我只是想发表一条评论,感谢你让我注意到“密钥”模式。我以前从未听说过它。有趣的技术。
prog.cpp: In member function 'void Access::tryme(MyClass&)':

prog.cpp:21:12: error: 'void MyClass::func(Passkey<Access>)' is private
           void func(Passkey<Access>) { std::cout<<"here" << std::endl;}
                ^

prog.cpp:27:56: error: within this context
     void tryme(MyClass& c) { c.func(Passkey<Access>());}