课堂内部功能与朋友隐藏公共细节

时间:2013-12-06 16:16:27

标签: c++ class oop 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

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

我以谋生为目标;我在一家软件公司工作。我有一个老板偶尔会给我一个任务。

当他给我一个任务时,他只是说“去写这个小部件,然后将其提交给源代码控制。然后告诉QA测试它。”

做的是告诉我“去写这个小部件,然后将其提交给源代码控制。然后告诉QA测试它”,然后来到我的办公桌开始写码。他告诉我该怎么做 - 不是自己做的。

但这基本上就是你的经理人课所做的事情:c.internalWork(); - 经理不会告诉孩子对象做什么;经理正在它。

friend是代码气味。它们不一定是坏事,它们肯定有它们的用途 - 但它们应该让你坐下来思考,“我们真的需要这个吗?”在这种情况下,使用friend是一个围绕设计缺陷的黑客行为。设计缺陷是您的子类没有公共接口,管理员可以通过该接口告诉他们该做什么。黑客就是这样一个事实,那就是你的经理级别只是把它放在手上并自己完成工作。

修复你的课程,使他们有一个合适的界面,并在friend发货时摆脱。

答案 1 :(得分:0)

manager以外的其他内容是否需要查看child课程?为什么不完全隐藏child的实现,以便只能使用pimpl idiommanager访问它?

如果这是不可接受的,为什么要将child的成员函数与公共数据结合起来呢?为什么不将它作为一个只包含公共数据成员的结构,以及一系列用于操作这些数据成员的免费函数?然后,您可以以类似的方式控制对所述自由函数的访问,只允许它们在manager的实现所在的翻译单元中可见。

答案 2 :(得分:0)

经理不是孩子,也不是孩子的朋友。他是经理。经理需要孩子的界面能够管理,或者更具体地告诉孩子该做什么,并且要知道什么时候完成工作,但他不需要微观管理,他没有必要看到孩子的内部数据。孩子需要保护其内部数据,但它需要公共接口才能从管理器获取任务,除了管理器之外的任何人都需要,并且需要能够在任务完成时告诉管理员。