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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2011, 18:54   #1
Furchtlos
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 20
По умолчанию Проблема с перегрузкой операторов

Нужно сделать программу для сложения, вычитания, умножения матриц. В конечном счете нужно получить результат x1=2*A*(A+B)-3*A. x1,A,B - объекты. Написал код, но проблема в том, что строка x1=(x2+x3)*2 вызывает "Invalid allocation size". В чем проблема? Причем, если возвращать от оператора не временный класс, а собственный то проблемы вроде нет.
Код:
class matrix
	{
	char imya[20];
	int size;
	double **x;
	public:
	matrix()
	{	cout<<"Vvedite imya matrici: ";
		cin>>imya;
		cout<<endl<<"Vverite razmer matrici ";
		cin>>size;
		x=new double *[size];
		for (int i=0;i<size;i++)
		{
			x[i]=new double[size];
		}
		for(int i=0;i<size;i++)
		{for(int j=0;j<size;j++)
			{cout<<"Vvedite X["<<i<<"]["<<j<<"]"<<endl;
			cin>>x[i][j];}
		}
	}
	matrix(int size)
	{	
		x=new double *[size];
		for (int i=0;i<size;i++)
		{
			x[i]=new double[size];
		}
		for(int i=0;i<size;i++)
		{for(int j=0;j<size;j++)
			{x[i][j]=0;}
		}
	}
	void vivod()
	{
		cout<<imya<<endl;
		for(int i=0;i<size;i++)
		{
			for(int j=0;j<size;j++)
			{
				cout<<x[i][j]<<" ";
			}
			cout<<endl;
		}
	}
	matrix operator+(matrix m2)
	{
		matrix temp(size);
		for(int i=0;i<size;i++)
		{
			for(int j=0;j<size;j++)
			{
				temp.x[i][j]=x[i][j]+m2.x[i][j];}
		}
		return temp;
		
		
	}
	matrix operator-(matrix m2)
	{
		matrix temp(size);
		for(int i=0;i<size;i++)
		{
			for(int j=0;j<size;j++)
			{
				temp.x[i][j]=x[i][j];
				temp.x[i][j]=x[i][j]-m2.x[i][j];}
		}
	 	return temp;
	}
	matrix operator=(matrix m2)
	{
		for(int i=0;i<size;i++)
		{
			for(int j=0;j<size;j++)
			{x[i][j]=m2.x[i][j];}
		}
		return *this;
	}
	matrix operator*(matrix m2)
	{
		matrix temp(size);
		for(int i=0;i<size;i++)
		{
			for(int j=0;j<size;j++)
			{
				temp.x[i][j]=x[i][j]*m2.x[i][j];}
		}
		return temp;
	}
	matrix operator*(int m)
	{
		matrix temp(size);
		for(int i=0;i<size;i++)
		{
			for(int j=0;j<size;j++)
			{
				temp.x[i][j]=x[i][j]*m;}
		}
		return temp;
	}
	matrix operator*=(int m2)
	{
		for(int i=0;i<size;i++)
		{
			for(int j=0;j<size;j++)
			{x[i][j]=x[i][j]*m2;}
		}
		return *this;
	}
	};
	matrix(x1);
	matrix(x2);
	matrix(x3);
	x1=(x2+x3)*2;
	x1.vivod();

Последний раз редактировалось Furchtlos; 27.12.2011 в 18:58.
Furchtlos вне форума Ответить с цитированием
Старый 27.12.2011, 20:39   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Далеко не лазил, на вскидку:


Код:
matrix operator*(matrix m2)
	{
		matrix temp(size);
		for(int i=0;i<size;i++)
		{
			for(int j=0;j<size;j++)
			{
				temp.x[i][j]=x[i][j]*m2.x[i][j];}
		}
		return temp;
	}
Возвращем локальные объекты, да?

То есть, мы знаем, что время жизни локального объекта - пока не закончится область видимости блока, который порождает локальный объект, но нам пофегу, да?
Мы щитаем, что так делать правильно? Возвращать указатели на уже убитые объекты?
_Bers вне форума Ответить с цитированием
Старый 27.12.2011, 20:43   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Возвращем локальные объекты, да?

То есть, мы знаем, что время жизни локального объекта - пока не закончится область видимости блока, который порождает локальный объект, но нам пофегу, да?
Мы щитаем, что так делать правильно?
да так делать правильно в данном случае.
тем более мы возвращаем объект который еще жив.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.12.2011, 20:52   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
да так делать правильно в данном случае.
тем более мы возвращаем объект который еще жив.
Поясните момент. Не вижу ни одной надежды, быть ему живым по выходу.

приёмник = источник.operator*(m2); // срабатывает копирующий конструктор. Вот только что он копирует? Данные протухшего объекта?

Последний раз редактировалось _Bers; 27.12.2011 в 20:58.
_Bers вне форума Ответить с цитированием
Старый 27.12.2011, 20:58   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Поясните момент.
иначе придется возвращать обьект созданный через new, и тогда будет утечка памяти.
для операторов возвращающих *this лучше возвращать ссылку.

а вот как аргумент стоит принимать ссылку(кроме базовых типов).

Цитата:
Вот только что он копирует?
вы возвращаем объект, а не ссылку/указатель на него.
итого копируем return-value.
Цитата:
// срабатывает копирующий конструктор.
только при инициализации, иначе operator =.

http://cplusplus.com/reference/string/operator+/
посмотрите здесь типы
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 27.12.2011 в 21:01.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.12.2011, 21:03   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
иначе придется возвращать обьект созданный через new, и тогда будет утечка памяти.
для операторов возвращающих *this лучше возвращать ссылку.

а вот как аргумент стоит принимать ссылку(кроме базовых типов).
Данивапрос!

Код:
SomeClass& getData( SomeClass& dst){ return dts; }

SomeClass& getData( SomeClass& target  ){  Swap(this, target)  return *this; }
Всякие реализации ограничены только задачами и фантазиями

Последний раз редактировалось _Bers; 27.12.2011 в 21:06.
_Bers вне форума Ответить с цитированием
Старый 27.12.2011, 21:05   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Функция изменяющая обьект и функция возвращающая новый обьект это разные вещи.
да и про такие функции(например оператор *=) я сказал что там правильнее возвращать ссылку.
Цитата:
Даниваврос!
компиляторы оптимизируют этот момент.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.12.2011, 21:05   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение

вы возвращаем объект, а не ссылку/указатель на него.
итого копируем return-value.только при инициализации, иначе operator =.

http://cplusplus.com/reference/string/operator+/
посмотрите здесь типы
Не важно как происходит копирование. Важно что копируется, о боже! Вышедший из области видимости объект.

Трупака копируем
_Bers вне форума Ответить с цитированием
Старый 27.12.2011, 21:10   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Трупака копируем
да нет же!
вы что не можете понять код?

Код:
int do(int t)
{
    int r=t+10;
    return r;
}
тут то возвращаем же все нормально.
Код:
	matrix operator*(int m)
	{
		matrix temp(size);
		for(int i=0;i<size;i++)
		{
			for(int j=0;j<size;j++)
			{
				temp.x[i][j]=x[i][j]*m;}
		}
		return temp;//возвращаем объект, если без оптимизации то будет конструктор копирования.
	}//тут объекта temp уже нету, но результат функции есть(если без оптимизации)
что еще не ясно?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.12.2011, 21:11   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

ааа... да да, понятна
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с перегрузкой оператора потока в классах - << monolit111 Общие вопросы C/C++ 13 27.11.2011 20:40
Программа на языке С с использованием условных операторов и операторов цикла. Valentin Pirgach Помощь студентам 0 17.10.2011 20:16
Проблема с перегрузкой операторов в C++ StudentofSUSU Помощь студентам 2 30.09.2010 10:04
Проблема с перегрузкой операторов, не могу разобраться mrLee Помощь студентам 1 30.01.2010 00:23
Проблема с перегрузкой операторов, не могу разобраться mrLee Общие вопросы C/C++ 0 29.01.2010 18:45