【问题标题】:Remove friend class dependency in the following case在以下情况下删除朋友类依赖
【发布时间】:2020-04-03 11:04:54
【问题描述】:
class foo
{
    bar b;

    someFunction()
    {
        b.alphaObj->someFunctionOfAlpha();
    }
};


class bar
{
    friend class foo;
    // many more friends

private:
    alpha *alphaObj;
};

如何在不使用 getter 和 setter 暴露私有成员的情况下删除朋友依赖项。 我知道朋友类可以帮助增强封装,但是在我的类中定义了很多朋友类,将私有成员暴露给所有人。因此,我正在考虑一种更好的方法,并感谢任何帮助。

【问题讨论】:

  • 需要很多朋友说明一组封装不好的类——为什么这么多类需要访问类栏?
  • 我们在这里处理遗留代码,就是这样。我们现在正在考虑用更好的设计进行重构
  • 这里的例子感觉有点太笼统,没用。通常someFunctionOfAlpha 想被转移到其他可以公开的班级。它可能是一个包装器,说bar 创建或成为bar 本身的成员。另一种选择是传递一个回调函数并调用它,而不是直接调用它。

标签: c++ friend ooad


【解决方案1】:

独立于您的friend 问题,需要编写此内容

b.alphaObj->someFunctionOfAlpha();

不是最好的设计。你应该调用 (*):

b.someFunctionOfAlpha();

现在如何删除好友也很明显了:

class bar
{
public:
    void someFunctionOfAlpha() { alphaObj->someFunctionOfAlpha(); }

private:
    alpha *alphaObj;
};

(*) 这个指南有一个名字,我现在找不到它。一般来说,调用方法应该像:“这样做!”。调用方法不应该像“给我看看你的内部结构,这样我就可以做我想做的事了”。

【讨论】:

  • 谢谢。这个答案显示了一个有效的观点,但没有回答这个问题。因此没有标记为正确
  • @abhilashanand 为什么它不回答这个问题?我将向您展示如何解决对friend 的需求
  • 是的。但这通过公开它间接暴露了 alpha 类的内部特征。我已经提到它是一个约束,不能通过 getter 和 setter 暴露内部功能
  • 我们进行了讨论,这非常好,因此标记为正确。另一个建议是让成员公开并使其成为一个常量,这样它就不能被修改。如果有很多变量,那么您的建议可能会导致大量代码。感谢您的努力
  • 我想你指的是上面的“得墨忒耳法则”:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2020-09-24
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多