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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2011, 18:10   #1
Colder M
Пользователь
 
Регистрация: 28.02.2011
Сообщений: 16
По умолчанию C++. Описание деструктора под массив.

Доброго времени суток. Написал класс подстановок, возник вопрос - что следует прописать в деструкторе?
Код:
#include <stdio.h>
class subst
{	
	int size;
	int *cell;
	public:
	subst(int n)
	{
		size=n;
		cell=new int [size];
	}
	~subst()
	{
        /*destructor*/
	}
	void getcust()
	{
		for(int i=0;i<size;i++)
			printf("%d\t",i);
		printf("\n");
		for(int i=0;i<size;i++)
			scanf("%d",cell+i);
	}
	void show()
	{
		for(int i=0;i<size;i++)
			printf ("%d\t",i);
		printf("\n");
		for(int i=0;i<size;i++)
			printf("%d\t",*(cell+i));
		
	}
	subst inverse()
	{	
		subst I(size);
		for(int i=0;i<I.size;i++)
		{
			*(I.cell+*(cell+i))=i;
		}
		return I;
	}
	subst operator * (subst R)
	{
		if(size==R.size)
		{
			subst P(size);
			for(int i=0;i<P.size;i++)
				*(P.cell+i)=*(R.cell+*(cell+i));
			return P;
		}
	}
	subst operator = (subst T)
	{
		if(size==T.size)
		{
			for(int i=0;i<size;i++)
				*(cell+i)=*(T.cell+i);
			return *this;
		}
	}
};
void main()
{	printf("Size of subst.: n=");
	int n;
	scanf("%d",&n);
	
	printf("\nSubst. A:\n");
	subst A(n);
	A.getcust();

	printf("\nSubst. B:\n");
	subst B(n);
	B.getcust();

	printf("\nThe solution of A*X=B is:\n");
	(A.inverse()*B).show();

	printf("\nThe solution of X*A=B is:\n");
	(B*(A.inverse())).show();
	
	printf("\n");
}
По непонятной мне причине, использование в теле деструктора delete [] cell приводит к высвобождению памяти из под первых двух элементов массива в классе B в результате любой операции после заполнения:
Код:
 printf("\nSubst. B:\n");
	subst B(n);
	B.getcust();
        /*...*/
Помогите разобраться, пожалуйста.
Colder M вне форума Ответить с цитированием
Старый 10.04.2011, 19:30   #2
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

в теле д.
Код:
if (cell) delete[] cell;
без сомнений.
определите конструктор копирования, и всё заработает.
onewho вне форума Ответить с цитированием
Старый 10.04.2011, 20:41   #3
Colder M
Пользователь
 
Регистрация: 28.02.2011
Сообщений: 16
По умолчанию

Возник наивный вопрос, по поводу КК... Его следует описать так?
Код:
subst(const subst &C)
	{
		size=C.size;
		cell=new int [size];
	}
Я впервые с ним сталкиваюсь, мне он пока не понятен... В каком месте его вызывать?
Colder M вне форума Ответить с цитированием
Старый 12.04.2011, 01:09   #4
Colder M
Пользователь
 
Регистрация: 28.02.2011
Сообщений: 16
По умолчанию

Несколько изменил код, теперь работает присваивание, но умножение по-прежнему ведет себя неадекватно. Скажите пожалуйста, что не так?
Код:
#include <stdio.h>
class subst
{	
	int size;
	int *cell;
	public:
	subst(int n);
	~subst();
	void getcust();
	void show();
	subst inverse();
	friend subst operator * (const subst &, const subst &);
	subst &operator = (subst &);
};
	void subst::getcust()
		{
			for(int i = 0; i < size; i++)
				printf("%d\t", i);
			printf("\n");
			for(int i=0 ; i < size; i++)
				scanf("%d", cell + i);
		}
	subst::subst(int n)
	{
		size = n;
		cell = new int [size];
	}
	subst::~subst()
	{
		delete [] cell;
	}
	void subst::show()
		{
			for(int i = 0 ; i < size; i++)
				printf ("%d\t", i);
			printf("\n");
			for(int i = 0; i < size; i++)
				printf("%d\t", *(cell + i));
			
		}
	subst subst::inverse()
		{	
			subst I(size);
			for(int i = 0; i < I.size; i++)
			{
				*(I.cell + *(cell + i)) = i;
			}
			return I;
		}
	subst operator * (const subst &L, const subst &R)
		{
			if(L.size == R.size)
			{
				subst P(L.size);
				for(int i = 0; i < P.size; i++)
					*(P.cell + i) = *(R.cell + *(L.cell + i));
				return P;
			}
		}
	subst &subst::operator = (subst &T)
	{
		if(size == T.size)
		{
			for(int i = 0; i < size; i++)
				*(cell + i) = *(T.cell + i);

			return *this;
		}
	}
void main()
{
	printf("Size of subst.: n=");
	int n;
	scanf("%d", &n);
	
	printf("\nSubst. A:\n");
	subst A(n);
	A.getcust();

	printf("\nSubst. B:\n");
	subst B(n);
	B.getcust();

	printf("\n");
	(A * B).show();
	
	printf("\n");
}
Colder M вне форума Ответить с цитированием
Старый 12.04.2011, 02:06   #5
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

оно и понятно
Цитата:
return P;
КК не надо вызывать, он сам вызовется
ну можно вообще и вызывать.. если хочется.. obj(*this) что нибудь в этом роде.

по теме:

Код:
subst(const subst &C)
	{
		size=C.size;
		cell=new int [size];
                for (int i=0; i<size; i++) cell[i]=C.cell[i];
	}
onewho вне форума Ответить с цитированием
Старый 12.04.2011, 05:07   #6
Colder M
Пользователь
 
Регистрация: 28.02.2011
Сообщений: 16
По умолчанию

Большое спасибо, заработало . Суть уловил.
Colder M вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переопределение деструктора avd Общие вопросы Delphi 2 31.01.2011 11:16
Corruption of the heap при вызове деструктора pure Общие вопросы C/C++ 1 30.11.2010 21:09
Работа деструктора ignis_divine Помощь студентам 2 12.09.2010 17:43
Ругается на минус при создание деструктора Hichigo Общие вопросы C/C++ 10 21.08.2010 07:33
Использование виртуального деструктора Fataller Общие вопросы C/C++ 3 12.12.2009 22:08