Перегрузка C ++ Оператор Вставки (<<) - PullRequest
4 голосов
/ 01 февраля 2012

Я пытаюсь написать класс, который перегружает оператор вставки, но в моем заголовочном файле я получаю сообщение об ошибке.

Overloaded 'operator<<' must be a binary operator (has 3 parameters)

Вот мой код:

.h файл

ostream & operator<<(ostream & os, Domino dom);

.cpp файл

ostream & operator<< (ostream & os, Domino dom) {
    return os << dom.toString();
}

Я слежу за учебниками, и это то, что они используют в качестве примера, но оно не работает для меня .. Есть предложения?

Ответы [ 3 ]

14 голосов
/ 01 февраля 2012

Вы, вероятно, поместили свой operator<< в объявление класса. Это означает, что требуется дополнительный скрытый параметр (параметр this). Вы должны поместить это вне любого объявления класса.

10 голосов
/ 01 февраля 2012

Оператор вставки (<<) может использоваться в качестве функции-члена или функции-друга. </p>

оператор << используется в качестве функции-члена </strong>

ostream& operator<<(ostream& os);

Эта функция должна вызываться как:

dom << cout;

Как правило, если вы используете оператор в качестве функции-члена, левая часть оператора должна быть объектом. Затем этот объект неявно передается в качестве аргумента функции-члену. Но вызов сбивает с толку пользователя и выглядит не очень красиво.

оператор << используется в качестве функции друга </strong>

friend ostream& operator<<(ostream& os, const Domino& obj);

Эта функция должна вызываться как:

cout << dom;

В этом случае объект dom явно передается как ссылка. Этот вызов более традиционный, и пользователь может легко понять смысл кода.

0 голосов
/ 01 сентября 2016
/*insertion and extraction overloading*/
#include<iostream>
using namespace std;
class complex
{
   int real,imag;

public:
    complex()
    {
      real=0;imag=0;
    }
    complex(int real,int imag)
    {
        this->real=real;
        this->imag=imag;
    }
    void setreal(int real)
    { 
        this->real=real; 
    }
    int getreal()
    {
       return real;
    }
    void setimag(int imag)
    { 
        this->imag=imag; 
    }
    int getimag()
    {
       return imag;
    }
    void display()
     {
      cout<<real<<"+"<<imag<<"i"<<endl;
     }

};//end of complex class

 istream & operator >>(istream & in,complex &c)
     {
         int temp;
         in>>temp;
         c.setreal(temp);
         in>>temp;
         c.setimag(temp);
         return in;
     }
 ostream &operator <<(ostream &out,complex &c)
 {
     out<<c.getreal()<<c.getimag()<<endl;
     return out;
 }

int main()
{
  complex c1;
  cin>>c1;
 // c1.display();

  cout<<c1;
  //c1.display();
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...