1

Matrixプログラムの「+」演算子をオーバーロードしようとしています。これが私のコードです、それは私には大丈夫に見えます。しかし、メイン関数に2つの行列を追加しても、何も起こりません。誰かが助けることができますか?ありがとう :)

ところで:

-プログラムは、Matricesに追加する必要がある時点まで、正常にコンパイルおよび実行されます。

-コードをadd(Mtrx、Mtrx)関数にコピーしてテストしましたが、どちらも機能しなかったため、operator +()-関数の実装に問題があると思います。

//Mtrx.h

#ifndef MTRX_H_
#define MTRX_H_
#include <iostream>
#include <string>

using namespace std;
using std::ostream;

class Mtrx {
    int lines,cols;
    float **p;
public:

    Mtrx();
    Mtrx(int,int);
    int getLines();
    int getCols();
    float getElement(int,int);
    void setLines(int);
    void setCols(int);
    void setElement(int,int,float);

    Mtrx operator+(Mtrx&);

        ~Mtrx();
};

ostream& operator<<(ostream& os, Mtrx& m);

#endif /* MTRX_H_ */

//Mtrx.cpp

//...
//...
Mtrx::~Mtrx(){
delete p;
p = NULL;
}

Mtrx Mtrx::operator+(Mtrx& m){
if(this->getLines() == m.getLines() && this->getCols() == m.getCols()){
    Mtrx res(getLines(),getCols());

    for (int i = 1; i <= this->getLines(); i++){
        for(int j = 1; j <= this->getCols(); j++){
            res.setElement(i,j,(this->getElement(i,j)+m.getElement(i,j)));
        }
    }

    return res;
}
4

2 に答える 2

3

デストラクタはありますが、コピー コンストラクタと代入演算子がありません。経験則として、それらのいずれかを持っている場合は、それらすべてを持っている必要があります。

Mtrx(const Mtrx&);
Mtrx& operator=(const Mtrx&);
~Mtrx();

明示的なコピー コンストラクターがなければ、コンパイラーが生成します。pただし、スマートではないため、行列をコピーするときに新しいメモリを割り当てることを知りません。ポインターをコピーするだけで、元の行列とコピーの両方が同じメモリを参照します。どちらもdelete p、デストラクタが実行されたときに呼び出されます。これは、2 番目の男にとっては悪いニュースです。

これはまさに、operator+返されresてコピーされるときに起こることです。

于 2013-02-26T02:10:13.600 に答える
1

中括弧を確認してください。いずれかが欠落しているか、if(false) の制御パスが返されていません。

Mtrx Mtrx::operator+(Mtrx& m){
if(this->getLines() == m.getLines() && this->getCols() == m.getCols()){
    Mtrx res(getLines(),getCols());

    for (int i = 1; i <= this->getLines(); i++){
        for(int j = 1; j <= this->getCols(); j++){
            res.setElement(i,j,(this->getElement(i,j)+m.getElement(i,j)));
        }
    }

    return res;
}
于 2013-02-26T02:14:05.097 に答える