无法初始化友元函数运算符<<

时间:2011-11-04 03:08:32

标签: c++ operator-overloading friend-function

我遇到朋友功能问题。

我认为这是所需代码的唯一部分..我的问题是这个功能。它说问题出在第一行,但我不知道它是多么准确。

friend ostream & operator << (ostream & b, Book & a)
    {
    b.setf(ios::fixed | ios::showpoint);
    b.precision(2);
    b << "Title     :  \"" << a.title << "\"\n"
    << "Author      : \"" << a.author << "\"\n"
    << "Price       : $" << a.price / 100.0 << endl
    << "Genre       : " <<a.genre << endl
    << "In stock? " << (a.status ? "yes" : "no") << endl
    << endl;
    return b;
    }

我收到错误: lab10.cpp:95:错误:无法初始化好友函数âoperator&lt;&lt;â

lab10.cpp:95:错误:朋友声明不在课程定义中

提前致谢

3 个答案:

答案 0 :(得分:1)

你在课堂上有朋友功能原型吗?你需要在类中有一些东西,表明这是一个友方函数。喜欢这条线

  friend ostream& operator<<(...);

或者其他什么。查找一个完整的示例,用于重载插入/提取操作符以获取更多信息。

答案 1 :(得分:1)

你必须指定函数是哪个类的朋友。您可以将该函数放在类声明中:

class Book{
...
  friend ostream & operator << (ostream & b, Book & a)
    {
    b.setf(ios::fixed | ios::showpoint);
    b.precision(2);
    b << "Title     :  \"" << a.title << "\"\n"
    << "Author      : \"" << a.author << "\"\n"
    << "Price       : $" << a.price / 100.0 << endl
    << "Genre       : " <<a.genre << endl
    << "In stock? " << (a.status ? "yes" : "no") << endl
    << endl;
    return b;
  }
};

另一种方法是将它声明为类中的朋友,并在其他地方定义它:

class Book{
...
    friend ostream & operator << (ostream & b, Book & a);
};

...

// Notice, there is no "friend" in definition!
ostream & operator << (ostream & b, Book & a)
    {
    b.setf(ios::fixed | ios::showpoint);
    b.precision(2);
    b << "Title     :  \"" << a.title << "\"\n"
    << "Author      : \"" << a.author << "\"\n"
    << "Price       : $" << a.price / 100.0 << endl
    << "Genre       : " <<a.genre << endl
    << "In stock? " << (a.status ? "yes" : "no") << endl
    << endl;
    return b;
}

答案 2 :(得分:0)

#include <iostream>
#include <string>
using namespace std;

class Samp
{
public:
    int ID;
    string strName; 
    friend std::ostream& operator<<(std::ostream &os, const Samp& obj);
};
 std::ostream& operator<<(std::ostream &os, const Samp& obj)
    {
        os << obj.ID<< “ ” << obj.strName;
        return os;
    }

int main()
{
   Samp obj, obj1;
    obj.ID = 100;
    obj.strName = "Hello";
    obj1=obj;
    cout << obj <<endl<< obj1;

} 

输出: 你好 你好 按任意键继续......

这可以是友元函数,因为该对象位于&lt;&lt;&lt;&lt;运算符和参数cout在lhs上。所以这不能成为班级的成员函数,它只能是朋友的功能。