→ Для вступления в общество новичков и профессионалов программирования, пожалуйста нажмите здесь ...

Форум программистов: C++, Basic, Delphi, Pascal, JavaScript
Логин: Пароль:
Запомнить?  
@Mail.ru



Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Перегрузка операторов 
Автор Сообщение
Начинающий

Регистрация: 08.09.2008
Сообщения: 1

Репутация: 0 [ ? ]
Сообщение Перегрузка операторов
Доброго времени суток!

Решил создать класс матрица с перегруженными операциями +,-,* и т.д.
Вот кусок кода
Объявление класса Matrix:
[syntax=cpp]
#include <iostream>

using namespace std;

class Matrix {
friend ostream &operator<<(ostream &, Matrix &);

public:
Matrix (int = 3, int = 3);
Matrix(Matrix &);
~Matrix ();
int getCol() {return column_number;};
int getRow() {return row_number;};

double &operator() (int, int);
double &operator() (int);

Matrix &operator=(Matrix &);
Matrix &operator+=(Matrix &);
private:
double** ptr_col;
int row_number, column_number;
};

Matrix operator+(Matrix &A, Matrix &B);

[/syntax]

Реализация класса

[syntax=cpp]
#include "Matrix.h"

#include <stdlib.h>
#include <iomanip>
#include <assert.h>

using namespace std;

Matrix::Matrix(int row, int column) { // constructor
assert (column > 0 && row > 0);
row_number = row;
column_number = column;
ptr_col = new double*[column_number];
assert (ptr_col != 0);
int i,j;
for(i = 0; i < column_number; i++) {
ptr_col[i] = new double[row_number];
assert(ptr_col[i] != 0);
}
for (i = 0; i < column_number; i++)
for(j = 0; j < row_number; j++)
ptr_col[i][j] = 0;
}

Matrix::Matrix(Matrix& B) { // copy constructor


for(int i = 0; i < column_number; i++)
{
if(ptr_col[i] != NULL)
delete [] ptr_col[i];
if (ptr_col != NULL)
delete [] ptr_col;
}
row_number = B.getRow();
column_number = B.getCol();
ptr_col = new double*[column_number];
assert (ptr_col != 0);
int i,j;
for(i = 0; i < column_number; i++) {
ptr_col[i] = new double[row_number];
assert(ptr_col[i] != 0);
}
for (i = 0; i < column_number; i++)
for(j = 0; j < row_number; j++)
ptr_col[i][j] = B(j+1,i+1);
}


Matrix::~Matrix () { // destructor
for(int i = 0; i < column_number; i++)
delete [] ptr_col[i];
delete [] ptr_col;
}

double &Matrix::operator()(int row, int col) { // indexing
assert(col >= 0 && col <= column_number && row >= 0 && row <= row_number);

return ptr_col[col-1][row-1];
}
ostream &operator<<(ostream &output, Matrix &M) { // output operator <<
int i, j;
for (i = 1; i <= M.getRow(); i++) {
for (j = 1; j <= M.getCol(); j++)
cout << setw(3) << M(i,j) << " " ;
cout << endl << endl;
}
return output;
}



Matrix &Matrix::operator=(Matrix &B)
{
assert (getCol() == B.getCol() && getRow() == B.getRow());
int i = 1, j = 1;
for (i = 1; i <= getRow(); i++)
for (j = 1; j <= getCol(); j++)
ptr_col[j-1][i-1] = B(i,j);
return *this;
}
Matrix operator+(Matrix &A, Matrix &B)
{
assert(A.getCol() == B.getCol() && A.getRow() == B.getRow());
Matrix res(A.getRow(), A.getCol());
for(int i = 1; i <= A.getRow(); i++)
for(int j = 1; j <= A.getCol(); j++)
res(i,j) = A(i,j) + B(i,j);
return res;
}
[/syntax]

И тестовая программка

[syntax=cpp]#include "Matrix.h"

int main() {
Matrix A(3,4), C(3,4);
A(1,1) = 10;
A(2,3) = -3;
C(1,1) = 15;
Matrix B = A + C;
cout << B << endl;
return 0;
}
[/syntax]

В VisualStudio такой код работает, но когда я пытаюсь компилировать код с помошью g++ (под Linux), я получаю сообщение об ошибке:
main.cpp:12: error: no matching function for call to 'Matrix::Matrix(Matrix)'
Matrix.h:13: note: candidates are: Matrix::Matrix(Matrix&)
Matrix.h:12: note: Matrix::Matrix(int, int)
main.cpp:14: error: no match for 'operator<<' in 'std::cout << operator+(Matrix&, Matrix&)(((Matrix&)(& C)))'

Почему g++ не хочет использовать конструктор Matrix::Matrix(Matrix&)?
И почему VS допускает такой произвол?


08.09.2008 13:37
Профиль
Начинающий

Регистрация: 18.10.2008
Сообщения: 2

Репутация: 0 [ ? ]
Сообщение 


18.10.2008 20:29
Профиль
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 


Кто сейчас на конференции

Зарегистрированные пользователи: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
© 2013 «Форум программистов Украины»