【发布时间】:2018-04-13 18:06:52
【问题描述】:
以下代码包含一个简单的 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 对象进行双重索引?
【问题讨论】:
标签: c++ c++11 matrix operator-overloading