Не удалось инициализировать оператор функции друга << - PullRequest
0 голосов
/ 04 ноября 2011

У меня проблема с функциями друзей.

Я полагаю, что это единственная необходимая часть кода. Моя проблема с этой функцией.Там написано, что проблема с первой строкой, но я не знаю, насколько это точно.

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: ошибка: не могу инициализировать функцию друга - оператор<< â </p>

lab10.cpp: 95: ошибка: объявление друга не в определении класса

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 04 ноября 2011

Вы должны указать функцию, которой принадлежит класс.Вы либо помещаете эту функцию в объявление класса:

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;
}
1 голос
/ 04 ноября 2011

У вас есть прототип функции друга в классе? Вам нужно что-то внутри класса, указывающее, что это функция друга. Как линия

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

или что-то. Посмотрите полный пример для перегрузки операторов вставки / извлечения для получения дополнительной информации.

0 голосов
/ 20 января 2012
#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;

} 

ВЫХОД: 100 Привет 100 Привет Нажмите любую клавишу для продолжения…

Это может быть функция друга только потому, что объект находится в правой части <<оператор и аргумент cout находятся на lhs.Так что это не может быть функцией-членом класса, это может быть только функция друга. </strong>

...