我有一个MatrixType
头文件,其定义如下:
http://pastebin.com/DMzf1wGB
//Add Two Matrices and store result into another matrix
void Add(MatrixType otherMatrix, MatrixType& resultMatrix);
上述方法的实施如下:
void MatrixType::Add(MatrixType otherMatrix, MatrixType& resultMatrix)
{
cout << "Inside Add func!" << endl;
cout << "other matrix : " << endl;
otherMatrix.PrintMatrix();
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < numCols; j++) {
resultMatrix.values[i][j] = values[i][j] + otherMatrix.values[i][j];
}
cout << "\n";
resultMatrix.PrintMatrix();
cout << "\n";
}
}
PrintMatrix()
的定义:
void MatrixType::PrintMatrix()
{
//Pre: None
//Post: Matrix is printed row wise
for (int i = 0; i < numRows; i++) {
cout << "[ ";
for (int j = 0; j < numCols; j++) {
cout << values[i][j];
}
cout << "]";
cout << "\n";
}
现在我的 Main.cpp
我有MatrixType
这样的数组:MatrixType matrixStore[10]
来存储10个MatrixType对象。 Main.cpp的完整代码位于:http://pastebin.com/aj2eEGVS
int rows = matrixStore[index1].getRowSize();
int cols = matrixStore[index1].getColSize();
cout << "The two matrices can be added!" << endl;
cout << "Computing... " << endl;
//Create Result Matrix and a pointer variable to it
MatrixType pResultMatrix = MatrixType(rows, cols);
matrixStore[resultIndex] = pResultMatrix;
//Invoke Add function
matrixStore[index1].Add(matrixStore[index2], matrixStore[resultIndex]);
现在,当我在我的Add()函数中执行otherMatrix.PrintMatrix()
时,它会打印出调用Add()
函数的矩阵的值。并且由于这个=&gt;或者我没有引用调用方法的矩阵对象或作为参数传递的矩阵对象!
每当我添加值PrintMatrix()
后(在下一轮Switch Case中),我总是得到垃圾值。
对此有任何解决方案/解释吗?
TIA
答案 0 :(得分:0)
简而言之,matrixStore
存储对象值,而不是指针(如您所料)。
//Create Result Matrix and a pointer variable to it
MatrixType pResultMatrix = MatrixType(rows, cols);
matrixStore[resultIndex] = pResultMatrix;
似乎你希望存储指针变量,但它不是真的。 MatrixType
值存储在matrixStore
中。
结果是matrixStore
填写错误(链接中的代码):
MatrixType matrix = MatrixType(rows, cols);
matrixStore[index] = matrix;
cout << "Address of matrixStore[index] : " << &matrixStore[index] << endl;
cout << "Address of new matrix is : " << &matrix << endl;
int value;
for (int i = 0; i < rows; i++) {
cout << "Row " << i << " : ";
for (int j = 0; j < cols; j++) {
cin >> value;
matrix.StoreItem(value, i, j);
}
}
matrix
的所有更改都将丢失,因为matrixStore
包含matrix
对象的旧副本。
<强>解决方案:强>
matrixStore
保持指针的正确声明是:
MatrixType* matrixStore[10]
如果您希望使用MatrixType
值对象进行操作,则需要在对象进行修改时将对象复制到matrixStore
。
答案 1 :(得分:0)
主要问题不在于代码的这一部分,而是在矩阵创建/初始化期间。你在数组中存储对象可能是好的(特别是我喜欢它,因为它是在堆栈上创建的,速度要快得多,只是要注意不要创建太长的数组以避免堆栈溢出)但你必须考虑整体你的代码。
例如,在Main.cpp第38行中,将matrix
对象的内容复制到数组中,但之后修改{{1}对象与数组中的对象不同!这意味着数组中矩阵对象的内容具有一些随机值。你应该直接修改数组中的对象,拥有那个临时对象没有任何意义。
例如:
matrix
我认为在这次更改后,您在此处复制的部分应该可以正常工作,因为您正在直接使用数组。
一些小建议:
如果可能,始终将MatrixType对象作为参考传递。例如,在matrixStore[index] = MatrixType(rows, cols);
for (int i = 0; i < rows; i++)
{
std::cout << "Row " << i << " : ";
for (int j = 0; j < cols; j++)
{
std::cin >> value;
matrixStore[index].StoreItem(value, i, j);
}
}
函数中,thertherMatrix也可以是Add
,您的代码将非常高效,因为不会涉及对象副本。例如:
const ref
这里otherMatrix是一个输入,resultMatrix是(可以)输出参数。
在C ++中有真正的void MatrixType::Add(const MatrixType& otherMatrix, MatrixType& resultMatrix);
类型。避免bool
代码,只需使用bool isAddComp ... if (isAddComp != 0)
,这是C ++方式。
我会开始使用if (isAddComp)
而不是常用数组,更灵活,非常有用,可以学习如何使用它。
我个人不会std::vector
使用ùsing namespace
来阅读你的代码(但也许这只是我的代码风格)。
答案 2 :(得分:0)
查看此处的代码:http://pastebin.com/aj2eEGVS 这看起来是您在所有路径中创建局部矩阵的唯一原因,例如:
MatrixType matrix = MatrixType(rows, cols);
是为成员numRows和numCols赋值。我看到你有一个注释掉的SetSize方法。我认为你不想使用它,因为你认为创建后行和列不应该改变。
在这种情况下,你的matrixStore应该被创建为指针:
MatrixType* matrixStore[10];
现在而不是:
MatrixType matrix = MatrixType(rows, cols);
matrixStore[index] = matrix;
你这样做:
matrixStore[index] = new MatrixType(rows, cols);
只需使用:
matrixStore[index]->StoreItem(value, i, j);
或者你想用它做什么。
最后,您只需致电:
delete matrixStore[index];
对于所有使用“new”的矩阵。执行此操作的最佳方法是在开头将它们分配给nullptr。
MatrixType* matrixStore[10];
for ( unsigned int i = 0; i < 10; ++i )
{
matrixStore[i] = nullptr;
}
最后:
for ( unsigned int i = 0; i < 10; ++i )
{
if (nullptr != matrixStore[i])
{
delete matrixStore[i];
}
}
答案 3 :(得分:-1)
查看http://pastebin.com/aj2eEGVS
中的代码在我看来,你没有在matrixStore中初始化矩阵。您正在填充局部变量矩阵。
MatrixType matrix = MatrixType(rows, cols); // LOCAL VARIABLE
**matrixStore[index] = matrix;** // you are copying the uninitialized matrix
// ...
int value;
for (int i = 0; i < rows; i++) {
cout << "Row " << i << " : ";
for (int j = 0; j < cols; j++) {
cin >> value;
matrix.StoreItem(value, i, j); // LOCAL VARIABLE
}
}
cout << endl;
//Print matrix so the use can see
matrix.PrintMatrix(); // PRINT LOCAL VARIABLE