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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2010, 21:37   #1
alex_alpha
Пользователь
 
Регистрация: 23.03.2010
Сообщений: 43
По умолчанию объекты класса и динамические массивы

Здравствуйте.
Столкнулся с такой проблемой:
Мне необходимо сложить два объекта класса, содержащих динамические массивы. Реализовал я это таким образом:
Код:
matrix operator+(const matrix &Obj)
{
	matrix Temp;
	for(int i=0;i<s;i++)
	{
		for(int j=0;j<h;j++)
			Temp.mt[i][j]=mt[i][j]+Obj.mt[i][j];
	}
	return Temp;
}
Вот только при возврате объекта Temp деструктор уничтожает его раньше, и в итоге выскакивает ошибка
Как сделать правильно?
alex_alpha вне форума Ответить с цитированием
Старый 01.06.2010, 00:22   #2
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Эммм ? покажите класс чтоли ) Ну или методы его с полями )
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 01.06.2010, 00:30   #3
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Цитата:
Сообщение от alex_alpha Посмотреть сообщение
Вот только при возврате объекта Temp деструктор уничтожает его раньше, и в итоге выскакивает ошибка
Конструктор копирования покажите.
Carbon вне форума Ответить с цитированием
Старый 01.06.2010, 00:38   #4
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

если у нас нет динамических данных, то он не нужен<экстрасенс>, хотя наверное они есть =)</экстрасенс>
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 01.06.2010, 00:44   #5
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Наверняка mt - это указатель на указатель, а конструктор копирования отсутствует.
Carbon вне форума Ответить с цитированием
Старый 01.06.2010, 07:41   #6
alex_alpha
Пользователь
 
Регистрация: 23.03.2010
Сообщений: 43
По умолчанию

Цитата:
Сообщение от Carbon Посмотреть сообщение
Наверняка mt - это указатель на указатель, а конструктор копирования отсутствует.
Да, конструктор копирования я не сделал. Спасибо за подсказку.
alex_alpha вне форума Ответить с цитированием
Старый 01.06.2010, 07:48   #7
alex_alpha
Пользователь
 
Регистрация: 23.03.2010
Сообщений: 43
По умолчанию

Вот мой код полностью:
Код:
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
class matrix{
	int **mt;
	int s, h;
public:
	matrix();
	~matrix();
	matrix operator +(const matrix &);
	void Show_();
};
matrix::matrix()
{
	srand(time(NULL));
	s=5, h=6;
	mt=new int *[s];
	for(int i=0;i<s;i++)
		mt[i]=new int[h];
	for(int i=0;i<s;i++)
	{
		for(int j=0;j<h;j++)
			mt[i][j]=rand()%9+1;
	}
}
matrix::~matrix()
{
	for(int i=0;i<s;i++)
		delete []mt[i];
	delete []mt;
}
matrix matrix::operator+(const matrix &Obj)
{
	matrix Temp;
	for(int i=0;i<s;i++)
	{
		for(int j=0;j<h;j++)
			Temp.mt[i][j]=mt[i][j]+Obj.mt[i][j];
	}
	return Temp; //здесь объект сначала уничтожается
}
void matrix::Show_()
{
	static int count=1;
	cout<<"\nMatrix "<<count<<"\n";
	for(int i=0;i<s;i++)
	{
		for(int j=0;j<h;j++)
			cout<<mt[i][j]<<" ";
		cout<<"\n";
	}
	count++;
}
void main()
{
	matrix M1,M2,M3;
	M1.Show_();
	M2.Show_();
	M3=M1+M2;
	M3.Show_();
}
alex_alpha вне форума Ответить с цитированием
Старый 10.06.2010, 15:46   #8
kutnyuk
 
Регистрация: 10.06.2010
Сообщений: 4
По умолчанию

Такая же проблема,реализовал конструктор копирования,но все равно ошибка.помогите кто может.
//конструктор копирования(матрица размером size X size):
Цитата:
Код HTML:
matrix::matrix(const matrix &a)
{
	size=a.size;
	arr=new int*[size];
	for(int i=0;i<size;i++)
		arr[i]=new int[size];
	for(int i=0;i<size;i++)
		for(int j=0;j<size;j++)
			arr[i][j]=a.arr[i][j];	
}

Последний раз редактировалось kutnyuk; 10.06.2010 в 15:49.
kutnyuk вне форума Ответить с цитированием
Старый 10.06.2010, 15:57   #9
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

kutnyuk, size и arr объявлены как public?
И что за ошибка?
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 10.06.2010, 20:27   #10
kutnyuk
 
Регистрация: 10.06.2010
Сообщений: 4
По умолчанию

Вот код всей программы:
Код HTML:
#include<iostream>
using namespace std;

class matrix
{
	int size;
	int **arr;
public:
	matrix(int a);
	~matrix();
	matrix(const matrix& a);
	matrix& operator+ (const matrix& a);	
	void show();	
};

matrix::matrix(int a=0)
{
	size=5;
	arr=new int*[size];
	for(int i=0;i<size;i++)
		arr[i]=new int[size];
	for(int i=0;i<size;i++)
		for(int j=0;j<size;j++)
			arr[i][j]=a;
}
matrix::~matrix()
{
	for(int i=0;i<size;i++)
		delete []arr[i];
	delete []arr;	
}
matrix::matrix(const matrix &a)
{
	size=a.size;
	arr=new int*[size];
	for(int i=0;i<size;i++)
		arr[i]=new int[size];
	for(int i=0;i<size;i++)
		for(int j=0;j<size;j++)
			arr[i][j]=a.arr[i][j];	
}
matrix& matrix::operator+ (const matrix& a)
{	
	matrix temp=*this;
	for(int i=0;i<size;i++){
		for(int j=0;j<size;j++){
			temp.arr[i][j]=arr[i][j]+a.arr[i][j];
		}
	}
	
	return temp;
}
void matrix::show()
{
	for(int i=0;i<size;i++){
		cout<<"\n";
		for(int j=0;j<size;j++)
			cout<<arr[i][j]<<"  ";
	}
}
void main()
{

	matrix obj1(1);
	cout<<"\nobj1:";
	obj1.show();
	matrix obj2(2);
	cout<<"\nobj2:";
	obj2.show();
	matrix obj3(4);
	cout<<"\nobj3:";
	obj3.show();
	obj3=obj1+obj2;
	cout<<"\nobj3=obj1+obj2:";
	obj3.show();
}
Как мне кажется, проблема в то что при работе перегруженного + деструктор срабатывает раньше,чем возвращается объект.В итоге программа виснет.
Если закоментировать деструктор - то все работает.
Выше писалось,что нужен конструктор копирования - я сделал, но все равно нифига не выходит

Последний раз редактировалось kutnyuk; 10.06.2010 в 20:30.
kutnyuk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические объекты 095 Общие вопросы Delphi 2 04.06.2011 19:09
Реалирация подсчёта ссылок на объекты класса подобно объектом интерфейса Altera Общие вопросы Delphi 2 26.05.2010 23:17
Объекты, массивы. smb. Помощь студентам 1 25.05.2009 19:13
Динамические объекты 095 Общие вопросы Delphi 1 04.10.2007 21:16