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

Форум программистов: 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 ] 


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

Зарегистрированные пользователи: нет зарегистрированных пользователей


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

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