以下代码包含一个 Matrix 类的简单示例,使用“代理”Row 类启用双索引 [][]。
#include <valarray>
#include <iostream>
template <typename T>
class Matrix {
private:
// Data members
int nRows_;
int nColumns_;
std::valarray<T> data_;
public:
// Constructor
Matrix(const int nRows,
const int nColumns)
: nRows_{nRows},
nColumns_{nColumns},
data_{std::valarray<T>(nRows*nColumns)} {}
// Row friend class to enable double indexing
class Row {
friend class Matrix;
private:
// Constructor
Row(Matrix& parent,
int row)
: parent_{parent},
row_{row} {}
// Data members
Matrix& parent_;
int row_;
public:
// Index columns
T& operator[](int column) {
int nColumns{parent_.nColumns_};
int element{row_*nColumns + column};
return parent_.data_[element];
}
};
// Index rows
Row operator[](int row) {
return Row(*this, row);
}
};
但是,这不允许对 const 矩阵进行双重索引。例如,当包含最后一行时,下面的代码无法编译。
int main() {
Matrix<int> a{3,3};
const Matrix<int> b{3,3};
std::cout << a[1][2];
std::cout << b[1][2];
}
所以问题是,如何修改我的 Matrix 类以允许对 const Matrix 对象进行双重索引?
最佳答案
由于 b
是一个 const
矩阵,您需要添加索引运算符的 const
版本。
Row operator[](int row) const { ... }
这将需要对 Row
类(或第二个代理类)进行额外更改,以处理 const Matrix &
和 const
重载运算符[]
。
关于c++ - 在 Matrix 类中使用 [][] 进行常量双索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49822848/