【发布时间】:2012-11-19 23:38:26
【问题描述】:
对 C++ 要求在二维数组中传递维度的烦恼让我开始研究模板化的 Matrix 类。我已经用 C# 编码了一段时间,所以我确定我在这里有点生疏了。
问题是,当我遇到试图删除二维数组的析构函数时,我得到了一个堆异常。
感激地接受任何帮助!
template <typename T>
class Matrix {
public:
Matrix(int m, int n) : nRows(m), nCols(n) {
pMatrix = new T * [nRows];
for (int i = 0; i < nCols; i++) {
pMatrix[i] = new T[nCols];
}
}
~Matrix() {
if (pMatrix != NULL) {
for (int i = 0; i < nRows; i++) { delete[] pMatrix[i]; }
delete[] pMatrix;
}
}
T ** GetMatrix() const { return pMatrix; }
T * Row(int i) const { return pMatrix[i]; }
inline T Cell(int row, int col) const { return pMatrix[row][col]; }
inline int GetNRows() const { return nRows; }
inline int GetNCols() const { return nCols; }
private:
int nRows, nCols;
T ** pMatrix;
};
【问题讨论】:
-
为什么需要返回
T**和T*?对我来说,这似乎暴露了内部实现细节。您可以通过使用单个std::vector并使用索引进行访问来简化代码。 -
完全同意胡安。通过使用
std::vector<>和简单的i*cols+j来获取[i][j]元素,您可以显着地 简化此操作。您唯一会缺少的是执行双括号取消引用的能力,甚至可以使用返回行迭代器的创造性子类来征服。 -
同意,并查看与这些类似的更优雅解决方案的答案。
标签: c++ templates destructor