c++ - 为什么执行 PassKey 模式的这段代码不能编译?
问题描述
这是代码,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;
}
编译器给出以下错误:
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>());}
解决方案
正如 pewt 所说,MyClass::func()
必须是public
为了Access::tryme()
能够访问它。在您在评论中链接的示例中,Citizen::getSocialSecurityNumber()
实际上是public
。这很好,因为访问以不同的方式受到限制。
你MyClass::func()
需要一个Passkey<Access>
参数——实际上除了Access
类本身之外,没有人被允许构造这样的对象。的所有Passkey
功能都是private
。通过构造,Access
是唯一friend
的Passkey<Access>
,所以只能Access
构造调用所需的“键” func()
。所以func()
表现得好像它是私有的,而不是实际上是私有的。
推荐阅读
- python - 将几个numpy数组存储为jpg图像python时丢失文件
- amazon-web-services - 如何将文档上传到签名的 AWS S3?什么是桶和对象?
- android - 自定义 url 方案在 Android 中不起作用反应原生
- django - django 从视图中设置模板 url
- sql - 使用子查询和标准值插入数据
- django - 网站间歇性加载失败 - DNS 有问题?
- python-3.x - 事件后触发周期性 celery 任务
- javascript - 单击按钮odoo时如何调用该函数
- angular - Angular5.x 用于长时间运行的服务器进程的进度报告
- ruby - 带有粉碎的Docker ruby容器 - 加载错误