2012-04-24 4 views
2

У меня есть матрица:Перегрузка оператор * для матрицы класса

#ifndef MATRIX_H 
#define MATRIX_H 

class Matrix 
{ 
    public: 
     Matrix(int rows, int columns); 
     Matrix(int, int, int** matrix); 
     Matrix(Matrix* copy); 
     ~Matrix(); 

     void Set(int, int, int); 
     void SetMatrix(int, int, int** matrix);    
     void Print(); 
     void ZeroMatrix(int,int,int** matrix);  
     void Add(Matrix* B); 
     void Subtract(Matrix* B); 
     void Copy(Matrix* B); 

     int** Multiply(Matrix* B); 
     int** Create(int,int); 
     int** Get(); 
     int** Transpose(); 
     int** Scalar(int); 

     int Get(int,int); 
     int Rows(); 
     int Columns(); 

     Matrix operator*(int); 

    private: 
     int** _matrix; 
     int _rows; 
     int _columns; 
}; 

#endif 

Вот реализация:

Matrix Matrix::operator*(int scale) 
{ 
    return Matrix(_rows, _columns, Scalar(scale)); 
} 

А для школьного задания мы должны перегрузить несколько оператору работать с целыми числами , Проблема в том, я получаю эту ошибку:

main.cpp: В функции 'Int основной (междунар, символ * )': main.cpp: 18: 15: ошибка: не подходит для 'оператора' в '4 * B'

Ломать код:

#include "Matrix.h" 
#include <fstream> 
#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    Matrix* A = new Matrix(4,2); 

    A->Set(0,0,1); 
    A->Set(0,1,2); 
    A->Set(1,0,3); 
    A->Set(1,1,4); 
    A->Print(); 

    Matrix B(A); 
    B.Print(); 

    Matrix C(4 * B); //this line 
    C.Print(); 


    delete A; 

    return 0; 
} 

Любые идеи?

редактировать # 1:

код:

Matrix operator*(int); 
     Matrix operator* (int, const Matrix &); 

генерирует:

In file included from main.cpp:1:0: 
Matrix.h:31:40: error: ‘Matrix Matrix::operator*(int, const Matrix&)’ must take either zero or one argument 
In file included from matrix.cpp:1:0: 
Matrix.h:31:40: error: ‘Matrix Matrix::operator*(int, const Matrix&)’ must take either zero or one argument 
matrix.cpp:207:50: error: ‘Matrix Matrix::operator*(int, const Matrix&)’ must take either zero or one argument 
+0

Кстати, вам не нужно или '' fstream' или iostream' в главном файле, как ничто из либо фактически используется в основной , Лучше всего включить то, что вам нужно для каждого файла. – chris

+3

домашняя работа должна иметь домашнее задание – Jasper

+0

спасибо, не знали этого. –

ответ

4

При указании вашей функции-члена, ваш класс должен быть левая рука.

B * 4 эквивалентен B.operator* (4). Когда вы говорите 4 * B, это не сработает.

Чтобы исправить это, просто использовать B * 4 вместо 4 * B, или обеспечить внешнюю перегрузку

Matrix operator* (int, const Matrix &); 

Затем 4 * B будет соответствовать этой перегрузки.

+0

Это работает сейчас, но как я могу это исправить? –

+0

Я пробовал это и получал ошибки, обновлял сообщение –

+0

, вы делаете 'Matrix Matrix :: operator *', в то время как вы должны (как указано выше) делать 'Matrix operator *' (таким образом, определить его вне класса (или извне, в словах Криса)) – Jasper

2

Это будет работать в любом направлении ...

#include <iostream> 

class Matrix 
{ 
public: 
    Matrix(int x) // This works as a convert constructor 
    : _x(x) { } // if you don't use the explicit keyword 

    friend Matrix operator*(const Matrix& left, const Matrix& right); 

    int _x; 
}; 

Matrix operator*(const Matrix& left, const Matrix& right) 
{ 
    return Matrix(left._x * right._x); 
} 

int main() 
{ 
    Matrix m(3); 
    int a = 4; 

    Matrix m1(m * a); 
    Matrix m2(a * m); 

    std::cout << m._x << endl // 3 
      << a  << endl // 4 
      << m1._x << endl // 12 
      << m2._x << endl; // 12 
} 
Смежные вопросы