【问题标题】:protected stream operator in an abstract class抽象类中的受保护流运算符
【发布时间】:2013-07-28 14:19:52
【问题描述】:

我见过几个抽象类的例子,有一个朋友operator<< 和一个虚拟的“print”成员函数,其中两个声明都在protected 部分。例如:

class Function{
public:
    virtual ~Function() {} 
    virtual double value(const double x) const = 0;
    virtual Function* clone() const = 0;
protected:
    friend ostream& operator<<(ostream& os, Function& f);
    virtual void print(ostream& os) const = 0;
};

ostream& operator<<(ostream& os, Function& f){
    f.print(os);
    return os;
}

我不明白为什么这是强制性的。有人可以解释吗?

谢谢!

【问题讨论】:

  • 为什么 what 是强制性的?
  • 请学会正确写声明...你没注意到your previous question被编辑了吗? (链接:stackoverflow.com/posts/17907019/revisions)读“decleration”让我很难过:'(
  • 好吧,我自己修好了……现在还有operator&lt;&lt;的参数Function&amp; f应该是const Function&amp; f(两次),因为打印f应该不 i> 修改它,但我不想碰代码(实际上我刚刚注意到我在类定义后添加了一个缺少的;)。

标签: c++ operator-overloading abstract-class protected


【解决方案1】:

首先,在哪里声明 friend 函数/运算符并不重要。不是publicprotectedprivate。它只是一个friend 函数/运算符,因此它可以访问类的成员,而不管它们的访问限制。所以流操作符不受保护。它是一个friend,这允许它访问print() 方法。

其次,print 方法应该是private。如果您想从更派生的基类中调用基类的print 方法,则将其设为protected 才有意义。但设计表明这是一个实现细节,以便实现ostream&amp; operator&lt;&lt;

另一方面,如果您设计的类使得 print 方法公开是有意义的,那么 ostream&amp; operator&lt;&lt; 就不需要成为 friend

【讨论】:

  • 为什么print 函数应该是私有的?因为它是const,它不能使任何不变量无效,它没有前置条件,也没有你可以验证的后置条件。实际上,它可以通过&lt;&lt; 从公共界面访问。我想不出任何可能的理由不让它成为public
  • @JamesKanze 我认为它是实现输出流运算符&lt;&lt; 的一种手段。因此,我认为在类的公共接口中不需要它。
【解决方案2】:

这当然不是强制性的。事实上,我认为它是 糟糕的设计。

你把朋友声明放在哪里并不重要;使用权 说明符不适用于它。由于operator&lt;&lt; is 部分 公共接口的,不管你在哪里声明它,它 在类的公共区域声明它更有意义, 因为那是不是从该类派生的用户将 寻找它。

关于print 函数,我也可以,所以没有真正的 宣布它不是公开的原因。鉴于大多数, 如果不是所有访问都将通过朋友operator&lt;&lt;, 这可能无关紧要,但我看不出有什么收获 声明它private。作为一般规则,nothing 是 通过声明任何东西获得protected;很少使用 protected。在 1990 年代中期,有人认为你应该 声明 virtaul 函数 protected,而不是 public,并且 标准库的部分内容仍然反映了这一约定。 但我认为今天的共识是 1) 如果这条规则 适用,虚函数应该是private,而不是 protected,和 2) 这条规则并不总是适用——在 const 函数的情况,例如 print,它实际上从不 适用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 2017-06-14
    • 1970-01-01
    • 2014-03-04
    • 2015-03-30
    • 2017-01-30
    • 2013-11-13
    相关资源
    最近更新 更多