Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Матрицы - перегрузка оператора - operator[][]

Ответить
Настройки темы
C/C++ - Матрицы - перегрузка оператора - operator[][]

Аватара для котвася

Пользователь


Сообщения: 147
Благодарности: 5

Профиль | Отправить PM | Цитировать


я на много медленнее это делаю, просто хобби. А без хобби на куда, т.к это одно из составляющих счастья

это не пример конечно, а мое искусство
хотелось бы узнать в каком месте я за рычаг потянул?
надо было перегрузить operator[][] << >> для матриц.

криворукий код:
Код: Выделить весь код
//MAIN.CPP
//Перегрузка операций

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::ostream;
using std::istream;

#include <iomanip>

using std::setw;

//Определение класса Matrix

class Matrix
{
	friend ostream &operator<< (ostream &, const Matrix &);
	friend istream &operator>> (istream &, Matrix &);
public:
	Matrix(int, int);
	~Matrix();
	int &operator[](int);
private:
	int const line;
	int const column;
	int *mPtr;
};

Matrix::Matrix(int l, int c)
:line(l), column(c)
{
	mPtr = new int[line+1][column+1];
}

Matrix::~Matrix()
{
	delete [] mPtr;
}

ostream &operator<< (ostream &output, const Matrix &m)
{
	for(int i = 0; i < m.line; i++)
		for(int j = 0; j < m.column; j++)
			output << m[i][j] << endl;
	return output;
}

istream &operator>> (istream &input, Matrix &m)
{
	for(int i = 0; i < m.line; i++)
		for(int j = 0; j < m.column; j++)
			input >> setw(1) >> m[i][j];
	return input;
}

int &Matrix::operator[][] (int Line, int Column)
{
	return ((Line >= 0 && Column >= 0 && Line < line && Column < column) ? mPtr[Line][Column] : mPtr[0][0]);
}

int main()
{
	setlocale(LC_ALL, ".1251");
	cout << "Введите размер матрицы(строка х столбец)" << endl;
	int line, column;

	cin >> line >> column;

	Matrix matrix(line, column);

	cout << "Введите значения матрицы:" << endl;

	cin >> matrix;

	cout << "Вы ввели: " << endl << matrix;

	system("pause");

	return 0;
}

1>------ Построение начато: проект: Упражнение_на_перегрузку_операций, Конфигурация: Debug Win32 ------
1>Компиляция...
1>main.cpp
1>c:\$p\mvs\{как программировать на с++}\упражнение_на_перегрузку_операций\упражнение_на_перегрузку_операций\main.cpp(35) : error C2540: неконстантное выражение используется в качестве границы массива
1>c:\$p\mvs\{как программировать на с++}\упражнение_на_перегрузку_операций\упражнение_на_перегрузку_операций\main.cpp(35) : error C2440: =: невозможно преобразовать 'int (*)[1]' в 'int *'
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
1>c:\$p\mvs\{как программировать на с++}\упражнение_на_перегрузку_операций\упражнение_на_перегрузку_операций\main.cpp(45) : error C2059: синтаксическая ошибка: ]
1>c:\$p\mvs\{как программировать на с++}\упражнение_на_перегрузку_операций\упражнение_на_перегрузку_операций\main.cpp(52) : error C2678: бинарный '[': не найден оператор, принимающий левый операнд типа 'const Matrix' (или приемлемое преобразование отсутствует)
1> c:\$p\mvs\{как программировать на с++}\упражнение_на_перегрузку_операций\упражнение_на_перегрузку_операций\main.cpp(25): может быть 'int &Matrix:perator [](int)'
1> при попытке сопоставить список аргументов '(const Matrix, int)'
1>c:\$p\mvs\{как программировать на с++}\упражнение_на_перегрузку_операций\упражнение_на_перегрузку_операций\main.cpp(60) : error C2109: для индекса требуется массив или указатель
1>Журнал построения был сохранен в "file://c:\$p\mvs\{как программировать на с++}\Упражнение_на_перегрузку_операций\Упражнение_на_перегрузку_операций\Debug\BuildLog.htm"
1>Упражнение_на_перегрузку_операций - ошибок 5, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Отправлено: 19:32, 29-07-2010

 

Аватара для котвася

Пользователь


Сообщения: 147
Благодарности: 5

Профиль | Отправить PM | Цитировать


часть сам уже сделал:
Код: Выделить весь код
//MAIN.CPP
//Перегрузка операций

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::ostream;
using std::istream;

#include <iomanip>

using std::setw;

//Определение класса Matrix

class Matrix
{
	friend ostream &operator<< (ostream &, const Matrix &);
public:
	Matrix(int, int);
	~Matrix();
private:
	int ROW;
	int COLUMN;
	int **matrixPtr;
	int *linePtr;
};


//----------------------------------------------------------------

Matrix::~Matrix()
{
	for(int i = 0; i < ROW; i++)
		delete [] matrixPtr[i];
	delete [] matrixPtr;
}

//----------------------------------------------------------------

ostream &operator<< (ostream &out, const Matrix &M)
{
	for(int i= 0; i <M.ROW; i++)
	{
		for(int j = 0; j < M.COLUMN; j++)
			out << *(M.matrixPtr[i]+j);
		out << endl;
	}
	return out;
}

//---------------------------------------------------------------

Matrix::Matrix(int row, int column)
{
	ROW = row;
	COLUMN = column;
	matrixPtr = new int*[ROW];
	for(int i = 0; i < ROW; i++)
	{
		matrixPtr[i] = new int[COLUMN];
		for(int j = 0; j < COLUMN; j++)
			*(matrixPtr[i] + j) = j;
	}
}
int main()
{
	setlocale(LC_ALL, ".1251");
	cout << "Введите размер матрицы(строка х столбец)" << endl;
	Matrix matrix(5, 6);

	cout << matrix << endl;

	system("pause");
	return 0;
}
осталось [][] кто поможет?
Мне кажется, что надо [] последовательно перегрузить. А?

Отправлено: 20:51, 29-07-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для котвася

Пользователь


Сообщения: 147
Благодарности: 5

Профиль | Отправить PM | Цитировать


Я решил все сам, ток не могу понять как оно работает:
Код: Выделить весь код
//MAIN.CPP
//Перегрузка операций

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::ostream;
using std::istream;

#include <iomanip>

using std::setw;

//Определение класса Matrix

class Matrix
{
	friend ostream &operator<< (ostream &, const Matrix &);
public:
	int *operator[](int);
	Matrix(int, int);
	~Matrix();
private:
	int ROW;
	int COLUMN;
	int **matrixPtr;
	int *linePtr;
};

//----------------------------------------------------------------

int *Matrix::operator[] (int number)
{
		return matrixPtr[number];
}

//----------------------------------------------------------------

Matrix::~Matrix()
{
	for(int i = 0; i < ROW; i++)
		delete [] matrixPtr[i];
	delete [] matrixPtr;
}

//----------------------------------------------------------------

ostream &operator<< (ostream &out, const Matrix &M)
{
	for(int i= 0; i <M.ROW; i++)
	{
		for(int j = 0; j < M.COLUMN; j++)
			out << setw(4) << *(M.matrixPtr[i]+j) << ' ';
		out << endl;
	}
	return out;
}

//---------------------------------------------------------------

Matrix::Matrix(int row, int column)
{
	ROW = row;
	COLUMN = column;
	matrixPtr = new int*[ROW];
	for(int i = 0; i < ROW; i++)
	{
		matrixPtr[i] = new int[COLUMN];
		for(int j = 0; j < COLUMN; j++)
			*(matrixPtr[i] + j) = j*i;
	}
}
int main()
{
	int m[2][3];
	setlocale(LC_ALL, ".1251");
	cout << "Введите размер матрицы(строк -> столбцов)" << endl;
	int row, column;
	cin >> row >> column;
	Matrix matrix(row, column);
	cout << matrix << endl;
	cout << "Введите индекс ячейки(стока -> столбец)" << endl;
	cin >> row >> column;
	cout << "matrix[" << row << "][" << column << "]= " << matrix[row][column] << endl;

	system("pause");
	return 0;
}

Отправлено: 22:51, 29-07-2010 | #3


Аватара для котвася

Пользователь


Сообщения: 147
Благодарности: 5

Профиль | Отправить PM | Цитировать


Остался один вопрос.
Как сделать так, что бы вместо
Код: Выделить весь код
matrix[row][column]
писать
Код: Выделить весь код
matrix[row, column]  ???

Отправлено: 23:15, 29-07-2010 | #4


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


котвася, Это надо кажется перегружать () - operator()

Тогда будет формироватья matrix(row, column);

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 14:17, 30-07-2010 | #5

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


вариантов как всегда море:
1)
Код: Выделить весь код
struct index
{
  int col, row;
  index(int c, int r) : col(c), row(r) {}
};

const double& Matrix::operator[](index i) {...}
...

// используем:
double d = matrix[index(1,1)];
2)
Код: Выделить весь код
class Row
{
public:
  double operator[](int col) {return owner->cell(row, col);}
  Row(Matrix& m, int i) : owner(&m), index(i) {}
private:
  int index;
  Matrix* owner;
};

class Matrix
{
public:
  Row operator[](int row) {return Row(this,row);}
  const double& cell(int row, int col);
};

// пользуем:
double d = matrix[row][col];
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:35, 30-07-2010 | #6


Аватара для котвася

Пользователь


Сообщения: 147
Благодарности: 5

Профиль | Отправить PM | Цитировать


Как понял надо сделать так:
Код: Выделить весь код
//MAIN.CPP
//Перегрузка операций

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::ostream;
using std::istream;

#include <iomanip>

using std::setw;



struct index
{
	int _COLUMN, _ROW;
	index(int row, int column) :_ROW(row), _COLUMN(column) {} 
};


//Определение класса Matrix
class Matrix
{
	friend ostream &operator<< (ostream &, const Matrix &);
public:
	int &operator[](int);
	int &operator[](index);
	Matrix(int, int);
	~Matrix();
private:
	int ROW;
	int COLUMN;
	int **matrixPtr;
	int *linePtr;
};

int &Matrix::operator[](index i)
{
	return *matrixPtr[i._ROW, i._COLUMN];
}

//----------------------------------------------------------------

int &Matrix::operator[] (int number)
{
		return *matrixPtr[number];
}

//----------------------------------------------------------------

Matrix::~Matrix()
{
	for(int i = 0; i < ROW; i++)
		delete [] matrixPtr[i];
	delete [] matrixPtr;
}

//----------------------------------------------------------------

ostream &operator<< (ostream &out, const Matrix &M)
{
	for(int i= 0; i <M.ROW; i++)
	{
		for(int j = 0; j < M.COLUMN; j++)
			out << setw(4) << *(M.matrixPtr[i]+j) << ' ';
		out << endl;
	}
	return out;
}

//---------------------------------------------------------------

Matrix::Matrix(int row, int column)
{
	ROW = row;
	COLUMN = column;
	matrixPtr = new int*[ROW];
	for(int i = 0; i < ROW; i++)
	{
		matrixPtr[i] = new int[COLUMN];
		for(int j = 0; j < COLUMN; j++)
			*(matrixPtr[i] + j) = j*i;
	}
}
int main()
{
	setlocale(LC_ALL, ".1251");
	cout << "Введите размер матрицы(строк -> столбцов)" << endl;
	int row, column;
	cin >> row >> column;
	Matrix matrix(row, column);
	cout << matrix << endl;
	cout << "Введите индекс ячейки(стока -> столбец)" << endl;
	cin >> row >> column;
	//cout << "matrix[" << row << "][" << column << "]= " << matrix[row][column] << endl;
	cout << "matrix[" << row << "," << column << "]= " << matrix[row,column] << endl;
	cout << endl;

	system("pause");
	return 0;
}
только вот не правильно работает

Отправлено: 00:04, 31-07-2010 | #7

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата котвася:
int &Matrix:perator[](index i) { return *matrixPtr[i._ROW, i._COLUMN]; } »
это чего такое? оно собирается?
Код: Выделить весь код
// примерно так должно быть
return *matrixPtr[i._ROW*COLUMN + i._COLUMN];

Отправлено: 21:07, 31-07-2010 | #8


Аватара для котвася

Пользователь


Сообщения: 147
Благодарности: 5

Профиль | Отправить PM | Цитировать


собирается, чего тут удивительного?

Отправлено: 22:07, 31-07-2010 | #9

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


я думал в c/c++ нет конструкции [a, b] (т.е. вызова оператора [] с двумя аргументами)

Отправлено: 23:47, 31-07-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Матрицы - перегрузка оператора - operator[][]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - [решено] Нахождение обратной матрицы методом Гаусса и рассширенной матрицы D.Y. Программирование и базы данных 64 06-05-2011 22:59
C/C++ - Перегрузка операторов 'operator []' ganselo Программирование и базы данных 3 29-03-2009 14:57
OperaTor Sharik987 Хочу все знать 5 04-12-2008 12:37
Основы C++ | Перегрузка operator+ для m_string Skrip Программирование и базы данных 1 10-08-2005 13:41
Перегрузка оператора пробел и многое другое. ivank Программирование и базы данных 4 15-09-2002 06:47




 
Переход