我有一个自定义的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> result
。 result
成为类的外部对象。所以我无法使用像result._mat[r*C2+c]
那样访问其私人会员。
在这个类中定义矩阵乘法函数的解决方案是什么(不改变访问权限)?
答案 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, ...);
这种情况是因为Result
是Matrix<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) = ...