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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.06.2011, 12:25   #1
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию конструктор копирования

Всем привет.
есть класс CMatrix
с полями
int ** matrix;
int size_x;
int size_y;
подскажите как сделать для него конструктор копирования и оператор =, а то получается какой то бред.
заранее спасибо.

С конструктором копирования разобрался, немного натупил с выделением памяти.
а вот как перегрузить оператор =?

Последний раз редактировалось revaldo666; 21.06.2011 в 12:39.
revaldo666 вне форума Ответить с цитированием
Старый 21.06.2011, 13:39   #2
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

Код:
CMatrix& CMatrix::operator=(const CMatrix& rhs)
{
     size_x = rhs.size_x;
     size_y = rhs.size_y;
     matirx = rhs.matrix;//или что ещё ты там делаешь ( я о выделении памяти)
     return *this;
}
как то так по моему
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 21.06.2011, 14:11   #3
fenryr
Пользователь
 
Регистрация: 20.05.2010
Сообщений: 28
По умолчанию

так нельзя делать
при уничтожении 2го объекта будет попытка освободить уже освобожденную память.
Код:
CMatrix& CMatrix::operator=(const CMatrix& rhs)
{
     if (this != & rhs) {
    size_x = rhs.size_x;
     size_y = rhs.size_y;
     matrix = new int [size_x ] ;
      for (int i = 0 ; i < size_x ; i++)
           matrix = new int [size_y ] ;
   for (int i = 0 ; i < size_x ; i++)
for (int j = 0 ;j < size_y ;j++)
       matrix [i][j] = rhs.matrix[i][j];
}
     return *this;
}
fenryr вне форума Ответить с цитированием
Старый 21.06.2011, 14:34   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2fenryr
забыл проверить и уничтожить уже существующий массив в памяти
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 21.06.2011, 14:36   #5
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

Но я же в комментарии написал
А по скольку в вопросе было сказано что Copy Constuctor работает правильно я и написал так !!!
А без всего этого конечно же вы правы

Цитата:
for (int i = 0 ; i < size_x ; i++)
matrix = new int [size_y ] ;
По моему
Код:
matirx[i] = new int[sitze_y];
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!

Последний раз редактировалось artush1984; 21.06.2011 в 14:47.
artush1984 вне форума Ответить с цитированием
Старый 21.06.2011, 14:43   #6
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

спасибо...чем то похоже на конструктор копирования))
Практически один в один.
revaldo666 вне форума Ответить с цитированием
Старый 21.06.2011, 14:50   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2revaldo666
да, похожи. в операторе присваивания нужно проверить, не присваиваешь ли самому себе и освободить выделенную ранее память, когда в копирующем конструкторе просто скопировать данные (в случае с указателем - выделить и скопировать)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 21.06.2011, 15:02   #8
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

наконецто разобрался, никогда не любил динамические двухмерные массивы...
Теперь полюбил)
всем огромное спасибо
revaldo666 вне форума Ответить с цитированием
Старый 21.06.2011, 16:50   #9
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

И ещё один вопрос.
Нужно перегрузить оператор инкримента, который будет добавлять строку в массив и инициализировать её нулями.
Я сделал так.
но вот чёт оно неработает...
можете сказать где я натупил?
Код:
CMatrix& CMatrix::operator++()
{
	
	CMatrix tmp;
	tmp.matrix=new int *[size_x];		//Выделяем память под временный массив
		for(int i=0;i<size_y;i++)
		{
			tmp.matrix[i]=new int [size_y];	
		}
		
		for(int i=0;i<size_y;i++)		//копируем существующий массив во временный
		{
			for (int j=0;j<size_x;j++)
			{
				tmp.matrix[i][j]=matrix[i][j];
			}
		}
		size_y+=1;		//добовляем строку
		matrix=new int *[size_x];
		for(int i=0;i<size_y;i++)
		{
			matrix[i]=new int [size_y];
		}
		for(int i=0;i<size_x;i++)	//заполняем добавленную строку нулями
		{
			matrix[size_y][i]=0;
		}
		for(int i=0;i<size_y-1;i++)	//копируем временный массив в наш изменённый
		{
			for (int j=0;j<size_x-1;j++)
			{
				matrix[i][j]=tmp.matrix[i][j];
			}
		}
		return *this;
	
	

}
revaldo666 вне форума Ответить с цитированием
Старый 21.06.2011, 18:39   #10
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Цитата:
Сообщение от revaldo666 Посмотреть сообщение
И ещё один вопрос.
Нужно перегрузить оператор инкримента, который будет добавлять строку в массив и инициализировать её нулями.
Код:
 CMatrix& CMatrix::operator++()
{
	int i, j;
	//Выделяем память под временный массив
	int **tmat = new int *[size_x];
	for( i=0; i<size_x; i++) tmat[i] = new int [size_y];
	//копируем существующий массив во временный
	for( i=0; i<size_x; i++)
		for( j=0; j<size_y; j++) tmat[i][j] = matrix[i][j];
	//Освобождаем память массива
	for( i=0; i<size_x; i++) delete[] matrix[i];
	delete[] matrix;

	size_y++;
	//Создаем новый массив
	matrix = new int *[size_x];
	for( i=0; i<size_x; i++) matrix[i] = new int [size_y];
	//копируем временный массив в наш изменённый
	for( i=0; i<size_x; i++)
		for( j=0; j<size_y; j++)
			if( j==size_y-1) matrix[i][j] =0; //заполняем добавленную строку нулями
			else matrix[i][j] = tmat[i][j];
	//Освобождаем память временного массива
	for( i=0; i<size_x; i++) delete[] tmat[i];
	delete[] tmat;

  return *this;
}

Последний раз редактировалось An1ka; 21.06.2011 в 22:32.
An1ka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конструктор копирования Сtrl Общие вопросы C/C++ 6 31.03.2011 10:18
Конструктор копирования. 123er4 Общие вопросы C/C++ 4 13.06.2010 01:27
Конструктор копирования Superlotles Общие вопросы C/C++ 2 24.05.2010 17:39
Конструктор копирования Djaconda Общие вопросы C/C++ 3 11.06.2008 18:54