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

Тема в разделе "Общие вопросы по С и С++", создана пользователем kashrman, 15 ноя 2011.

  1. kashrman

    kashrman New Member

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

    Код (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;
    }
    ошибка
    как быть? подскажите в чем дело?
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Хмм... Я с трудом понимаю (если вообще понимаю) что ты хочешь сделать... А что ты хочешь сделать то?
     
  3. Stashevckiy

    Stashevckiy Well-Known Member

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

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

    Код (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;
    }
    Добавлено: Т.е., если ты перегружаешь оператор и функция перегрузки определена в классе, то этот перегруженный оператор в качестве левого операнда принимает обьект класса, а вкачестве правого операнда - тип, который ты определишь. И, поскольку, функция перегрузки определенна в классе, то в качестве параметров не нужно указывать два обьекта, а лишь правый обьект. Если же она ( функция перегрузки ) будет определена вне класса, как дружественная например, то нужно указывать оба принимаемых операнда, как левый так и правый.
    Надеюсь, помог. ;)
     
  4. kashrman

    kashrman New Member

    Регистрация:
    15 ноя 2011
    Сообщения:
    4
    Симпатии:
    0
    да, спасибо
     
Загрузка...

Поделиться этой страницей