0

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

我试图增强它,以便我可以获取和设置个人值。

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;

错了。它们编译时不会出现各种错误。

4

2 回答 2

1

您没有重载[]运算符(我不建议这样做)。您应该通过该功能访问Value()。所以:

m.Value(5,5);

还,

float Value(unsigned long row,unsigned long col) : _matrix[row][col];

不是我所知道的函数或函数简写。它应该是:

float Value(unsigned long row,unsigned long col)
{ 
   return _matrix[row][col]
}
于 2013-10-18T17:42:48.280 回答
1

在这段代码中:

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

缺点是你通过这个操作符暴露了你的类的内部,这打破了封装原则。

于 2013-10-18T18:04:01.310 回答