• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Перегрузка Оператора Вывода В Поток

  • Автор темы kashrman
  • Дата начала
K

kashrman

Добрый вечер.
Столкнулся со следующей странной проблемой:
При попытке перегрузить оператор вывода в поток << компилятор воспринимает его как оператор побитового сдвига, а необходимо именно как вывод в поток воспринимать.
Пример кода

C++:
class TestClass
{
public:
TestClass();
~TestClass();
std::ostream& operator<<(std::ostream& out, const TestClass& c);//на эту строку пишет ошибку
int i;
int j;
};

std::ostream& operator<<(std::ostream& out, const TestClass& c)
{
out<<"i="<<c.i;
out<<" s="<<c.s;
return out;
}
ошибка
1>e:\alfa96\keepout96\akfunction.h(46): error C2804: binary 'operator <<' has too many parameters

как быть? подскажите в чем дело?
 
L

lazybiz

Хмм... Я с трудом понимаю (если вообще понимаю) что ты хочешь сделать... А что ты хочешь сделать то?
 
S

Stashevckiy

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

Короче, правильно будет так:

C++:
#include "iostream"
using std::ostream;

class TestClass
{
friend ostream &operator<< ( ostream & out, const TestClass & c );

public:
TestClass( int = 0, int = 0 );
int i;
int j;
};
TestClass::TestClass( int a, int b )
{ 
i = a; 
j = b;
}
ostream & operator<<( ostream & out, const TestClass & c )
{
out<<"i="<<c.i;
out<<" s="<<c.j;
return out;
}


#include "iostream"
using namespace std;

#include "TestClass.h"

void main()
{
TestClass test(10, 10);

cout << test;
}

Добавлено: Т.е., если ты перегружаешь оператор и функция перегрузки определена в классе, то этот перегруженный оператор в качестве левого операнда принимает обьект класса, а вкачестве правого операнда - тип, который ты определишь. И, поскольку, функция перегрузки определенна в классе, то в качестве параметров не нужно указывать два обьекта, а лишь правый обьект. Если же она ( функция перегрузки ) будет определена вне класса, как дружественная например, то нужно указывать оба принимаемых операнда, как левый так и правый.
Надеюсь, помог. ;)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!