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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2010, 17:54   #1
ArtGoN
Пользователь
 
Регистрация: 11.05.2010
Сообщений: 11
По умолчанию Преобразование типов

Задание реализовать операции для преобразования типов. У меня в классе элементы матрици типа INT как реализовать преобразование типа в DOUBLE ?


Код:
#include <iostream.h>
#include <conio.h>
#include <math.h>

// Класс матрица
class Matrix
	{
	private:
	// Собственные элементы:
 
		static int size;     // Порядок матрицы
		int **matrix;			// Матрица
	public:
	// Общедоступные элементы:
 
		Matrix() {}	// Конструктор по умолчанию
		Matrix(const Matrix &Object); // Конструктор копирования
		~Matrix();	// Деструктор
 
		Matrix &operator=(const Matrix &Object); // Перегрузка =
 
		Matrix operator+(Matrix &);	// Сложение матриц
		Matrix operator-(Matrix &);	// Вычитание матриц
		Matrix operator*(Matrix &);	// Перемножение матриц
 
		// Перегрузка оператора << для вывода матрицы
		friend ostream &operator<<(ostream &, Matrix &);
		// Перегрузка оператора >> для ввода матрицы
		friend istream &operator>>(istream &, Matrix &);
	};
 
// Конструктор копирования
Matrix::Matrix(const Matrix &Object)
	{
	int i,j;
	size = Object.size;
	matrix = new int *[size];
	for (i = 0; i < size; i++)
		matrix[i] = new int [size];
	for (i = 0; i < size; i++)
		for (j = 0; j < size; j++)
	matrix[i][j] = Object.matrix[i][j];
	}
 
// Деструктор
Matrix::~Matrix()
	{
	for (int i = 0; i < size; i++)
		delete matrix[i];
	delete matrix;
	}
 

// =
Matrix& Matrix::operator=(const Matrix &Object)
	{
	int i, j;
	size = Object.size;
	matrix = new int *[size];
	for (i = 0; i < size; i++)
		matrix[i] = new int [size];
	for (i = 0; i < size; i++)
		for (j = 0; j < size; j++)
	matrix[i][j] = Object.matrix[i][j];
	return *this;
	}
 
//+
Matrix Matrix::operator+(Matrix &fp1)
	{
	int i, j;
	if (size == fp1.size)
		{
		Matrix fp(fp1);
		for (i=0;i<fp.size;i++)
			for (j=0;j<fp.size;j++)
				fp.matrix[i][j]=matrix[i][j]+fp1.matrix[i][j];
		return fp;
		}
	}
 
// -
Matrix Matrix::operator-(Matrix &fp1)
	{
	int i, j;
	if (size == fp1.size)
		{
		Matrix fp(fp1);
		for (i = 0; i < fp.size; i++)
			for (j = 0; j < fp.size; j++)
				fp.matrix[i][j] = matrix[i][j] - fp1.matrix[i][j];
		return fp;
		}
	}
 
// *
Matrix Matrix::operator*(Matrix &fp1)
	{
	int i, j, k, sum;
	if (size == fp1.size)
		{
		Matrix fp(fp1);
		for(i = 0; i < fp.size; i++)
			for(j = 0; j < fp.size; j++)
				{
				sum = 0;
				for (k = 0; k < fp.size; k++)
					sum += matrix[i][k] * fp1.matrix[k][j];
				fp.matrix[i][j]=sum;
				}
		return fp;
		}
	}
 
// >>
istream &operator>>(istream &fi, Matrix &fp)
	{
	int i, j;
	fp.matrix = new int *[fp.size];
	for (i = 0; i < fp.size; i++)
		fp.matrix[i] = new int [fp.size];
 
	for (i = 0; i < fp.size; i++)
		for (j = 0; j < fp.size; j++)
		{
		gotoxy((j + 1) * 4, y + i + 2);
		fi >> fp.matrix[i][j];
		}
	y += i + 2 /*- 1*/;
	return fi;
	}
 
// <<
ostream &operator<<(ostream &fo, Matrix &fp)
	{
	int i, j;
	for (i = 0; i < fp.size; i++)
		for (j = 0; j < fp.size; j++)
			{
			gotoxy((j + 1) * 4, y + i + 2);
			fo << fp.matrix[i][j];
			}
	y += i + 2 /*- 1*/;
	return fo;
	}
 
int Matrix::size = 2;
 
void main()
	{
	clrscr();
	Matrix pr1, pr2;
	cout << " Vveditb matr A ->\n ";
	cin >> pr1;
	cout << "\nVeditb matr B ->\n ";
	cin >> pr2;
	cout << "\nA+B ="<<(pr1+pr2);
	cout << "\n\nA-B ="<<(pr1-pr2);
	cout << "\n\nA*B ="<<(pr1*pr2);
	cout << "\n\nA=B, A="<<(pr1=pr2);
	getch();
	}
ArtGoN вне форума Ответить с цитированием
Старый 04.12.2010, 18:13   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

В чем вопрос? Как преобразовать int в double? (???)
Или же как создать экземпляр класса Matrix с данными типа double? В этом случае следует использовать шаблонный класс и шаблонный оператор приведения типа.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 04.12.2010, 18:32   #3
ArtGoN
Пользователь
 
Регистрация: 11.05.2010
Сообщений: 11
По умолчанию

Да, нужно сделать второй вариант: создать экземпляр класса Matrix с данными типа double.
ArtGoN вне форума Ответить с цитированием
Старый 04.12.2010, 20:42   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Как-то так организовать можно:
Код:
#include <iostream>
#include <conio.h>
#include <cmath>

using namespace std;

// Класс матрица
template <class T>
class Matrix
	{
	private:
	// Собственные элементы:
 
		static int size;     // Порядок матрицы
		T **matrix;			// Матрица
	public:
	// Общедоступные элементы:
 
		Matrix() {}	// Конструктор по умолчанию
		Matrix(const int s);
		Matrix(const Matrix<T> &Object); // Конструктор копирования
		~Matrix();	// Деструктор
 
		Matrix &operator=(const Matrix<T> &Object); // Перегрузка =
 
		Matrix operator+(Matrix<T> &);	// Сложение матриц
		Matrix operator-(Matrix<T> &);	// Вычитание матриц
		Matrix operator*(Matrix<T> &);	// Перемножение матриц
 
		// Перегрузка оператора << для вывода матрицы
		template <class T1>
			friend ostream &operator<<(ostream &, Matrix<T1> &);
		// Перегрузка оператора >> для ввода матрицы
		template <class T1>
			friend istream &operator>>(istream &, Matrix<T1> &);

		T& at(const int line, const int st);

		template <class TCast>
			operator Matrix<TCast> () const;
	};

template <class T>
T& Matrix<T>::at(const int line, const int st)
{
	return matrix[line][st];
}


template <class T>
template <class TCast>
Matrix<T>::operator Matrix<TCast> () const
	{
	Matrix<TCast> m(size);
	int i, j;
	for (i = 0; i < size; i++)
		for (j = 0; j < size; j++)
	m.at(i, j) = static_cast<TCast>(matrix[i][j]);
	return m;
	}
 
template <class T>
Matrix<T>::Matrix(const int s)
	{
	int i,j;
	size = s;
	matrix = new T *[size];
	for (i = 0; i < size; i++)
		matrix[i] = new T [size];
	for (i = 0; i < size; i++)
		for (j = 0; j < size; j++)
	matrix[i][j] = T();
	}

// Конструктор копирования
template <class T>
Matrix<T>::Matrix(const Matrix<T> &Object)
	{
	int i,j;
	size = Object.size;
	matrix = new T *[size];
	for (i = 0; i < size; i++)
		matrix[i] = new T [size];
	for (i = 0; i < size; i++)
		for (j = 0; j < size; j++)
	matrix[i][j] = Object.matrix[i][j];
	}
 
// Деструктор
template <class T>
Matrix<T>::~Matrix()
	{
	for (int i = 0; i < size; i++)
		delete matrix[i];
	delete matrix;
	}
 

// =
template <class T>
Matrix<T>&  Matrix<T>::operator=(const Matrix<T> &Object)
	{
	int i, j;
	size = Object.size;
	matrix = new T *[size];
	for (i = 0; i < size; i++)
		matrix[i] = new T [size];
	for (i = 0; i < size; i++)
		for (j = 0; j < size; j++)
	matrix[i][j] = Object.matrix[i][j];
	return *this;
	}
 
//+
template <class T>
Matrix<T> Matrix<T>::operator+(Matrix<T> &fp1)
	{
	int i, j;
	if (size == fp1.size)
		{
		Matrix<T> fp(fp1);
		for (i=0;i<fp.size;i++)
			for (j=0;j<fp.size;j++)
				fp.matrix[i][j]=matrix[i][j]+fp1.matrix[i][j];
		return fp;
		}
	return fp1;
	}
 
// -
template <class T>
Matrix<T> Matrix<T>::operator-(Matrix<T> &fp1)
	{
	int i, j;
	if (size == fp1.size)
		{
		Matrix<T> fp(fp1);
		for (i = 0; i < fp.size; i++)
			for (j = 0; j < fp.size; j++)
				fp.matrix[i][j] = matrix[i][j] - fp1.matrix[i][j];
		return fp;
		}
	return fp1;
	}
 
// *
template <class T>
Matrix<T> Matrix<T>::operator*(Matrix<T> &fp1)
	{
	int i, j, k;
	T sum;
	if (size == fp1.size)
		{
		Matrix<T> fp(fp1);
		for(i = 0; i < fp.size; i++)
			for(j = 0; j < fp.size; j++)
				{
				sum = 0;
				for (k = 0; k < fp.size; k++)
					sum += matrix[i][k] * fp1.matrix[k][j];
				fp.matrix[i][j]=sum;
				}
		return fp;
		}
	return fp1;
	}
 
// >>
template <class T>
istream &operator>>(istream &fi, Matrix<T> &fp)
	{
	int i, j;
	fp.matrix = new T *[fp.size];
	for (i = 0; i < fp.size; i++)
		fp.matrix[i] = new T [fp.size];
 
	for (i = 0; i < fp.size; i++)
		for (j = 0; j < fp.size; j++)
		{
		//gotoxy((j + 1) * 4, y + i + 2); // <In Visual Studion it can't be compiled>
		fi >> fp.matrix[i][j];
		}
	//y += i + 2 /*- 1*/;
	return fi;
	}
 
// <<
template <class T>
ostream &operator<<(ostream &fo, Matrix<T> &fp)
	{
	int i, j;
	for (i = 0; i < fp.size; i++)
		for (j = 0; j < fp.size; j++)
			{
			//gotoxy((j + 1) * 4, y + i + 2); // <In Visual Studion it can't be compiled>
			fo << fp.matrix[i][j];
			}
	//y += i + 2 /*- 1*/; // <In Visual Studion it can't be compiled>
	return fo;
	}
 
template <class T>
int Matrix<T>::size = 2;
 
void main()
	{
	//clrscr(); // <In Visual Studion it can't be compiled>
	Matrix<int> pr1;
	Matrix<double> pr2;
	cout << " Vveditb matr A ->\n ";
	cin >> pr1;
	cout << "\nVeditb matr B ->\n ";
	cin >> pr2;
	cout << "\nA+B ="<<(static_cast<Matrix<double> >(pr1)+pr2);
	cout << "\n\nA-B ="<<(static_cast<Matrix<double> >(pr1)-pr2);
	cout << "\n\nA*B ="<<(static_cast<Matrix<double> >(pr1)*pr2);
	cout << "\n\nA=B, A="<<(pr1=pr2);

	}
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 04.12.2010, 20:50   #5
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Только у вас тут каша полная: все найдется - от утечек памяти и до отсутствия возврата значения из функции. Мне нормальный компилятор салют тут устроил. Все это хозяйство я даже не смотрел; только надстроил шаблоны.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 04.12.2010, 21:32   #6
ArtGoN
Пользователь
 
Регистрация: 11.05.2010
Сообщений: 11
По умолчанию

Я же делал под Borland C++... пасиб что потратил время чтобы помоч, ток я в Борланде немогу её запустить на выполнение..
ArtGoN вне форума Ответить с цитированием
Старый 04.12.2010, 21:34   #7
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
ток я в Борланде немогу её запустить на выполнение..
Не компилируется? Там я немного заголовки поправил и т.д., а то компилятор меня посылал.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 04.12.2010, 22:00   #8
ArtGoN
Пользователь
 
Регистрация: 11.05.2010
Сообщений: 11
По умолчанию

в Борланде ошибку выдает на - template <class T1> , template <class TCast>, ошибка : "Declaration terminated incorrectly".
ArtGoN вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование типов rommster Общие вопросы C/C++ 6 23.11.2010 08:11
Преобразование типов Aleksandra1990 Общие вопросы C/C++ 5 12.05.2010 17:32
Си. Преобразование типов pif Помощь студентам 3 20.04.2009 13:54
Преобразование типов DeFace Общие вопросы C/C++ 4 24.03.2009 17:06
Преобразование типов Pronik Общие вопросы Delphi 2 12.06.2007 12:23