c++ - 与 friend 在类里面隐藏公共(public)细节的内部功能

标签 c++ class oop friend

我确信有更好的设计方法:

我有一个类(class),其生活的主要目的是照顾其他类(class),这些类(class)负责较小的事情。这些较小的类具有有限数量的公共(public)数据、一些只能从管理器类访问的方法,以及一组只能从其自身访问的内部函数。

我打算让经理类成为 friend ,但这将允许经理查看(和使用)较小类的内部功能,这并不理想。

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 测试它”,然后到我的办公 table 前开始写代码。他告诉我该怎么做,而不是他自己做。

但这基本上就是您的管理器类在您执行操作时所做的:c.internalWork();——管理器并没有告诉子对象该做什么;经理正在

friend 是一种代码味道。它们不一定是坏事,而且它们肯定有它们的用途——但它们是那种应该让你坐下来思考的东西,“我们真的需要这个吗?”在这种情况下,friend 的使用是对设计缺陷的一种破解。设计缺陷是您的子类没有公共(public)接口(interface),管理者可以通过该接口(interface)告诉他们该做什么。问题在于您的经理类只是举起手来自己完成工作。

修复你的类,让它们有一个合适的接口(interface),如果 friend 发布,就摆脱掉。

关于c++ - 与 friend 在类里面隐藏公共(public)细节的内部功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20428610/

相关文章:

c++ - 接收错误变量的类型不完整 "void"

c++ - 如何在 C++ 中将数字转换为字符串,反之亦然

Java类字谜

c++ - 如何在dll中使用CUDA?

android - 交叉编译: more difficult than it should be?

php - 如何在 php 中取消设置命名空间以访问全局类

c++ - 奇怪的输出?用户定义类 (C++)

oop - is.object 和 S3 类系统

architecture - 面向对象 : Can an interface implement another interface?

javascript - class.prototype.property 和 object.property 的区别