2015-10-03 35 views
0

我有一个名为Matrix的类,其中包含一个存储为动态的字段。而一种名为Multiply()的方法必须返回乘以2矩阵的结果。问题是我定义了一个析构函数,当我返回时,存储结果矩阵的变量会得到一些随机值,我猜这是因为新变量具有与临时矩阵相同的地址。我怎样才能正确地返回它?从函数返回,具有动态字段的对象C++

class Matrix{ 
    double **val; 
    int rows,cols,errorCode; 
public: 
    Matrix(); 
    Matrix(int); 
    Matrix(int, int); 
    ~Matrix(); 
    void Print(); 
    void Read(); 
    void Realoc(int, int); 
    void Assign(int,int,double); 
    Matrix Multiply(Matrix&); 
    void Multiply(double); 
}; 

Matrix Matrix::Multiply(Matrix &a){ 
    if(cols != a.rows){ 
     Matrix b; 
     b.errorCode=112; //That means matrices are not compatible; 
     cout<<"WARNING! Error "<<errorCode<<" has occurred. "<<endl; 
     return b; 
    } 
    else{ 
      //Making a new matrix where we save computed values; 
     Matrix b; 
     b.Realoc(rows,a.cols); 


      //Computing values; 
     double p; 
     for(int i=0;i<rows;i++){ 
      for(int j=0;j<a.cols;j++){ 
       p=0; 
       for(int k=0;k<cols;k++){p += val[i][k]*a.val[k][j];} 
       b.Assign(i+1,j+1,p); 
      } 
     } 
     return b; 
    } 
} 

int main(){ 



Matrix a,b(2,2); 
b.Assign(1,1,0); 
b.Assign(1,2,3); 
b.Assign(2,1,5); 
b.Assign(2,2,5); 
b.Print(); 

a.Read(); 
cout<<endl; 
cout<<"'a' multiplied by 'b' is: "<<endl; 
Matrix m; 
m = a.Multiply(b); 
m.Print(); 
cout<<endl; 
return 0; 
} 

有些想法?

P.S.我做了复制构造函数,但它没有得到任何好的结果。

这是我制作的复制构造函数。

Matrix::Matrix(Matrix &a){ 
    rows = a.rows; 
    cols = a.cols; 
    errorCode = 0; 
    val = new double*[rows]; 
    for(int i = 0;i<rows;i++){ 
     val[i] = new double[cols]; 
    } 
    for(int i=0;i<rows;i++){ 
     for(int j=0;j<cols;j++){ 
      val[i][j] = a.val[i][j]; 
     } 
    } 
} 

和析构函数:

Matrix::~Matrix(){ 
    for(int i=0;i<rows;i++){ 
     delete[] val[i]; 
    } 
    delete[] val; 
} 
+1

而不是使用'double ** val;'使用['std :: vector >'](http://en.cppreference.com/w/cpp/container/vector)。这种方式默认的复制ctor和赋值运算符将为您工作。 – NathanOliver

+0

我们需要看到你的析构函数,但我认为你的问题可能通过实现一个复制构造函数来解决(并且移动构造函数在你的情况下也是有用的)。顺便说一句,除非这是为了学习C++,否则我会强烈建议使用现有的线性代数库而不是使用自己的容器。 – Sheljohn

+0

这是使用**的一个条件。是的,这是为了学习:) –

回答

0

此:

m = a.Multiply(b); 

呼唤构建的赋值运算符,而不是拷贝构造函数m已经被默认。默认的赋值运算符不够好,因为您正在处理动态内存分配。您将需要实施您自己的分配操作员。我建议你看看What is The Rule of Three?

我也建议你只使用像std::vector<std::vector<double>>一样的2d std::vector,因为编译器提供的默认值可以为你工作。正如你所说,这是一个需要使用double**,你将需要自己实现构造函数和赋值操作符。