котвася
29-07-2010, 19:32
я на много медленнее это делаю, просто хобби. А без хобби на куда, т.к это одно из составляющих счастья :)
это не пример конечно, а мое искусство :)
хотелось бы узнать в каком месте я за рычаг потянул?
надо было перегрузить 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::operator [](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 ==========
это не пример конечно, а мое искусство :)
хотелось бы узнать в каком месте я за рычаг потянул?
надо было перегрузить 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::operator [](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 ==========