c++ - 为什么我的对象的属性是“无法读取内存”
问题描述
我正在开发一个用于矩阵对象和操作的 C++ 项目。为此,我设计了一个DoubleMatrix
具有三个属性的类:行数、列数和矩阵数据本身。我班级的头文件如下:
#ifndef DOUBLE_MATRIX_H
#define DOUBLE_MATRIX_H
#include <functional>
class DoubleMatrix final
{
double** mMatrixData;
int mRows;
int mColumns;
typedef std::function<void(int&, int&, double&)> matrixElem;
public:
DoubleMatrix(int rows, int cols);
~DoubleMatrix();
inline double& get(int& m, int& n) const ;
inline void set(int m, int n, double value) const;
DoubleMatrix transpose() const;
void print() const
void forEachRowNColumn(const std::function<void(int&, int&, double&)>& block) const;
};
#endif
我不确定是否double** mMatrixData
是保存矩阵数据的最佳选择,但我认为效果很好。
源文件如下所示:
#include "DoubleMatrix.h"
#include <iostream>
DoubleMatrix::DoubleMatrix(const int rows, const int cols)
{
mRows = rows;
mColumns = cols;
mMatrixData = new double*[mRows];
for (int i = 0; i < mRows; i++)
mMatrixData[i] = new double[mColumns];
for (int i = 0; i < mRows; i++)
for (int j = 0; j < mColumns; j++)
mMatrixData[i][j] = 0.0;
}
DoubleMatrix::~DoubleMatrix()
{
delete[] mMatrixData;
}
inline double& DoubleMatrix::get(int& m, int& n) const
{
return mMatrixData[m][n];
}
inline void DoubleMatrix::set(const int m, const int n, const double value) const
{
mMatrixData[m][n] = value;
}
DoubleMatrix DoubleMatrix::transpose() const
{
DoubleMatrix transpose = DoubleMatrix(this->mColumns, this->mRows);
forEachRowNColumn([&transpose](const int r, const int c, const double value)
{
transpose.set(c, r, value);
});
return transpose;
}
void DoubleMatrix::print() const
{
for (int i = 0; i < mRows; ++i)
{
for (int j = 0; j < mColumns; ++j)
{
std::cout << this->get(i, j) << "\t";
}
std::cout << std::endl;
}
std::cout << std::endl;
}
void DoubleMatrix::forEachRowNColumn(const matrixElem& block) const
{
int r = 0;
int c = 0;
while (r < mRows)
{
while (c < mColumns)
{
block(r, c, mMatrixData[r][c]);
c++;
}
r++;
c = 0;
}
}
在我的构造函数上,我double**
用零初始化。
但问题在于必须返回新DoubleMatrix
实例的方法,例如transpose()
. 当我为此方法返回分配一个变量时,数据是“无法读取内存”。像这样,例如:
#include <iostream>
#include "DoubleMatrix.h"
int main()
{
DoubleMatrix b = DoubleMatrix(2, 1);
b.set(0, 0, 1);
b.set(1, 0, 10);
std::cout << "\nMatrix B\n";
b.print();
std::cout << "\nMatrix B transposed\n";
DoubleMatrix c = b.transpose();
c.print(); // ERROR
std::cin.get();
return 0;
}
如果我单击 break 并尝试访问矩阵的数据,Locals 窗口会显示消息“”:
我也是根据这个问题做的,建议在哪里按值传递返回值,正是我正在做的transpose()
方法。
为什么这不起作用?
PS:我接受增强此代码的建议,这是我第一个使用 OO C++ 的项目,此代码是我的 kotlin 库GitHub 链接的 C++ 版本。
解决方案
推荐阅读
- python - InvalidArgumentError : indices[6,0] = 88140 is not in [0, 10000) [[node functional_5/embedding_4/embedding_lookup
- php - 将表值加载到弹出列表中,当前值正确显示
- android - 将上传的图片从用户图库传递到另一个活动,然后将图片上传到 Firebase
- authentication - Nuxt - 如何防止登录后重定向到主页
- python - 如何销毁使用 for 循环生成的按钮(单击后)
- visual-c++ - 具有多个条件的 if 语句无法使用 || 或 $$
- html - 个人资料卡 - 将图像放在我的 div 的底部中心
- python - 尝试将斐波那契项添加到文件名时获取不完整的数据
- rust - Rust 中 Bool 的打印值
- r - 在 .Rprofile 为什么不加载(“.RData”)工作,但它会在 .Rprofile 调用的 R 脚本中工作?