Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2009, 18:52   #1
z3rg
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 25
По умолчанию перегрузка оператора <<

хочу сделать чтоб перегружался оператор вывода следующим способом, тоесть вводишь массив к примеру собак mas[i] и сколько им лет let[i]
и выводит только те значения где let[i]=10

в классе
Код:
void operator << (const int &god, const char &name)
{
if(god==10){
<<god<<" "<<name
}
функция ввода
Код:
void vvod(){
for(int i=0;i<n;i++){
cin<<let[i]<<mas[i];
}
}
гл
Код:
void main()
{
mycl bb;
bb.vvod;

for(int i=0;i<n;i++)
{
cout<<let[i]<<mas[i];
}
}
делаю вот так но эт не правильно, подскажите как надо.
z3rg вне форума Ответить с цитированием
Старый 19.03.2009, 20:17   #2
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Во первых << это не оператор вывода, а оператор побитового сдвига влево. Во вторых это бинарный оператор, следовательно при его перегрузке у функции должен быть один параметр, а у вас два. И в третьих, что это за строчка такая?
Код:
<<god<<" "<<name
Очевидно, должно быть
Код:
cout<<god<<" "<<name
З.Ы. Кстати, в вашем коде вообще нет вызова этого перегруженного оператора.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария

Последний раз редактировалось Blade; 19.03.2009 в 20:21.
Blade вне форума Ответить с цитированием
Старый 19.03.2009, 20:40   #3
z3rg
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 25
По умолчанию

ну так я понимаю что нету вызова, как его можно вызвать
тоесть надо один парамерт

Код:
void operator << (const int &god)
{
if(god==10){
god;
}
Код:
//show(int i){

//cout<<let[i]<<mas[i];
//}

а в майне должно быть так
Код:
void main()
{
mycl bb;
bb.vvod;
for(int i=0;i<n;i++){

<<bb.let[i];
//bb.show(i);
}
}
чет вобще не понимаю как надо

Последний раз редактировалось z3rg; 19.03.2009 в 21:15.
z3rg вне форума Ответить с цитированием
Старый 19.03.2009, 21:43   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

То, что Вы хотите сделать, не получится.
Код:
cout<<let[i]<<mas[i];
Фактически развернется в:
Код:
cout << let[i];
cout << mas[i];
Оператор << бинарный и потому у него должно быть 2 параметра.
Как-то так должен быть перегружен оператор для вывода, в том числе посредством cout:
Код:
ostream& operator<<(ostream& s, const MY_TYPE& t)
{
    s << t.a << endl << t.b;
    return s;
}
MY_TYPE - это какой-то ваш тип, который хотите выводить посредством cout.
pu4koff вне форума Ответить с цитированием
Старый 19.03.2009, 22:14   #5
z3rg
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 25
По умолчанию

нифига не понял
че дальше делать
Код:
class mycl
{
int *let; // лет собаке
char *mas;// кличка
int n=10;
mycl(){}
~mycl(){}
void vvod();
ostream& operator<<(ostream& s, const MY_TYPE& t)
{
    s << t.a << endl << t.b;
    return s;
}
};

void mycl::vvod()
{
for(int=0;i<n;i++){
cin>>mas[i]>>let[i];
}
}

main()
{
mycl bb;
bb vvod();
...
}
}
z3rg вне форума Ответить с цитированием
Старый 19.03.2009, 22:18   #6
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Оператор << бинарный и потому у него должно быть 2 параметра.
Нет, что вы? Откуда же у бинарного оператора возьмется второй параметр? В принципе их 2, но один, стоящий слева от бинарного оператора, передается не явно (автоматически), второй, стоящий справа, мы передаем как единственный аргумент. Больше ничего передаваться не может

По теме. Реализовать можно так.
Код:
class myCl
{
public:
int mas[10];
int let[10];
void operator<<(int x)
{
for(int i=0;i<10i++)
if(let[i]==x)
cout<<mas[i]
}
};

int main()
{
myCl A;
//заполняем массивы
...
A<<10; //Печатаем только те значения, которые равны 10

return 0;
}
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария

Последний раз редактировалось Blade; 19.03.2009 в 22:28.
Blade вне форума Ответить с цитированием
Старый 19.03.2009, 22:27   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
Нет, что вы? Откуда же у бинарного оператора возьмется второй параметр? В принципе их 2, но один, стоящий слева от бинарного оператора, передается не явно (автоматически), второй, стоящий справа, мы передаем как единственный аргумент. Больше ничего передаваться не может
Ну я писал про перегрузку операторов вне класса. Откуда там левый аргумент возьмется?
Сейчас посмотрел в MSDN:
Код:
#include <iostream>
using namespace std;

class Date
{
    int mo, da, yr;
public:
    Date(int m, int d, int y)
    {
        mo = m; da = d; yr = y;
    }
    friend ostream& operator<<(ostream& os, const Date& dt);
};

ostream& operator<<(ostream& os, const Date& dt)
{
    os << dt.mo << '/' << dt.da << '/' << dt.yr;
    return os;
}

int main()
{
    Date dt(5, 6, 92);
    cout << dt;
}
А внутри своего класса если оператор перегрузить, то не получится взаимодействие с cout. Или я туплю?
pu4koff вне форума Ответить с цитированием
Старый 19.03.2009, 22:28   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от z3rg Посмотреть сообщение
нифига не понял
че дальше делать
Читать книги и быть внимательнее, а то бездумно код копируете
pu4koff вне форума Ответить с цитированием
Старый 19.03.2009, 22:31   #9
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Ну я писал про перегрузку операторов вне класса. Откуда там левый аргумент возьмется?

А внутри своего класса если оператор перегрузить, то не получится взаимодействие с cout. Или я туплю?
Согласен. Не обратил внимания, что вы перегружаете вне класса.
А внутри класса тоже можно перегрузить, ведь нам, как я понял, надо перегрузить оператор не для объекта cout, а для своего класса
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 19.03.2009, 22:44   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
А внутри класса тоже можно перегрузить, ведь нам, как я понял, надо перегрузить оператор не для объекта cout, а для своего класса
Ну тут как топикстартер пожелает. Я просто исходил из последующего использования в виде: cout << A;
Хотя все равно реализовать конструкцию из первого поста:
cout<<let[i]<<mas[i];
не получится.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задачка перегрузка оператора + z3rg Общие вопросы C/C++ 7 17.03.2009 13:23
Перегрузка оператора + (С++) MjRed Помощь студентам 1 15.12.2008 18:57
Перегрузка оператора Crucian Общие вопросы C/C++ 2 22.10.2007 09:44
Использование оператора условия Virtson Microsoft Office Access 2 15.12.2006 16:13