在C ++中传递Object by Reference错误

时间:2016-10-08 08:53:42

标签: c++ oop

我有一个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

4 个答案:

答案 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

我认为在这次更改后,您在此处复制的部分应该可以正常工作,因为您正在直接使用数组。

一些小建议:

  1. 如果可能,始终将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
  2. 这里otherMatrix是一个输入,resultMatrix是(可以)输出参数。

    1. 在C ++中有真正的void MatrixType::Add(const MatrixType& otherMatrix, MatrixType& resultMatrix); 类型。避免bool代码,只需使用bool isAddComp ... if (isAddComp != 0),这是C ++方式。

    2. 我会开始使用if (isAddComp)而不是常用数组,更灵活,非常有用,可以学习如何使用它。

    3. 我个人不会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