与朋友在课堂上进行内部功能,以隐藏公共细节
Internal functions in class with friends to hide public detail
我相信有一种更好的设计方法:
我有一个班,他生活的主要目的是照顾其他照顾小事的班。这些较小的类具有数量有限的公共数据、一些只能从管理器类访问的方法,以及一组只能从自身访问的内部函数。
我本来打算让manager类成为一个朋友,但这将允许manager查看(并使用)较小类的内部功能,这并不理想。
class child
{
public:
int x;
private:
friend class manager;
doSomething();
internalWork();
};
class manager
{
public:
child c;
};
manager m;
int i = m.c.x; // OK
c.doSomething(); // From method inside 'manager': OK
c.internalWork(); // Not allowed, only 'child' can use this function
有什么想法吗?
当他给我一个任务时,他只是简单地说:"去写这个小部件,然后把它提交给源代码管理。然后告诉QA测试它。"
他没有做的是告诉我"去写这个小部件,然后把它提交给源代码管理。然后告诉QA测试它",然后来到我的办公桌开始写代码。他在告诉我该做什么,而不是自己做。
但这基本上就是您的管理器类在执行以下操作时所做的:c.internalWork();
——管理器没有告诉子对象该做什么;经理正在做。
friend
s是一种代码气味。它们不一定是坏事,当然也有其用途——但它们应该让你坐下来思考,"我们真的需要这个吗?"在这种情况下,friend
的使用是围绕设计缺陷进行的黑客攻击。设计缺陷在于,你的子类没有一个公共接口,管理员可以通过这个接口告诉他们该做什么。破解的原因是,你的管理员类只是举起手来自己做工作。
修复你的类,使它们有一个合适的接口,并在friend
发布时删除。
除了manager
之外,还有其他东西需要查看child
类吗?为什么不完全隐藏child
的实现,使其只能从使用pimpl习惯用法的manager
访问呢?
如果这是不可接受的,为什么要将child
的成员函数耦合到公共数据?为什么不让它成为一个只有公共数据成员的结构,再加上一堆用于操作这些数据成员的免费函数呢?然后,您可以以类似的方式控制对所述自由函数的访问,只需使它们在manager
实现所在的翻译单元中可见。
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- 结构和双指针隐藏在其他结构中,多层混淆
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 参数包构造函数在类模板中隐藏用户定义的转换
- 如何等待窗口隐藏在Qt中?
- 如何使用类型别名从模板化类中隐藏模板列表
- 在设计 SDK 时,我是否应该在 C++ 头文件中完全隐藏内部类?
- 'using namespace'实现细节的便捷方法(仅标头库)?
- 名称隐藏对静态函数继承的实例使用
- 在 Linux 中使用 ioctl() 获取隐藏功能报告时,零字节消失
- 从多个模板化基类派生时出现"隐藏重载的虚函数"警告
- 如何在 Omnet++ 5.6.1 中隐藏箭头?
- 在C++中隐藏键盘记录器的控制台窗口
- 从静态库使用时隐藏不透明结构的内容
- 用于隐藏结构细节的迭代器适配器
- 如何在C++共享库中隐藏业务对象的实现细节并提供接口
- 接口,在C++中隐藏具体的实现细节
- 与朋友在课堂上进行内部功能,以隐藏公共细节
- 循环包含在c++头文件中隐藏实现细节的技巧
- 通过减少填充头的数量来隐藏实现细节