【问题标题】:Why have to use friend function为什么一定要使用好友功能
【发布时间】:2016-02-18 08:44:07
【问题描述】:

我正在尝试通过相同的方法重载运算符'='和运算符'

class Vect{
 public:
  //..
   Vect& operator=(const Vect& a);      
   ostream& operator<<(ostream& out, const Vect& vect);
  //..
 private:
  int *data;
  int size;
};

这个作品

Vect& Vect:: operator=(const Vect& a){
 //.. 
 //copy data operator
 for(int i = 0; i< size; i++){
  data[i] = a.data[i];
 }
 return *this;
}

但是:此代码导致错误
[错误] 'std::ostream& Vect::operator

ostream& Vect::operator<<(ostream& out, const Vect& vect){
 //.. print vect
}

我正在阅读“C++ 中的数据结构和算法”一书部分 (1.5.4)。 他们说我必须使用班级朋友来重载'访问私有成员数据。 我不明白为什么。重载 '=' 运算符,我也可以在不使用“朋友”的情况下访问私有成员数据。

【问题讨论】:

  • 你不好奇你得到的错误吗?因为它没有说明访问私有数据成员的任何内容。 (虽然这也可能是一个问题,一旦你解决了导致当前错误的问题)。

标签: c++ friend


【解决方案1】:

当你在类定义中放置一个函数声明时,它默认成为一个成员函数,所以...

class Vect {
  public:
    ostream& operator<<(ostream& out, const Vect& vect);
};

...不会编译,因为它请求创建一个带有太多参数参数的 &lt;&lt; 函数:任何成员函数 operator&lt;&lt; 都应该使用 *this 作为“左侧”参数,并且将另一个论点视为“右手边”。

你有两个选择:

  • 将上面的内容替换为friend ostream&amp; operator&lt;&lt;(ostream&amp; out, const Vect&amp; vect);,它告诉编译器该函数是周围类的朋友,但不是其中的成员。作为非成员,它操作的两个参数是out 和vect - 不涉及*this 对象。一切正常,作为friend,该定义还可以访问vect 中的私有和受保护成员数据。

  • 将operator&lt;&lt; 声明移到class Vect 定义之外;这也使它成为一个非成员函数,但 不 使它成为朋友。

【讨论】:

    【解决方案2】:

    重载 '=' 运算符我也可以访问私有成员数据而不使用“朋友”

    operator=被声明为成员函数,可以访问私有成员。

    他们说我必须使用班级朋友来重载'

    问题是您将operator&lt;&lt; 声明为成员函数,而应将其声明为非成员函数。这就是你得到错误的原因。

    operator&lt;&lt; 应该是一个非成员函数,因为它需要一个不同的类型作为其左侧参数,即 std::ostream&amp;,而不是声明为成员函数时的 Vect&amp;。

    也就是说,作为非成员函数,operator&lt;&lt; 无法访问该类的私有成员,除非您将其声明为友元,例如:

    class Vect {
    public:
      //..
        friend ostream& operator<<(ostream& out, const Vect& vect);
      //..
    

    请注意,上面的语法现在使operator&lt;&lt; 成为非成员函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 2012-02-09
      相关资源
      最近更新 更多