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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2020, 13:51   #1
Audax_Rogerus
Пользователь
 
Регистрация: 06.06.2020
Сообщений: 36
Сообщение Параметризированные классы

Реализовать на языке С++ параметризованный класс "Матрица", типы элементов которого могут быть заданы заданы пользователем (Cartesian Vector и Polar Vector).
Возникает первый вопрос: Элементы матрицы могут иметь разные типы? (противоречит св-ву матриц - однородность).
Второй вопрос: если нет, то почему не работает данный код?

Main.cpp

Код:
#include "PolarVector.h"
#include "CartesianVector.h"
#include "Matrix.h"
int main()
{
	setlocale(LC_ALL, "Russian");
	Matrix<CartesianVector> A(3, 3);
	A.input();
	A.print();

}
CartesianVector.h

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

class CartesianVector
{
public:
	CartesianVector(int N = 0);

	CartesianVector operator*(float k);
	void input();
	void print();

private:

	int N; // n-мерное пространство
	vector <float> X;
};
CartesianVector.cpp

Код:
#include "CartesianVector.h"

CartesianVector::CartesianVector(int N)
{
	this->N = N;
	X.resize(N);
}

CartesianVector CartesianVector::operator*(float k)
{
	CartesianVector tmp(N);
	for (int i = 0; i < N; i++)
	{
		tmp.X[i] = this->X[i] * k;
	}

	return tmp;
}

void CartesianVector::input()
{
	if (N == 0)
	{
		cout << "Введите мерность пространства! N = ";
		cin >> this->N;
		X.resize(N);
	}
		for (int i = 0; i < N; i++)
		{
			cout << "x[" << i + 1 << "] = ";
			cin >> X[i];
		}
}

void CartesianVector::print()
{
	cout << "(";
	for (int i = 0; i < N - 1; i++)
	{
		cout << X[i] << "; ";
	}
	cout << X[N - 1] << ")";
}
PolarVector.h
Код:
#pragma once
#include <iostream>
using namespace std;

class PolarVector
{
public:

	PolarVector(float r = 0, float fi = 0);
	~PolarVector();

	PolarVector operator*(float k);
	void input();
	void print();

private:

	float r, fi;

};
PolarVector.cpp
Код:
#include "PolarVector.h"

PolarVector::PolarVector(float r, float fi)
{
	this->r = r;
	this->fi = fi;
}

PolarVector::~PolarVector()
{
	this->r = 0;
	this->fi = 0;
}

PolarVector PolarVector::operator*(float k)
{
	PolarVector tmp(0);
	tmp.r = this->r * k;
	tmp.fi = this->fi;
	return tmp;
}

void PolarVector::input()
{
	setlocale(LC_ALL, "Russian");

	cout << "r = ";
	cin >> r;

	cout << "ф = ";
	cin >> fi;
}

void PolarVector::print()
{
	cout << "(" << r << "; " << fi << ")";
}
Matrix.h
Код:
#pragma once
template <typename T>
class Matrix
{
public:

	Matrix(int M, int N);
	~Matrix();

	Matrix<T> operator*(float k);
	void input();
	void print();

private:

	int M, N;
	T** A;

};

template <typename T>
class Matrix
{
public:

	Matrix(int M, int N);
	~Matrix();

	Matrix<T> operator*(float k);
	void input();
	void print();

private:

	int M, N;
	T** A;

};

template<typename T>
inline Matrix<T>::Matrix(int M, int N)
{
	A = new T * [M];
	for (int i = 0; i < M; i++)
	{
		A[i] = new T[N];
	}

	/*
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			A[i][j] = NULL;
			B[i][j] = NULL;
		}
	}
	*/
}

template<typename T>
inline Matrix<T>::~Matrix()
{
	for (int i = 0; i < M; i++)
	{
		delete[] A[i];
	}
	delete[] A;
}

template<typename T>
inline Matrix<T> Matrix<T>::operator*(float k)
{
	Matrix<T> tmp(M, N);
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			tmp.A[i][j] = this->A[i][j] * k;
		}
	}
	return tmp;
}

template<typename T>
inline void Matrix<T>::input()
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			A[i][j].input();
		}
	}
}

template<typename T>
inline void Matrix<T>::print()
{
	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			A[i][j].print();
			cout << "\t";
		}
		cout << endl;
	}
}
Где здесь ошибка? Уже долго ищу... пересмотрел много в интернете.. все ровно не пойму...
Audax_Rogerus вне форума Ответить с цитированием
Старый 10.10.2020, 09:23   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

А компилятор не пишет, где именно ошибка?
Откровенно лень делать все эти файлы и компилировать
Black Fregat вне форума Ответить с цитированием
Старый 10.10.2020, 10:58   #3
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

Цитата:
Сообщение от Audax_Rogerus Посмотреть сообщение
Возникает первый вопрос
в данном случае имеется в виду параметр шаблона, а не тип отдельных элементов

Цитата:
Сообщение от Audax_Rogerus Посмотреть сообщение
почему не работает данный код
что именно не работает, в чём это выражается ?
Алексей1153 вне форума Ответить с цитированием
Старый 10.10.2020, 11:02   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

Цитата:
Сообщение от Audax_Rogerus Посмотреть сообщение
Matrix.h
в этом файле в самом начале есть лишний код:
Код:
template <typename T>
class Matrix
{
public:

	Matrix(int M, int N);
	~Matrix();

	Matrix<T> operator*(float k);
	void input();
	void print();

private:

	int M, N;
	T** A;

};
отладкой не занимался. Кто хочет поиграться с кодом - https://onlinegdb.com/HyX391JPv

по меньшей мера неплохо бы избавиться от
Код:
	int M, N;
	T** A;
- заменить на вектор

Последний раз редактировалось Алексей1153; 10.10.2020 в 11:05.
Алексей1153 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C#] Распараллелить решение следующих задач, используя параметризированные потоки: Найти максимальный путь в двоичном графе llegion Фриланс 2 11.10.2019 12:58
C++ классы Ligeros905 Помощь студентам 2 31.03.2014 20:18
Классы Fallenangel Помощь студентам 17 25.04.2011 23:48