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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2009, 00:07   #1
kedbl4
Пользователь
 
Регистрация: 09.09.2009
Сообщений: 28
По умолчанию Возврат класса

Задача: перемножить две матрицы
Проблема: в функции myclass x(myclass& b); не получается вернуть в main результирующий объект.Думаю, что проблема в конструкторе копирования, но не уверен помогите....


Другие способы без возврата объекта не предлагать....по другому все работает...а так не

Помогите, кому не трудно

Код:
#include <iostream>
using namespace std;

class myclass
{
	int **mas; //матрица
	int size; //размер матрицы
public:
	myclass(); //конструктор
	myclass(int k); //конструктор, k-размер матрицы
	myclass(myclass &a);
	~myclass(); //деструктор
	void set_mas(); //функция заполнения матрицы
	void print(); //функция вывода на экран матрицы
	int back_size() {return size;} // функция возр размер матрицы
	myclass x(myclass& b); //функция перемножения матриц

};
myclass::myclass(myclass &a)
{
		mas= new int * [a.size];
    if(mas== NULL ) return;     
  for (int i=0; i < a.size; i++)
  {
    mas[i] = new int [a.size];
   if(mas[i] == NULL ) return;
  }                           //выделение памяти под матрицу
  for(int t=0;t<a.size;t++)
	  for(int j=0;j<a.size;j++)
		  mas[t][j]=a.mas[t][j];
}

void myclass::set_mas()
{
	  for(int i=0; i<size;i++)  
	  for(int j=0;j<size;j++)
	  {
		  cout<<endl<<"Введите значение "<<i+1<<"-ого столбца    "<<j+1<<"-ой строки : ";
          cin>>mas[i][j];
	  } //цикл заполнения матрицы
  system("cls"); 
  cout <<"Матрица заполнена...";
}
myclass myclass::x(myclass& b)
{
	int sum=0;
	myclass c(b.back_size()); //создаем результирующий объект
	for(int i=0;i<size;i++)
		for(int j=0;j<size;j++)
		{
			for(int k=0;k<size;k++)
			{
				sum+=mas[i][k]*b.mas[k][j];
			}
         c.mas[i][j]=sum;
		} //цикл перемножения матрци
	cout<<endl<<endl<<"Результат перемножения матриц:";
	return c;
}
void myclass::print()
{	
	for(int i=0; i<size;i++)
	{
		cout<<endl;
	  for(int j=0;j<size;j++)
	  {
		  cout<<mas[i][j]<<"   ";;
          
	  }
	} //цикл вывода на экран матрицы
	cout<<endl<<endl<<endl;
}
myclass::myclass()
{
	cout<<"Создание..."<<endl;
}
myclass::myclass(int k)
{
	size=k;  //заносим в объект рахзмер матрицы
	mas= new int * [size];
    if(mas== NULL ) return;     
  for (int i=0; i < size; i++)
  {
    mas[i] = new int [size];
   if(mas[i] == NULL ) return;
  }                           //выделение памяти под матрицу

 }
myclass::~myclass()
{
	cout<<"Уничтожение..."<<endl;
	for (int i=0; i < size; i++)
    delete  [] mas[i];
	delete [] mas;     
 
}
int main()
{
	setlocale(LC_ALL,"rus");
	
	int size1,size2;
	cout<<"Введите размерность первой матрицы:";
	cin >>size1;
	cout<<"Введите размерность второй матрицы:";
	cin >>size2;
	myclass a(size1),b(size2),z(size2);  //создаем объекты размерностью size1 и size2
	system("cls");
	cout<<"Заполнение 1-ой матрицы";
	a.set_mas(); //вызов функции заполнения матрицы
	system("cls");
	cout<<"Заполнение 2-ой матрицы";
	b.set_mas();  //вызов функции заполнения матрицы
	system("cls");
	cout<<"Первая введенная матрица:";
	a.print(); //вызов функции печати матрицы
	cout<<"Вторая введенная матрица:";
	b.print(); //вызов функции печати матрицы
	z=a.x(b);  //вызов функции перемножения матриц
	z.print();
	return 0;
}

Последний раз редактировалось kedbl4; 10.09.2009 в 00:28.
kedbl4 вне форума Ответить с цитированием
Старый 10.09.2009, 00:40   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от kedbl4
Думаю, что проблема в конструкторе копирования, но не уверен помогите....
да, одна из проблем в нём, вы забыли присваивать новый размер
Код:
myclass::myclass(myclass &a)
{
...
    size = a.size;
...
}
вторая это то, что у вас не определено копирующее присваивание, хотя должно быть, ибо вы используете z = a.x(b).
Код:
myclass operator= (const myclass& a);
тело ф-ции должно быть примерно таким же, как у копирующего конструктора, там уж, думаю, разберётесь
netrino вне форума Ответить с цитированием
Старый 10.09.2009, 01:31   #3
kedbl4
Пользователь
 
Регистрация: 09.09.2009
Сообщений: 28
По умолчанию

огромное спасибо!!! а то в универе требуют того что еще не проходили....по книгам 80% где-то понимаешь, поэтому пока тяжеловато


если кому мот пригодится вот код:

Код:
#include <iostream>
using namespace std;

class myclass
{
	int **mas; //матрица
	int size; //размер матрицы
public:
	myclass(); //конструктор
	myclass(int k); //конструктор, k-размер матрицы
	myclass(myclass &a);
	~myclass(); //деструктор
	void set_mas(); //функция заполнения матрицы
	void print(); //функция вывода на экран матрицы
	int back_size() {return size;} // функция возр размер матрицы
	myclass x(myclass& b); //функция перемножения матриц
	myclass& operator=(const myclass&);
};

myclass& myclass::operator=(const myclass&aa)
	{ 
		int i;
		if(this!=&aa)
	{
		for (i=0;i<size;i++) delete[] mas[i];
		delete[] mas;
		size=aa.size;
		mas=new int*[size];
		for (i=0;i<size;i++)
		{
			mas[i]=new int[size];
			memcpy(mas[i], aa.mas[i], sizeof(int)*size);
		}
		cout<<"=\n";
	}
	return *this;
	}
myclass::myclass(myclass &a)
{
	size=a.size;
	mas= new int * [a.size];
	if(mas== NULL ) return;     
	for (int i=0; i < a.size; i++)
	{
		mas[i] = new int [a.size];
		if(mas[i] == NULL ) return;
	}                           //выделение памяти под матрицу
	for(int t=0;t<a.size;t++)
		for(int j=0;j<a.size;j++)
			mas[t][j]=a.mas[t][j];
}

void myclass::set_mas()
{
	  for(int i=0; i<size;i++)  
	  for(int j=0;j<size;j++)
	  {
		  cout<<endl<<"Введите значение "<<i+1<<"-ого столбца    "<<j+1<<"-ой строки : ";
          cin>>mas[i][j];
	  } //цикл заполнения матрицы
  system("cls"); 
  cout <<"Матрица заполнена...";
}
myclass myclass::x(myclass& b)
{
	int sum=0;
	myclass c(b.back_size()); //создаем результирующий объект
	for(int i=0;i<size;i++)
		for(int j=0;j<size;j++)
		{
			for(int k=0;k<size;k++)
			{
				sum+=mas[i][k]*b.mas[k][j];
			}
         c.mas[i][j]=sum;
		} //цикл перемножения матрци
	cout<<endl<<endl<<"Результат перемножения матриц:";
	return c;
}
void myclass::print()
{	
	for(int i=0; i<size;i++)
	{
		cout<<endl;
	  for(int j=0;j<size;j++)
	  {
		  cout<<mas[i][j]<<"   ";;
          
	  }
	} //цикл вывода на экран матрицы
	cout<<endl<<endl<<endl;
}
myclass::myclass()
{
	cout<<"Создание..."<<endl;
}
myclass::myclass(int k)
{
	size=k;  //заносим в объект рахзмер матрицы
	mas= new int * [size];
    if(mas== NULL ) return;     
  for (int i=0; i < size; i++)
  {
    mas[i] = new int [size];
   if(mas[i] == NULL ) return;
  }                           //выделение памяти под матрицу

 }
myclass::~myclass()
{
	for (int i=0; i < size; i++)
    delete  [] mas[i];
	delete [] mas;     
 
}
int main()
{
	setlocale(LC_ALL,"rus");
	
	int size1,size2;
	cout<<"Введите размерность первой матрицы:";
	cin >>size1;
	cout<<"Введите размерность второй матрицы:";
	cin >>size2;
	myclass a(size1),b(size2),z(size2);  //создаем объекты размерностью size1 и size2
	system("cls");
	cout<<"Заполнение 1-ой матрицы";
	a.set_mas(); //вызов функции заполнения матрицы
	system("cls");
	cout<<"Заполнение 2-ой матрицы";
	b.set_mas();  //вызов функции заполнения матрицы
	system("cls");
	cout<<"Первая введенная матрица:";
	a.print(); //вызов функции печати матрицы
	cout<<"Вторая введенная матрица:";
	b.print(); //вызов функции печати матрицы
	z=a.x(b);  //вызов функции перемножения матриц
	z.print();
	return 0;
}
kedbl4 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматический возврат на предыдущую страницу. viscas PHP 4 12.08.2019 10:08
Возврат коретки Михаил Юрьевич Общие вопросы Delphi 4 03.07.2008 20:36
Возврат результата функции по ссылке gladov Общие вопросы C/C++ 2 24.06.2008 22:48
Отмена условия, возврат к изначальному Дикий Помощь студентам 5 14.06.2008 01:19
Возврат округленного числа risen Microsoft Office Excel 5 21.04.2008 22:06