首页 > 解决方案 > 为什么返回一个对象会改变 C++ 中该对象的内容?

问题描述

我是 C++ 和 Stackoverflow 的新手,所以要温柔,但如果我的代码或帖子有问题,请告诉我。

这是我的问题:我正在尝试构建一个矩阵类,其中包含一个一维数组(值)和两个 int(维度)。问题出现在将矩阵相乘的方法中,更准确地说是当我尝试返回结果时:

生成的矩阵在乘法方法内具有正确的系数,但系数在方法之外神奇地变成了垃圾,主要是。

这是我的课:

class Matrice {

public:
    // attributes :
    double* values;
    unsigned dim1;
    unsigned dim2;

    // Methods :
    Matrice(double[], int, int);
    double getVal(int, int);
    void setVal(int, int, double);
    void printValues();
    double computeCoeff(int , int, Matrice);
    Matrice mult(Matrice B);
};

现在这里是乘法方法的代码:

Matrice Matrice::mult(Matrice B){
    int tabSize = dim1*(B.dim2);
    double matTab[tabSize];

    for(int i=0; i<dim1;i++){
        for(int j=0; j<B.dim2;j++){
                        
            matTab[i*B.dim2+j]=computeCoeff(i, j, B);
        }
    }
    Matrice C = Matrice(matTab, dim1, B.dim2);
    std::cout<<"before the return :"<<std::endl;
    C.printValues();
    return C;
}

现在我们进入有趣的部分。当我创建两个矩阵实例并将它们与以下代码相乘时:

int main(){

    double matA[12] = {1, 2, 3,
                    4, 5, 6, 
                    7, 8, 9,
                    10, 11, 12};
    Matrice A = Matrice(matA, 4, 3);

    double matB[6] = {1, 1,
                    1, 1,
                    1, 1};

    Matrice B = Matrice(matB, 3, 2);

    Matrice C = A.mult(B);

    std::cout<<"after the return :"<<std::endl;
    C.printValues();

    return 0;
}

我在控制台中收到以下文本:

before the return :
dim1 = 4
dim2 = 2
6 6
15 15
24 24
33 33
after the return :
dim1 = 4
dim2 = 2
1.81868e+231 1.73843e-310
1.96491e+231 1.81504e-307
1.30394e+231 1.81488e-307
1.85708e+231 1.82192e-307

正如您可能已经猜到的那样,第一个矩阵是具有良好系数的矩阵,而第二个矩阵中的系数是垃圾。看起来在返回时它复制了两个整数,但创建了一个新数组而没有将其值分配给任何东西,我真的不知道为什么。由于返回之前的矩阵是正确的,我假设其他方法都不是罪魁祸首。

当我在论坛上查看如何返回对象时,人们说可以使用花哨的指针来避免复制对象,但总的来说,返回对象是可以的。显然在大多数情况下,编译器甚至不需要实际复制对象,然后返回一个对象,真的没问题(或者是吗?)。

我真的很想了解它是如何工作的,所以欢迎任何帮助。

编辑 :

其他方法:

构造函数:

Matrice::Matrice(double givenValues[], int givenDim1, int givenDim2){
    values = givenValues;
    dim1 = givenDim1;
    dim2 = givenDim2;
}

getVal、setVal、computeCoeff 和 printValues 方法:

double Matrice::getVal(int i, int j){
    return values[i*dim2+j];
}

void Matrice::setVal(int i, int j, double val){
    values[i*dim2+j] = val;
}

double Matrice::computeCoeff(int i, int j, Matrice B){

    double coef=0;
    for(int k=0; k<dim2;k++){
        coef+=getVal(i, k)*B.getVal(k, j);
    }

    return coef;
}

void Matrice::printValues(){

    std::cout << "dim1 = "<<dim1<<std::endl;
    std::cout << "dim2 = "<<dim2<<std::endl;

    for(int i=0; i<dim1;i++){
        for(int j=0; j<dim2;j++){
            std::cout<<getVal(i, j)<< " ";

        }
        std::cout<<std::endl;
    }

}

标签: c++objectmethodsreturn

解决方案


推荐阅读