2015-01-11 136 views
0

我正在处理一个通用的矩阵类。 我重载+功能,这样,当是做:模板函数重载C++

  1. 矩阵=标量*矩阵
  2. 矩阵=矩阵*标量
  3. 矩阵=矩阵*矩阵

试图做它就像那样(函数重载): 这是一个正确的方法吗?

template<class T> 
class Matrix 
{ 
    std::vector< std::vector<T> > mat; 
    size_t rows , cols; 

public: 
    Matrix(){} 
    Matrix(const std::string){ } 
    Matrix(const size_t r, const size_t c, const std::vector<T> v){ } 
    Matrix(const Matrix& other); 

    Matrix<T> operator=(const Matrix<T> &other) { } 

    Matrix<T> operator+(const Matrix<T> &other) const{} 

    friend Matrix<T> operator*(const T &mat, const Matrix<T> &scalar) { } 

    friend Matrix<T> operator*(const Matrix<T> &mat, const T &scalar) { } 

    friend Matrix<T> operator*(const Matrix<T> &mat, const Matrix<T> &other) { } 

此外,我会很高兴知道,如果我的声明有一些问题。 感谢您的帮助。

+0

提醒:您需要在头文件中执行执行和声明 – Gabriel

+1

这将是很好的显示您的问题,而不是请求代码审查。 – Emadpres

+2

我怀疑你的赋值操作符应该返回'Matrix&'。另外,不知道为什么'std :: string'在那个alternate-ctor中是'const';尝试一个const引用。 – WhozCraig

回答

0

如果你想重载operator*允许

  1. 矩阵=标*矩阵
  2. 矩阵=矩阵*标
  3. 矩阵=矩阵*矩阵

您需要定义这些三个操作符重载作为矩阵类周围命名空间中的函数:

class Matrix { ... }; 
Matrix operator*(Scalar const& s, Matrix const& m) { ... } 
Matrix operator*(Matrix const& m, Scalar const& s) { ... } 
Matrix operator*(Matrix const& m1, Matrix const& m2) { ... } 

在你的情况,你声明的运算作为类,它不一样的,因为它实际上宣告自由功能使他们friendsfriend功能。这取决于实施是否friend实际上是必要的。如果不是的话,我会在课堂以外的地方将它们移到清晰的位置,但请记住,您需要使用template<typename T>。关于其他代码,没有任何明显的破坏,但它只是真实代码的摘录。

+0

我试过了,但是我怎么会知道前两个状态。 1.模板 矩阵矩阵 ::运算符*(常量矩阵&标量) 2.模板 矩阵矩阵 ::运算符*(常量T&标量) 这样? –

+0

我不知道你到底尝试了什么,但似乎在自由函数和成员函数之间存在一些混淆。我会尽力澄清我写的内容。 –

+0

通过说“朋友实际上是必要的”你怎么样?什么时候有必要? –

-2

看着这个问题,有一个替代的想法。

matrix = scalar * matrix 
matrix = matrix * scalar 
matrix = matrix * matrix 

另一种方法是使用函数对象并将其传递给矩阵类,使函数对象能够处理算法的细节......这允许您如果需要添加更多的后来。

运算符链在上面的代码中也很方便,因此,通过引用返回重载的运算符。

+0

在二进制操作中引用是指什么? – juanchopanza

+0

如果你打算做到这一点,我的意思是结果矩阵对象。 – basav