使用C ++中的模板参数进行矩阵乘法

时间:2015-07-14 11:44:31

标签: c++ class templates c++11 matrix

我有一个自定义的Matrix类,想要重载运算符*来进行矩阵乘法运算:

template< int R, int C> 
class Matrix{
   int *_mat;
   int _size;
public:
   Matrix(){ _size = R*C; _mat = new int[_size]{0}; }
   ~Matrix(){ delete []_mat; }
   Matrix &operator=(const Matrix & m){/*...*/}
   //...
   template< int D2, int D1 > using matrix_t = int[D2][D1];
   template<int R2, int C2>
   Matrix<R,C2> operator*(const matrix_t<R2,C2> &mat)
   {
       Matrix<R,C2> result;
       for(int r = 0; r < R; r++)
       {
           for(int c = 0; c < C2; c++)
           {
               for( int i; i < C; i++ ){
                  /*do multiplication...
                    result._mat[r*C2+c] = ...
                  */
               }
           }
       }
       return result;
   }      
   //...
}; 

然后问题出现在Matrix<R,C2> resultresult成为类的外部对象。所以我无法使用像result._mat[r*C2+c]那样访问其私人会员。

在这个类中定义矩阵乘法函数的解决方案是什么(不改变访问权限)?

2 个答案:

答案 0 :(得分:1)

你不能,你可以写像set

这样的函数
void set(int index, int value)
{
   // check index
   _mat[index] = value;
}

然后在乘法函数中调用result.set(...)。而不是

result._mat[r*C2+c] = ...

result.set(r*C2+c, ...);

这种情况是因为ResultMatrix<R, C2>类型的对象,它与Matrix<R, C>的类型不同,因此您无法访问成员中Matrix<R, C2>类型的私有成员类型为Matrix<R, C>的函数。

答案 1 :(得分:1)

您可以指定一个运算符,以便外部设置矩阵的值。请注意,您将无法使用operator [] - 因为您只能将其与一个参数一起使用(参考C++ [] array operator with multiple arguments?

   int& operator() (int row, int col) { 
     // todo: check array bounds
     return _mat[C*row+col];
   }

用法:

 result(r,c) = ...