> перегрузка операторов..., немного знаний не хватает... почему не работает?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Аватара пользователя
TDUTY
Сообщения: 34
Зарегистрирован: 30 янв 2009, 10:20
Контактная информация:

есть класс с перегруженным оператором <<:

Код: Выделить всё

 
class BB
{
	public:
		//constructors
		BB() { bb = 0; };
		BB(double bb) : bb(bb) { bb = 0; };
 
		//functions & procedure
		void setValue(double i) { bb = i; return; };
		double getValue() { return bb; };
 
		//operators
		BB &operator << (double i)
		{
			bb = (bb + i) / 2;
			return (BB &)this;
		};
	private:
		double bb;
};
 
вариант 1:
вот так вот работает:

Код: Выделить всё

 
	BB sum(1);
	sum << 2 << 3;
	ShowMessage(sum.getValue());
 
вариант 2:
а так не работает а надо что б работало, как сделать правильно?
пишет: "[BCC32 Error] Unit1.cpp(358): E2087 Illegal use of pointer"

Код: Выделить всё

	BB * sum = new BB();
	sum->setValue(1);
	sum << 2 << 3;
	ShowMessage(sum->getValue());
 
собственно вопрос как сделать так что б работал и первый и второй вариант?
в чем моя ошибка? и чего я не понимаю? %) ?
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

Код: Выделить всё

*sum << 2 << 3;
Аватара пользователя
TDUTY
Сообщения: 34
Зарегистрирован: 30 янв 2009, 10:20
Контактная информация:

BulldozerBSG писал(а):

Код: Выделить всё

*sum << 2 << 3;

да но все равно ошибка... именно в return (BB &)this;

нашел такой подход:

Код: Выделить всё

упростил исходный класс
class BB
{
	public:
		vector<double> values;
};
BB &operator << (BB &a, double b) { a.values.push_back(b); return a; };
и теперь в основном коде можно писать так:

Код: Выделить всё

	BB bb;
	bb << 10 << 12 << 5 << 7;
	for(int i = 0; i < bb.values.size(); i++)
		ShowMessage( bb.values[i] );
или так(спасибо BulldozerBSG'у):

Код: Выделить всё

	BB * bb = new BB();
	*bb << 10 << 12 << 5 << 7;
	for(int i = 0; i < bb->values.size(); i++)
		ShowMessage( bb->values[i] );
вынести оператор из класса во вне
Аватара пользователя
TDUTY
Сообщения: 34
Зарегистрирован: 30 янв 2009, 10:20
Контактная информация:

хм...
можно вообще было не париться а написать так:

Код: Выделить всё

 
//обозначить 
vector<double> &operator << (vector<double> &a, double b) { a.push_back(b); return a; };
 
//код в программе
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	vector<double> bb;
	bb << 10 << 12 << 5 << 7;
 
        //выводим
	for(unsigned int i = 0; i < bb.size(); i++) ShowMessage( bb[i] );
	return;
};
 
зы хорошая мысля приходит опосля...

ну или как надо было мне и правильно!!!:

Код: Выделить всё

class BB
{
	public:
		vector<double> values;
		BB &operator << (double b)
		{
			values.push_back(b);
			return *this;
		};
};
работает так

Код: Выделить всё

	BB bb;
	bb << 10 << 12 << 5 << 7;
	for(unsigned int i = 0; i < bb.values.size(); i++) ShowMessage( bb.values[i] );
и так

Код: Выделить всё

	BB * bb = new BB();
	*bb << 10 << 12 << 5 << 7;
	for(unsigned int i = 0; i < bb->values.size(); i++) ShowMessage( bb->values[i] );
Ответить