【问题标题】:operator overloading as a friend运算符重载为朋友
【发布时间】:2013-05-10 01:13:45
【问题描述】:

我正在尝试编写一个复数类,将operator + - * 重载为如下朋友:

ComplexNumber operator+(const ComplexNumber &c1, const ComplexNumber& c2)
{
    return ComplexNumber(c1._r+c2._r, c1._i+c2._i);
}

ostream& operator << ( ostream &out,  ComplexNumber &c){
    out << c.getReal() <<'+'
        << c.getImg()  <<'I' << std::endl; 
}

我在做的时候没有遇到任何问题:

ComplexNumber c1(1,2);
cout << c1 << endl;

但是当我尝试执行以下操作时:

ComplexNumber c2(2,1);
cout << c1 + c2 << endl;

我收到一个错误:

没有已知的参数 1 从“ComplexNumber”到“ComplexNumber&”的转换

我知道问题在于operator+ 的返回值是ComplexNumber,但ostream 运算符需要ComplexNumber&amp;

我不知道该如何处理。谢谢

【问题讨论】:

  • 只是为了确保您理解这一点,只要它是一个实际对象,而不仅仅是一个临时对象,T 可以传递给一个采用T&amp; 的函数。它所做的只是获取实际对象而不是复制它。与const T&amp; 的一个区别是您可以传入一个临时值,就像加两个后得到的一样。它将一直存在到完整表达式的末尾。
  • 是的,我明白了,谢谢

标签: c++ operator-overloading


【解决方案1】:

我不知道为什么它会说参数 1,但你应该让你的输出重载采用 const 引用:

ostream& operator << ( ostream &out,  const ComplexNumber &c){
                                      ^^^^^

这样比较好,因为可以使用临时的,不用修改。

【讨论】:

  • 当然,这只有在.getReal.getImg 也是const 函数时才有效。
  • @Xymotech,是的,我有点等着看是否会出现。无论如何,他们应该是。
  • 非常感谢,我什至把所有的朋友函数都改成了类函数来避免这种情况
  • @tintin,如果您可以从课堂外访问实部和虚部,最好的解决方案是像您一样将它们作为朋友功能,但不让他们成为朋友,并使用公共访问方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多