Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка операторов << и >> 
V
    Опции темы
Elfet
Дата 8.9.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Запутался с перегрузкой << и >> для потоков smile
Я хочу перегрузить их для своего класса, что бы можно было вводить и выводить динамический целоцисленный массив.
Код

cin >> t1 >> t2 >> t3;
cout << t1 << t2 << t3;

И для файлов так же:
Код

f1 >> t1 >> t2 >> t3;
f2 << t1 << t2 << t3;


Это сообщение отредактировал(а) Elfet - 8.9.2006, 12:28


--------------------
PM MAIL WWW Skype   Вверх
Daevaorn
Дата 8.9.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Elfet, извинете, а в чем проблема? Если "запутался", то значит что-то пробовал, а если так - давай код, будем разбираться вместеsmile
PM MAIL WWW   Вверх
Elfet
Дата 8.9.2006, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Вот так вот пытаюсь перегрузить операции
Код

ostream myclass::operator << (ostream & s)
{
    for(int i=0; i<size; i++)
    {
        s << stack[i] << '\n';
    }
    cout << "Operator <<\n";
    return s;
}

istream myclass::operator >> (istream & s)
{
    int into, n=0;
    while(s >> into)
    {
        stack[n] = into;
        n++;
    }
    cout << "Operator >>\n";
    return s;
}


Чтоб работали вот так:
Код

        cin >> t1;
    cout << t1;


Ну а пока заменил вот такими методами:
Код

void myclass::set()
{
    cout << "Set...\n";
    int into, n=0;
    while(n < size)
    {
        cout << n+1 << ':';
        cin >> into;
        stack[n] = into;
        n++;
    }
}

void myclass::print()
{
    cout << "Print...\n";
    for(int i=0; i<size; i++)
    {
        cout << i+1 << ':' << stack[i] << '\n';
    }
}

Вот так мне не нравится smile
Код

    t1.set();
    t1.print();



--------------------
PM MAIL WWW Skype   Вверх
Daevaorn
Дата 8.9.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Elfet,В чем проблема так и не написалsmile Будем гадатьsmile
Возвращать из оператора лучше ссылку на поток. Потом, не мешало бы при выводе добавлять какой-нибуть символ или код, который символизировал бы конец данный. А то получается, что ты не занешь сколько данных взять из потока при вводе. Увы не знаю, что именно у тебя stack, но если это стандартный контейнер, то не мешало бы делать resize()...т.к. мало инфы сказать что-то ещё трудно.
PM MAIL WWW   Вверх
Elfet
Дата 8.9.2006, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



smile) Ок весь класс покажуsmile

stack  - типа int *

Код

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

class myclass {
private:
    int * stack;
    int size;
public:
    myclass () {
        stack = new int[0];
        size = 0;
        cout << "Zero constructor\n";
    }
    myclass (int n) {
        stack = new int[n];
        size = n;
        cout << "N(" << n << ") conscructor\n";
    }
    myclass (const myclass &);
    ~myclass () {
        delete [] stack;
        cout << "Destructor\n";
    }
    myclass &operator = (const myclass &);
    myclass operator + (const myclass &);
    myclass operator - (const myclass &);
    ostream operator << (ostream &);
    istream operator >> (istream &);
    void set();
    void print();
};

//-----------------
//    Îïèñàíèÿ
//-----------------

myclass::myclass(const myclass & c)
{
    size = c.size;
    stack = new int[size];
    for(int i=0; i<size; i++)
        stack[i] = c.stack[i];
    cout << "Copy constructor\n";
}


myclass &myclass::operator=(const myclass & c)
{
    delete [] stack;
    size = c.size;
    stack = new int[size];
    for(int i=0; i<size; i++)
        stack[i] = c.stack[i];
    cout << "Operator =\n";
    return *this;
}

myclass myclass::operator + (const myclass & c)
{
    myclass m(size + c.size);

    int k=0,l=0;
    for(int i=0; i<m.size; i++)
    {
        if(k>=size)
        {
            m.stack[i] = c.stack[l];
            l++;
        }
        else if(l>=c.size)
        {
            m.stack[i] = stack[k];
            k++;
        }
        else
        {
            if(stack[k] < c.stack[l])
            {
                m.stack[i] = stack[k]; 
                k++;
            }
            else
            {
                m.stack[i] = c.stack[l];
                l++;
            }
        }

    }

    cout << "Operator +\n";
    return myclass(m); 
}

myclass myclass::operator - (const myclass & c)
{


    cout << "Operator -\n";
    return myclass(c);
}

ostream myclass::operator << (ostream & s)
{
    for(int i=0; i<size; i++)
    {
        s << stack[i] << '\n';
    }
    cout << "Operator <<\n";
    return s;
}

istream myclass::operator >> (istream & s)
{
    int into, n=0;
    while(s >> into)
    {
        stack[n] = into;
        n++;
    }
    cout << "Operator >>\n";
    return s;
}

void myclass::set()
{
    cout << "Set...\n";
    int into, n=0;
    while(n < size)
    {
        cout << n+1 << ':';
        cin >> into;
        stack[n] = into;
        n++;
    }
}

void myclass::print()
{
    cout << "Print...\n";
    for(int i=0; i<size; i++)
    {
        cout << i+1 << ':' << stack[i] << '\n';
    }
}

//-----------------
//    Main
//-----------------

void main()
{
    myclass t1(3),t2(2);

    //cin >> t1;
    t1.set();
    t2.set();

    t1=t1+t2;

    //cout << t1;
    t1.print();
}



--------------------
PM MAIL WWW Skype   Вверх
likehood
Дата 8.9.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



Если для перегрузки бинарного оператора используется функция-член, то первым операндом будет this. Поскольку при перегрузке << первым операндом является поток, то перегрузить << можно либо из класса ostream (который мы менять не можем), либо с помощью глобальной функции, дружественной для класса, который нужно вывести. Код будет примерно такой:
Код

class myclass {
//.....
friend ostream& operator << (ostream & s, const myclass& m);
//...
};

ostream& operator << (ostream & s, const myclass& m)
{
    for(int i=0; i<m.size; i++)    
    {    
        s << m.stack[i] << '\n';    
    }    
    //cout << "Operator <<\n";    
    return s;    
}



PM MAIL   Вверх
Romikgy
Дата 8.9.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Elfet @  8.9.2006,  12:19 Найти цитируемый пост)
ostream myclass::operator << (ostream & s)

Код

ostream& operator<<(ostream& s, const myclass& x)
{
    for(int i=0; i<x.size; i++)
    {
        s << x.stack[i] << '\n';
    }
    cout << "Operator <<\n";
    return s;
}

не ?

PS Апздал smile

Это сообщение отредактировал(а) Romikgy - 8.9.2006, 13:35


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Elfet
Дата 8.9.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Ок! Спасибо!


--------------------
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1232 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.