有人(谢谢)为我发布了一个矩阵类构造,以便我可以动态调整其大小。

我尝试对其进行增强,以便获得并设置各个值。

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);


缺点是您通过此运算符公开了类的内部结构,这破坏了封装原理。

09-11 19:05