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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2012, 21:46   #1
Sektr63
Пользователь
 
Регистрация: 29.01.2012
Сообщений: 33
По умолчанию Перегрузка оператора >>

Пытаюсь разобраться с перегрузкой операторов и тут возникла проблема.

Код:
#include <iostream>
using namespace std;

class Main
{
	int a;
	public:
	void Func ();
	friend istream & operator>> (istream & stream, Main &Obj);
};

istream & operator>> (istream & stream, Main &Obj)
{
	stream>>Obj.a;
	return stream;
}

void Main::Func()
{
	Main Obj;
	cin>>Obj;
	cout<<a;
}

int main ()
{
	Main Obj;
	Obj.Func ();
	return 0;
}
Почему в
Код:
cout<<a;
выдается случайное число?

Последний раз редактировалось Sektr63; 18.11.2012 в 21:52.
Sektr63 вне форума Ответить с цитированием
Старый 18.11.2012, 22:17   #2
Sektr63
Пользователь
 
Регистрация: 29.01.2012
Сообщений: 33
По умолчанию

Разобрался, нужно писать
Код:
cout<<Obj.a;
Sektr63 вне форума Ответить с цитированием
Старый 18.11.2012, 22:27   #3
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

а тебя не смущает, что при вызове метода Func() класса Main ты создаешь там объект Obj(который кстати уже создан в int main), и для созданного Obj ты применяешь перегруженный оператор >>. и пытаешься вывести... вообще неразбериха. Тут несколько вариантов.
P.s. надо помнить что не надо в методах использовать операцию точка, если нужно получить доступ к полям(методам) того объекта, для которого вызван метод. Это не учтено у тебя в твоем методе Func. и во всех вариантах строка Main Obj в методе твоего класса будет закомментирована. она ни к чему.

1. тут не будет использоваться твоя перегрузка. скучный вариант.
Код:
void Main::Func()
{
	//Main Obj;
	cin>>a;
	cout<<a;
}
2. тут уже используется твоя перегрузка. так как тебе нужно передать объект через метод класса этого же объекта - используем указатель this.
Код:
void Main::Func()
{
	//Main Obj;
	cin>>*this;
	cout<<a;
}
3. ну и третий вариант. без метода Func()
Код:
class Main
{
private:
	int a;
public:
	int get_a();
	friend istream & operator>> (istream & stream, Main &Obj);
};

istream & operator>> (istream & stream, Main &Obj)
{
	stream>>Obj.a;
	return stream;
}

int Main::get_a(){
	return a;
}

int main ()
{
	Main Obj;
	cin >> Obj;
	cout << Obj.get_a();
	return 0;
}
п.с. все варианты которые я написал - для объекта, созданного в main. а не в методе класса.
Я могу, Я хочу, Я буду!

Последний раз редактировалось ArmanPrestige; 18.11.2012 в 22:31.
ArmanPrestige вне форума Ответить с цитированием
Старый 18.11.2012, 22:37   #4
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

Цитата:
Сообщение от Sektr63 Посмотреть сообщение
Разобрался, нужно писать
Код:
cout<<Obj.a;
нет. ты не прав. это работает, но не так, как ожидаешь ты. вот наглядные пример. на твоем же коде
Код:
#include <iostream>
using namespace std;

class Main
{
public:
	int a;
	void Func ();
	friend istream & operator>> (istream & stream, Main &Obj);
};

istream & operator>> (istream & stream, Main &Obj)
{
	stream>>Obj.a;
	return stream;
}

void Main::Func()
{
	Main Obj;
	cin>>Obj;
	cout<<Obj.a;
}

int main ()
{
	Main test;
	test.Func ();
	cout << test.a << endl;
	return 0;
}
почему тогда по твоему переменная А объекта тест, хранит в себе как ты сказал случайно число(на самом деле это мусор)? а потому что, все что ты сделал в Fucn() было сделано для объекта Obj(который был создан в методе класса, и уничтожится по завершению выполнения этого метода).
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 19.11.2012, 01:27   #5
Sektr63
Пользователь
 
Регистрация: 29.01.2012
Сообщений: 33
По умолчанию

Т.е. так будет корректно ?
Код:
#include <iostream>
using namespace std;

class Main
{
	int a;
	public:
	void Func ();
	friend istream & operator>> (istream & stream, Main &Obj);
};

istream & operator>> (istream & stream, Main &Obj)
{
	stream>>Obj.a;
	return stream;
}

void Main::Func()
{
	cin>>*this;
	cout<<a;
}

int main ()
{
	Main Obj;
	Obj.Func ();
	return 0;
}
Sektr63 вне форума Ответить с цитированием
Старый 19.11.2012, 01:51   #6
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

да, так будет правльно
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Тема: Сочетания оператора цикла и условного оператора Кристина Н Паскаль, Turbo Pascal, PascalABC.NET 1 05.12.2011 00:52
Программы с использованием условного оператора и оператора выбора. Задачи по Delphi. Не могу сделать 4 программу Bovi4 Помощь студентам 0 25.10.2011 20:15
перегрузка оператора << z3rg Общие вопросы C/C++ 18 02.03.2010 02:58
использование условного оператора в теле оператора цикла с условием машко Помощь студентам 2 21.06.2009 23:55
Перегрузка оператора + z3rg Общие вопросы C/C++ 1 22.03.2009 03:06