有人(谢谢)为我发布了一个矩阵类构造,以便我可以动态调整其大小。
我尝试对其进行增强,以便获得并设置各个值。
class Matrix
{
public:
Matrix(std::size_t rows, std::size_t cols) : _matrix(rows, std::vector<float>(cols))
{
for (unsigned long r=0;r<rows+1;r++)
{
vector <float>nRow;
nRow.resize(cols+1);
for (unsigned long i=0;i<cols+1)
{
nRow[i]=0;//initialize to zero
}
_matrix.push_back(nRow);
}
}
// this is my own attempt to access the items:
float Value(unsigned long row,unsigned long col) : _matrix[row][col];
private:
std::vector<std::vector<float>> _matrix;
};
我以为我可以再访问以下单个项目:
Matrix m(100,100);
m[5,5]=15;
但是我猜想
float Value(unsigned long row,unsigned long col) : _matrix[row][col];
和
m[5,5]=15;
错了。他们不会编译各种错误。
最佳答案
在此代码:
float Value(unsigned long row,unsigned long col) : _matrix[row][col];
这不是有效的c ++声明。初始化列表仅对构造函数有效,但事实并非如此。
另外,您不能使用这种对象构造调用:
m[5,5]
。方括号运算符必须只有一个参数。为了解决您的问题,建议您使用运算符重载
operator()
。它可以具有任意数量的参数,因此,用以下命令替换您以前的函数:float& operator()(unsigned long row, unsigned long col)
{
return _matrix[row][col];
}
现在,您可以像这样拨打电话:
m(5, 5) = 15;
b = m(5,5);
缺点是您通过此运算符公开了类的内部结构,这破坏了封装原理。